- 收藏
- 点赞
- 分享
- 举报
I2C总线万能程序(C语言)
"reg51.h"
include "intrins.h"
unsigned char SystemError; sbit SCL= P1^6; //定义串行时钟线所在口 使用时根据自己的需要来定义 sbit SDA= P1^7; //定义串行数据线所在口 使用时根据自己的?枰?炊ㄒ?
define SomeNOP(); {nop();nop();nop();nop();}
/-------------------------------------------------------------------------------- 调用方式:void AD7416_I2CStart(void) 2003/05/04 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------/
void I2CStart(void) { EA=0; SDA=1; SCL=1; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始 SDA=0; SomeNOP(); SCL=0; } /-------------------------------------------------------------------------------- 调用方式:void AD7416_I2CStop(void) 2003/05/04 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------/ void I2CStop(void) { SCL=0; SDA=0; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止 SCL=1; SomeNOP(); SDA=1; EA=1; } /-------------------------------------------------------------------------------- 调用方式:I2CAck(void) 2003/05/13 函数说明:私有函数,I2C专用,等待从器件接收方的应答 ACK BY AD7416 ---------------------------------------------------------------------------------/ WaitAck(void) { unsigned char errtime=255;//因故障接收方无ACK,超时值为255。 SDA=1; SCL=1; SystemError=0x10; while(SDA) { errtime--; if(!errtime) { AD7416_I2CStop(); AD7416_SystemError=0x11; //出错后给全局变量赋值 return; } } SCL=0; } /-------------------------------------------------------------------------------- 调用方式:void SendAck(void) ﹫2003/05/13 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。 ---------------------------------------------------------------------------------/ void SendAck(void) { SDA=0; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号 SCL=1; SomeNOP(); SCL=0; } /-------------------------------------------------------------------------------- 调用方式:void SendAck(void) ﹫2003/05/13 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。 --------------------------------------------------------------------------------/ void SendNotAck(void) { SDA=1; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答 SCL=1; SomeNOP(); SCL=0; } /-------------------------------------------------------------------------------- 调用方式:void I2CSend(uchar ch) 2003/05/13 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------/ void I2CSendByte(Byte ch) { unsigned char i=8; while (i--) { SCL=0;nop(); SDA=(bit)(ch&0x80); ch<<=1; SomeNOP(); //时钟保持低可以发送数据 SCL=1; SomeNOP(); } SCL=0; } /-------------------------------------------------------------------------------- 调用方式:uchar I2CReceive(void) 2003/05/13 函数说明:私有函数,I2C专用 ---------------------------------------------------------------------------------/ Byte I2CReceiveByte(void) { unsigned char i=8,data=0; SDA=1; while (i--) { data<<=1; SCL=0;SomeNOP(); SCL=1;SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据 data|=SDA; } SCL=0; return data; }
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片
-
2019-01-18 09:16:56
-
2013-04-26 14:19:40
-
02008-11-24 10:13:32
-
2025-08-20 10:31:03
-
42019-12-20 09:46:51
-
22020-03-17 11:56:06
-
02018-07-23 08:49:20
-
2008-08-24 12:44:37
-
2012-12-04 13:21:40
-
22019-05-24 18:19:17
-
02019-03-22 09:52:53
-
22020-02-19 11:30:44
-
2020-11-15 17:56:10
-
42018-09-25 12:19:17
-
2017-07-14 20:57:07
-
2018-09-01 11:11:36
-
62015-11-18 15:51:59
-
2021-11-28 15:02:25
-
2020-05-18 10:09:36
-
10svp nnn目标检测不全
-
10hi35169dv500平台使用http协议推拉流UVC摄像头,帧率问题
-
10hi3516cv610关于YOLO优化和调优问题
-
10hi_mpi_vpss_get_chn_frame err:0xa0078016报错
-
5gk7205v200(hisi3516ev200)如何接入b656?
-
30pipe管道创建失败
-
10atc转换模型失败
-
20拍摄静止画面显示正常,拍摄运动的画面出现马赛克显示
-
100hi3516cv610 通过易百纳官方SDK中编译出的uboot env kernel,移植到自己的工程中,MPP初始化时出现内核拷贝数据到用户端时出现错误导致内核进入pain模式进而时内核重启
-
5hisi3519 gs2972 bt1120 转sdi 无法正常显示问题
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友