i2c的调试

int main (void)
{	

	
	i2c_module_write_test(0x51,0x00,0x00);
	i2c_module_write_test(0x51,0x00,0x02);//如图1所示
}// i2c 测试函数
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)
	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的调试_第1张图片


总结:

本i2c模块发送的时候,会自己加上器件地址


我们现在看看写操作的数据流向:


 

     网格的是主设备发送的,白色格子是从设备发送的。从图示中可以看到,对于写操作,从设备都只是发送ACK进行确认而已。

 

     而读操作的数据流向,就有所不同,如图:


 
     这时候,从设备除了发送ACK以外,紧跟着的还有数据。

//(此处的/A是重点)

我们用示波器来查看波形图,以便于理解。


将示波器的X和Y分别接到SDA和SCL,得到波形并分析如图:


从图中可知时序如下:

  1. 由主机发起,在SCL为高电平时,SDA由高到低切变,形成开始信号;
  2. 接着是7位地址和一位读写标志,这里7位地址为0111100,即0x3c,正是我们代码中设置的地址ID;最后一位为0表示写操作;
  3. 接着在下一个时钟,主机以高电平状态释放SDA,这时从机响应,将SDA拉低了;
  4. 接着是两个8位数据00101110与响应,即0x2E,正是“.”号的ASCII码,符合预期输出;
  5. 还有其它数据和最后的停止位,图中被截掉了。

从图中可知,纵向一格是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。

你可能感兴趣的:(资源_工具)