I2C通信代码-
/ / PCF85063A_ADDRESS = 0 x51
i2c_eeprom_init(PCF85063A_ADDRESS, I2C_STANDARD, I2C_7BIT_ADDR, I2C_1BYTE_ADDR);//初始化i2c,在i2c地址大小中放置设备的地址大小
SEND_I2C_COMMAND ((& 0 xff);//设备的地址大小是两个字节长度,如果你的设备是一个字节长度,你可以使用这个指令从0x03地址或任何你需要的地址读取。
WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果Tx FIFO是满的,等待
SEND_I2C_COMMAND (0 x0100);//设置
WAIT_UNTIL_I2C_FIFO_IS_EMPTY ();//等待直到I2C Tx FIFO空
WAIT_UNTIL_NO_MASTER_ACTIVITY ();
read_byte = 0xFF & GetWord16(I2C_DATA_CMD_REG);
我没有得到一个所需的波形,开始传递第一个命令-
SEND_I2C_COMMAND ((& 0 xff);
信号SDA -传输从设备地址,然后不传输从设备的寄存器在SDA行。
我能知道可能的错误吗?
另外,有几篇关于I2C接口传感器没有响应的文章。
我已经厌倦了使用i2c_eeprom API和链接解决方案https://support.dialog-semiconductor.com/i2c-driver-lisxdx-sensor
代码似乎没有适当的响应就结束了。
请尽快请求帮助。
谢谢,
拉
霍尼韦尔
设备:
你好,对话框,
我一直在SDA和SCL线路上试验信号。
根据观察,在ACK时钟脉冲期间,SDA线是高的。master (DA14586)调用一个停止命令。
谢谢。
我可以知道第一篇文章中提到的代码有什么错误吗?
谢谢
拉
霍尼韦尔
嗨rajucoolsuraj,
我强烈推荐看看SDk6的I2C EEPROM示例。该项目位于SDK目录\projects\target_apps\peripheral_examples\i2c\i2c_eeprom。PIf您的传感器寄存器使用两个字节来寻址寄存器中的数据,您应该使用2字节寻址(I2C_2BYTES_ADDR)。SEND_I2C_COMMAND(0x08 & 0xFF);将只发送一个字节,但如果我能够正确地理解注释的形式,该设备的地址大小是两个字节长度。SEND_I2C_COMMAND将所需的数据到I2C总线,因为你需要什么来开始I2C通信内部寄存器的地址SEND_I2C_COMMAND((地址> > 8)&0xFF)只会推动8首先最重要的一点16位地址然后第二SEND_I2C_COMMAND(地址& 0 xff);将推入地址的其余8位。
谢谢,PM_Dialog
你好,对话框,
我使用的代码来自SDK - 6.0.10
从设备地址(对于我的RTC)是1010001 -因此主->从设备初始条件开始
start - 1010001W -从设备寄存器(00h - 11h) - Ack
if writing to slave register - I pass Data_Byte after Ack;
如果从slave读取-重启I2C - 1010001R - receive data_byte - Ack
我还试验了另一个具有相同I2C接口的传感器-设备在ACk时钟脉冲上确认。
因为RTC在I2C上读/写寄存器时不需要运行时钟;我希望能够帮助解释使I2C_TAR_REG正确地将其传递给I2C总线事务的地址。
0x51(1010001)或0xA2(1010001W) - W =写位- 0
谢谢
拉