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 拉高,建立好时间,然后拉低,数据则被读入。(关于如何被发出以及如何被读入则是芯片做的事,我们不用管,只需记住SCL 拉低,数据发出/读入) 用程序来讲就是: send(uchar c) //发送一个字节 { uint i; for(i=0;i<8;i++) //该字节8 位从高往低发送 { if((c<