I2C 通信协议简介(2013-01-17 10:48:03) 转载▼标签: 杂谈分类: 通讯协议 ACK 是acknowledge 的意思,确认. 摒弃复杂的情况,这里只对 I2C 做简单的介绍。一、 I2C 总线的一些特征: ?只要求两条总线线路一条串行数据线 SDA 一条串行时钟线 SCL ?每个连接到总线的器件都可以通过唯一的地址和一直存在的简单的主机从机关系软件设定地址主机可以作为主机发送器或主机接收器?它是一个真正的多主机总线如果两个或更多主机同时初始化数据传输可以通过冲突检测和仲裁防止数据被破坏?串行的 8 位双向数据传输位速率在标准模式下可达 100kbit/s 快速模式下可达 400kbit/s 高速模式下可达 ?片上的滤波器可以滤去总线数据线上的毛刺波保证数据完整?连接到相同总线的 IC 数量只受到总线的最大电容 400pF 限制二、 I2C 总线在传送数据过程中共有三种类型信号:开始信号、结束信号和应答信号。开始信号: SCL 为高电平时, SDA 由高电平向低电平跳变,开始传送数据。结束信号: SCL 为高电平时, SDA 由低电平向高电平跳变,结束传送数据。应答信号: 接收数据的 IC 在接收到 8bit 数据后, 向发送数据的 IC 发出特定的低电平脉冲,表示已收到数据起始和结束: bool I2C_Start(void) { SDA_H; SCL_H; I2C_delay(); if(!SDA_read)return FALSE; // SDA 线为低电平则总线忙, 退出 SDA_L; //拉低 SDA线(当 SCL 为高电平时, SDA 由高电平向低电平跳变表示开始信号) I2C_delay(); if(SDA_read) return FALSE; // SDA 线为高电平则总线出错, 退出 SDA_L; // 数据为准备好时,拉低 SCL 线 I2C_delay(); return TRUE; } 发出开始信号之后,设备在数据未准备好时,拉低 SCL 线,这样主设备可知从设备未发送数据, 从设备在数据准备好, 可以发送的时候,停止拉低 SCL 线,这时候才开始真正的数据传输 void I2C_Stop(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; // SCL 为高电平时, SDA 由低电平向高电平跳变, 结束传送数据 I2C_delay(); SDA_H; I2C_delay(); } STOP 在单主环境下非必要, 但在多主环境就非常必要, 主控总线的设备发送 STOP 后,通知总线其他设备总线已经闲置. void I2C_Ack(void) { SCL_L; I2C_delay(); SDA_L; I2C_delay(); SCL_H; I2C_delay(); SCL_L; I2C_delay(); } 当主机作为接收设备时, 主机对最后一个字节不应答, 以向发送设备( 从设备) 标识数据传送结束。这是因为每次传输都应得到应答信号后再进行下一个字节传送。如果此时接收机应答了, 那它就接收的不是最后一个字节了。如果是最后一个字节,第9 个时钟周期发送的是非应答信号( 此时发送的不是应答信号就是非应答信号), 最后发送停止信号。
i2c通讯协议和程序 来自淘豆网m.daumloan.com转载请标明出处.