I2C 通信原理 一、 I2C 的时序是比较复杂的,你如果能把 I2C 的时序弄清,那其他器件的时序都不成问题了
我就按照我的理解来跟你讲吧
直接用程序来说明吧
NOP(),一个机器周期时间的延迟,12M 晶振时为 1 微秒 NOPS(),4 个 NOP()
sbit SDA P2^0; sbit SCL P2^1; 定义数据线和时钟线接口 首先,I2C 有 2 个重要的线,SDA 数据线 SCL 时钟线,当总线上没有进行信息传送时,SDA和 SCL 都为高电平,我们称之为释放总线
开始传送信息时,要有一个开始信号, 开始信号 :定义为在 SCL 为高电平的时候,SDA 从高电平拉低
start() { SDA=1; NOP(); //同你图中 SDA/SCL 上升/下降所用时间 1US SCL=1; NOPS(); //建立开始信号(同你图中 TSU 起始信号建立时间一样 4US) SDA=0; //SDA 拉低 NOPS(); SCL=0; //SCL 拉低, 钳住总线,准备发送或接收数据 NOP(); } 结束信号:与开始信号相反,在 SCL 为高电平时,SDA 从低拉高 stop() { SDA=0; NOP(); SCL=1; NOPS(); //建立信号时间 SDA=1; //拉高 结束
NOPS(); } 我晕,发现写了半天还有好多
算了 帮人帮到底了 发送/接收一个数据:数据的发送和接收都是在 SCL 为低电平的时候发生,因为 SCL 为高电平时已给了开始和结束信号
发送数据时,当数据准备读入时,将 SCL 线暂时拉高(SCL为高时,SDA 无法改变状态),保持一段时间然后拉低(同你图中的 TDH,数据输出保持时间),这时数据则发送完毕到 SDA 上
接收则与之大同小异
当 SDA 线上有数据过来时,先将 SCL 拉高,建立好时间,然后拉低,