<pre name="code" class="html">int main (void)
{
i2c_module_write_test(0x51,0x00,0x00);
i2c_module_write_test(0x51,0x00,0x02);//如图1所示</pre>}// i2c 测试函数<pre>void i2c_module_write_test(uint16_t dev_address, uint8_t address, uint8_t data)
{
SetWord16(I2C_ENABLE_REG, 0x0); // Disable the I2C controller
SetWord16(I2C_CON_REG, I2C_MASTER_MODE | I2C_SLAVE_DISABLE | I2C_RESTART_EN); // Slave is disabled
SetBits16(I2C_CON_REG, I2C_SPEED, 2); // Set speed
SetBits16(I2C_CON_REG, I2C_10BITADDR_MASTER, 0); // Set addressing mode
SetWord16(I2C_TAR_REG, dev_address & 0x3FF); // Set Slave device address
SetWord16(I2C_ENABLE_REG, 0x1); // Enable the I2C controller
while( (GetWord16(I2C_STATUS_REG) & 0x20) != 0 ); // Wait for I2C master FSM to be IDLE
// write the dev address (w)
// write the mem address (w)
<span style="white-space:pre"> </span>SEND_I2C_COMMAND(address & 0xFF);
WAIT_WHILE_I2C_FIFO_IS_FULL(); // Wait if I2c Tx FIFO is full
SEND_I2C_COMMAND(data & 0xFF); // Send write data
WAIT_UNTIL_NO_MASTER_ACTIVITY(); // wait until no master activity
}
图1
总结:
本i2c模块发送的时候,会自己加上器件地址
我们现在看看写操作的数据流向:

网格的是主设备发送的,白色格子是从设备发送的。从图示中可以看到,对于写操作,从设备都只是发送ACK进行确认而已。
而读操作的数据流向,就有所不同,如图:

这时候,从设备除了发送ACK以外,紧跟着的还有数据。
//(此处的/A是重点)
我们用示波器来查看波形图,以便于理解。
将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:

从图中可知时序如下:
- 由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
- 接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
- 接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
- 接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
- 还有其它数据和最后的停止位,图中被截掉了。
从图中可知,纵向一格是200mV,则SDA和SCL的电平大概就是350mV;由于信号笔上设置了信号x10,因此实际电平应该大概是3.5V(理论上应该是3.3V)。横向一格是25us,10个时钟周期大概用了4格,即4x25us=100us,平均每个时钟周期是10us,可算出传输频率为1/10us=100,000/s,即100k bps。
既有读又有写的波形图:

图 AT24C04操作示意图
示意图说明:示意图分阐述了4种不同的操作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。例如写单个存储单元操作时,MCU发出I2C启动,设备地址,写标志位等,而I2C设备输出多个ACK。
图 AT24C04操作示意图
示意图说明:示意图分阐述了4种不同的操作方式,例如写单个存储单元,写多个存储单元,读单个存储单元和写单个存储单元。对于单个操作而言,上部为MCU通过I2C输出的相关指令,下部为I2C设备的响应。例如写单个存储单元操作时,MCU发出I2C启动,设备地址,写标志位等,而I2C设备输出多个ACK。
本文深入探讨了I2C通信协议在写操作和读操作中的数据流向。通过示波器分析波形,揭示了开始信号、器件地址、读写标志、数据传输及确认信号的详细过程。在写操作中,从设备仅发送ACK;而在读操作中,从设备不仅发送ACK,还会紧接着提供数据。通过对波形图的解读,还计算出了传输频率为100kbps。
8562

被折叠的 条评论
为什么被折叠?



