I2C总线如何直接搭载企业数据总线写企业数据总线读企业数据总线

没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!I2C总线简介(很经典)_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
I2C总线简介(很经典)
&&这是我见过最好的I2C总线的简介
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩9页未读,
定制HR最喜欢的简历
你可能喜欢I2C总线的通信过程(见图4-8)主要包含三个主要阶段:起始阶段、数据传输阶段和终止阶段。
1. 起始阶段
在I2C总线不工作的情况下,SDA(数据线)和SCL(时钟线)上的信号均为高电平。如果此时主机需要发起新的通信请求,那么需要首先通过SDA和SCL发出起始标志。当SCL为高电平时,SDA电平从高变低,这一变化表示完成了通信的起始条件。
在起始条件和数据通信之间,通常会有延时要求,具体的指标会在设备厂商的规格说明书中给出。
2. 数据传输阶段
I2C总线的数据通信是以字节(8位)作为基本单位在SDA上进行串行传输的。一个字节的传输需要9个时钟周期。其中,字节中每一位的传输都需要一个时钟周期,当新的SCL到来时,SCL为低电平,此时数据发送方根据当前传输的数据位控制SDA的电平信号。如果传输的数据位为"1",就将SDA电平拉高;如果传输的数据位为"0",就将SDA的电平拉低。当SDA上的数据准备好之后,SCL由低变高,此时数据接收方将会在下一次SCL信号变低之前完成数据的接收。当8位数据发送完成后,数据接收方需要一个时钟周期以使用SDA发送ACK信号,表明数据是否接收成功。当ACK信号为"0"时,说明接收成功;为"1"时,说明接收失败。每个字节的传输都是由高位(MSB)到低位(LSB)依次进行传输。
I2C总线协议中规定,数据通信的第一个字节必须由主机发出,内容为此次通信的目标设备地址和数据通信的方向(读/写)。在这个字节中,第1~7位为目标设备地址,第0位为通信方向,当第0位为"1"时表示读,即后续的数据由目标设备发出主机进行接收;当第0位为"0"时表示写,即后续的数据由主机发出目标设备进行接收。在数据通信过程中,总是由数据接收方发出ACK信号。
3. 终止阶段
当主机完成数据通信,并终止本次传输时会发出终止信号。当SCL 是高电平时,SDA电平由低变高,这个变化意味着传输终止。
下面给出了模拟I2C总线进行读写的伪代码,用以说明如何使用GPIO实现I2C通信:
#define SDA 254
//定义SDA所对应的GPIO接口编号
#define SCL 255
//定义SCL所对应的GPIO接口编号
#define OUTP 1
//表示GPIO接口方向为输出
#define INP 0
//表示GPIO接口方向为输入
/* I2C起始条件 */
int i2c_start()
//初始化GPIO口
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
set_gpio_direction (SCL, OUTP);
//设置SCL方向为输出
set_gpio_value(SDA, 1);
//设置SDA为高电平
set_gpio_value(SCL, 1);
//设置SCL为高电平
//起始条件
set_gpio_value(SDA, 0);
//SCL为高电平时,SDA由高变低
/* I2C终止条件 */
void i2c_stop()
set_gpio_value(SCL, 1);
set_gpio_direction(SDA, OUTP);
set_gpio_value(SDA, 0);
set_gpio_value(SDA, 1);
//SCL高电平时,SDA由低变高
I2C读取ACK信号(写数据时使用)
返回值 :0表示ACK信号有效;非0表示ACK信号无效
unsigned char i2c_read_ack()
unsigned char
set_gpio_direction(SDA, INP);
//设置SDA方向为输入
set_gpio_value(SCL,0);
// SCL变低
r = get_gpio_value(SDA);
//读取ACK信号
set_gpio_value(SCL,1);
// SCL变高
/* I2C发出ACK信号(读数据时使用) */
int i2c_send_ack()
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
set_gpio_value(SCL,0);
// SCL变低
set_gpio_value(SDA, 0);
//发出ACK信号
set_gpio_value(SCL,1);
// SCL变高
/* I2C字节写 */
void i2c_write_byte(unsigned char b)
set_gpio_direction(SDA, OUTP);
//设置SDA方向为输出
for (i=7; i&=0; i--) {
set_gpio_value(SCL, 0);
// SCL变低
set_gpio_value(SDA, b & (1&&i));
//从高位到低位依次准备数据进行发送
set_gpio_value(SCL, 1);
// SCL变高
i2c_read_ack();
//检查目标设备的ACK信号
/* I2C字节读 */
unsigned char i2c_read_byte()
unsigned char r = 0;
set_gpio_direction(SDA, INP);
//设置SDA方向为输入
for (i=7; i&=0; i--) {
set_gpio_value(SCL, 0);
// SCL变低
r = (r &&1) | get_gpio_value(SDA);
//从高位到低位依次准备数据进行读取
set_gpio_value(SCL, 1);
// SCL变高
i2c_send_ack();
//向目标设备发送ACK信号
addr:目标设备地址
buf:读缓冲区
len:读入字节的长度
void i2c_read(unsigned char addr, unsigned char* buf, int len)
unsigned char
i2c_start();
//起始条件,开始数据通信
//发送地址和数据读写方向
t = (addr && 1) | 1;
//低位为1,表示读数据
i2c_write_byte(t);
//读入数据
for (i=0; i& i++)
buf[i] = i2c_read_byte();
i2c_stop();
//终止条件,结束数据通信
addr:目标设备地址
buf:写缓冲区
len:写入字节的长度
void i2c_write (unsigned char addr, unsigned char* buf, int len)
unsigned char
i2c_start();
//起始条件,开始数据通信
//发送地址和数据读写方向
t = (addr && 1) | 0;
//低位为0,表示写数据
i2c_write_byte(t);
//写入数据
for (i=0; i& i++)
i2c_write_byte(buf[i]);
i2c_stop();
//终止条件,结束数据通信
阅读(...) 评论() &I2C读写流程_百度文库
赠送免券下载特权
10W篇文档免费专享
部分付费文档8折起
每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
I2C读写流程
&&调试广电集中器心得
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
你可能喜欢我的I2C可以写数据但是读数据还是没有实现_百度知道
我的I2C可以写数据但是读数据还是没有实现
我有更好的答案
既然读数据没有实现就不好判断写数据是成功的,还是要多在时序上找问题
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 数据总线 的文章

 

随机推荐