分析C2000中用I2C 通讯协议与GPIO模拟
[复制链接]
I2C总线由两条双向信号线构成,分别为数据线(SDA)以及时钟线(SCL),分别用电阻进行上拉,以实现高低电平之间的切换,进行设备之间的数据交交换。I2C允许的工作电压范围较为宽泛,典型电压基准为+3.3V或+5V。常见的I2C总线速率分为以下几种模式:标准模式(100Kbit/s)、快速模式(400Kbit/s)以及高速模式(3.4Mbit/s)等。如图为典型的I2C连接示意图:
图1 I2C连接示意图
如图2为典型的I2C通讯帧格式示意图。一帧完整的数据发送主要包括起始位、地址位、读/写位、ACK/NCK位、数据位等。下面对各部分进行简要的讲解,并介绍如何通过C2000进行实现。
图2 I2C连接示意图
1.1 起始及结束指令
当某个设备在I2C总线上被配置为主机(Master),该设备可以发送起始及结束信号用来发起或结束一次I2C通信,母线电平示意图如图2所示。
- 起始信号:在SCL为高电平期间,SDA由高电平转换为低电平。
- 结束信号:在SCL为高电平期间,SDA由低电平转换为高电平。
图3 I2C通讯起始及结束信号
在C2000中,可以通过以下代码实现起始信号的发送。其中SCL及SDA分别代表用C2000 GPIO模拟的SDA及SCL总线,具体定义请参考例程部分。
- void I2C_Start(void)
- {
- Delay(I2CDelay);
- SCL_High(); // Set the SCL
- SDA_High(); // Set the SDA
- Delay(I2CDelay);
- SDA_Low(); // Clear the SDA while SCL is high indicates the start signal
- Delay(I2CDelay);
- SCL_Low(); // Clear the SCL to get ready to transmit
- }
可以参考以下代码实现结束信号的发送:
- void I2C_Finish(void)
- {
- SDA_Low(); // Clear the SDA
- SCL_Low(); // Clear the SCL
- Delay(I2CDelay);
- SCL_High(); // Set the SCL
- Delay(I2CDelay);
- SDA_High(); // Set the SDA while SCL is high indicates the finish signal
- }
|