早上好,
我正在研究对话框SDK的I2C EEPROM库,了解我是否可以使用它来控制I2C显示模块。
我有一些疑问...
1 - I2C_TAR_REG寄存器的从站地址,仅通过硬件自动发送我在i2c_data_cmd_reg寄存器上写的第一次?
2 - 为什么i2c_wait_until_eeprom_ready函数发送0x08数据(send_i2c_command(0x08))?为什么0x08?
3 - 为什么I2C_EEPROM_READ_BYTE首先发送地址(I2C_SEND_ADDRESS(地址))和将R / W位为1(SEND_I2C_COMMAND(0x0100))之后?R / W不应在从站地址字节中输入?如果尚未发送I2C_DATA_CMD_REG的先前位,则尚未发送I2C_SEND_ADDREG,则0x0100不要覆盖这些位?
谢谢
设备:
嗨Giuseppe,
1)是的,使用I2C_INIT设置I2C设备的地址,这会在访问总线时发送设备的地址。
2)它只是一个虚拟字节,以检查EEPROM是否正在运行。
3)您必须编写您想要读取的模块的寄存器的地址,因此您必须执行写入,然后您必须执行读取以便从从站获取数据。如果检查发送的字节,您应该看到[device_address + write] [寄存器地址] [device_address +读取] [read_byte_from_module]。在写入i2c_data_cmd_reg后,数据将通过FIFO,然后在此时到达。
谢谢mt_dialog.
如果设备地址仅在第一次发送I2C_DATA_CMD_REG(SEND_I2C_COMMAND())中只会自动发送(SEND_I2C_COMMAND()),则在读取过程中,该指令在下面顺序发送第二个设备地址字节?
[device_address + write] [寄存器地址][device_address + read][read_byte_from_module]
UINT8_T I2C_EEPROM_READ_BYTE(UINT32_T地址)
{
i2c_wait_until_eeprom_ready();
i2c_send_address(地址);
等待_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(0x0100);//将R / W位设置为1(读取访问)
wait_until_i2c_fifo_is_empty();//等到I2C TX FIFO空
wait_for_received_byte();//等待收到的数据
返回(0xff&getword16(i2c_data_cmd_reg));//获得收到的字节
}
谢谢
嗨guiseppe,
send_i2c_command(0x100);使用设备地址发送读取命令。如果要执行读取或写入命令,则在编写1(在I2C_DATA_CMD_REG中以执行读取时必须发送设备的地址,模块将再次发送设备的地址。总之,由于您正在从读取写入的操作或对方将重新发送设备地址,因为I2C协议指示。
谢谢mt_dialog.
好的,然后硬件才会在从读取操作切换到写作中的读取操作时才会自动发送设备地址字节,反之亦然。
在Previus示例中,如果我使用其他值更改send_i2c_command(0x0100)值,但始终使用R / W位设置为1,例如0x1FF,send_i2c_command(0x01ff),无论如何都执行正确的读数?
嗨Giuseppe,
是的,即使您对0x1ff正确,它应该执行确定。
谢谢mt_dialog.
有时代码在wait_until_i2c_fifo_is_empty()上进入循环;
嗨Giuseppe,
我想580没有从奴隶得到任何东西,如果从站没有ACK,主人将继续尝试与从站进行通信并没有响应。还要检查它的状态发生,看看DA是否正在发送任何数据,从站都没有回复,或者如果从站保留占用的行,而且580无法发送任何东西,所以它保持TX FIFO占用。
谢谢mt_dialog.
什么触发了止损位的发送?
泰勒吉,
我没有得到你的意思,当发送结束时,将产生停止条件,如果没有ACK,从从属侧没有ACK,则表示交易意味着没有数据发送或者I2C从设备无法发送或该I2C从设备ISN的数据't准备转移。
谢谢mt_dialog.