- 收藏
- 点赞
- 分享
- 举报
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
-
02018-07-23 08:49:20
-
22020-03-17 11:56:06
-
2012-12-04 13:21:40
-
2008-08-24 12:44:37
-
02019-03-22 09:52:53
-
22020-02-19 11:30:44
-
22019-05-24 18:19:17
-
2020-11-15 17:56:10
-
42018-09-25 12:19:17
-
2021-11-28 15:02:25
-
2017-07-14 20:57:07
-
2020-05-18 10:09:36
-
2018-09-01 11:11:36
-
62015-11-18 15:51:59
-
10T32crop和fcrop怎么从中间裁剪?
-
53516卡死问题
-
10hi3516cv610 去除风扇声音,人说话声音正常输出不变声
-
5hi3516cv610适配imx662的wdr模式出图图像不正常怎么去解决
-
5ss928 [sample_comm_venc_get_venc_stream_proc]-2627: get venc stream time out, exit thread
-
10要一份RK3576最新硬件资料包
-
5海思DPU的查找表怎么获取
-
10海思Hi3519DV500 自动对焦算法求助
-
10鸿欧派 Hi3519Dv500
-
10【求助】RK3576实现推流和GC2053摄像头颜色偏绿
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明

微信扫码分享
QQ好友