1.I2C总线简介:
I2C总线是一种两线串行总线,它提供了一个小型网络系统,该系统为总线上的电路共享公共总线。 总线上的设备包括单片机、液晶驱动器、上层设备等。 自从提出I2C总线规范以来,I2C设备得到了广泛的应用。 I2C器件的应用大大减少了电路之间的布线,减小了电路板的尺寸,降低了硬件成本,提高了系统的可靠性。
2.I2C规范:
I2C总线规范可以参考相关资料,本文仅给出硬件操作的基本概念。
2.1. I2C总线术语解释:
发送器:向总线发送数据的设备
接收器:从总线接收数据的设备
主设备:发起数据传输并产生时钟信号的设备
从设备:由主设备寻址的设备
2.2. I2C总线时序定义:
起始位:当SCL=1时,SDA上有一个下降延迟
停止位:当SCL=1时,SDA上有上升沿延迟
*主设备向从设备发送停止信号,作用是使从设备处于就绪状态(或已知状态)
从机响应:SDA=0
*写入数据时,响应设备在第9个时钟周期将SDA线拉低,表示已接收到8位数据,可以继续接收。 主机向从机写入一个字节后,接收从机响应,然后进行后续操作(一般不考虑从机响应位的具体值,仅用于判断从机设备是否完成其操作)响应检测期间的内部写周期)
主站响应:SDA=0(使用)
* 读取数据时,主机每收到从机发送的一个字节数据(不是最后一个),就会返回主机响应ACK(SDA=0)。
到最后一个字节(SDA=1)时返回,无响应
当从机工作在读模式时,向主机发送一个8位数据后,释放SDA线并监听响应信号,一旦收到主机的响应信号,从机就继续发送数据; 如果主设备没有发送响应信号,从机停止传输数据并等待停止信号,则主设备必须向从机发送停止信号,使其进入待机电源模式,并将设备置于待机状态。已知状态
响应检测:使用响应检测读命令测试从机是否结束(通过从机响应来识别)
*当从设备完成内部写周期后,会向主设备发送响应信号(从设备响应),以便下一次读操作可以继续
3.I2C设备C51读写程序
3.1. 数据定义说明:
sbit sda=P0^0; //I2C设备SDA数据线
sbit scl=P0^1; //I2C设备SCL时钟线
# nops() {_nop_();_nop_();_nop_();_nop_();_nop_();} //nop指令号定义
乌查尔; //设备从机地址
乌查尔; //设备子地址
乌查*; //发送/接收数据缓冲区
乌查尔; //发送/接收数据的数量
注意:您可以在您的应用程序中修改上述值以适应您的演示设计
3.2. 子函数说明:(私有函数,不可调用)
void (void) //发送起始位
void (void) //发送停止位
void (bit ) //主要响应
说明:=1:ack主响应; =0:无响应
void (uchar c) //发送单个字节
uchar(void) //接收单个字节
注意:该函数需要与主响应一起使用
3.3. 模块功能说明:(I2C外部接口函数,可由应用程序调用)
void (uchar ,uchar c) //发送单字节数据到设备,不带子地址
无效(uchar,uchar,uchar *buf,uchar num)
//发送多字节数据到带有子地址的设备
void (uchar ,uchar *buf) // 从不带子地址的设备读取单字节数据
无效(uchar,uchar,uchar *buf,uchar num)
//从子寻址设备读取多个字节的数据