你好,
我的i2c 24bit ADC传感器要求如下:
1 - slv-adrs——> command_start_conversion
2- slv- ads——>read_byte1(master ACK read)——>Read_byte2(master ACK read)- Read_byte3(master-ACK read)
如何才能做到这一点呢?
问题是,ADC发送的第一个字节和知道ACK从14580,所以它停止发送。
发送地址+读取命令后,14580应在每个接收的字节后发送ACK。
所附的图像显示了传感器是如何确认接收地址并开始发送第一个字节
DA14580在最后没有发送ACK。
关键词:
设备:

嗨sjabir2004,
我认为您可以通过已经存在的i2c_eeprom_read_data()函数实现这个功能。只需注释掉i2c_wait_until_eeprom_ready()并尝试用eeprom_init()初始化eeprom,然后调用i2c_eeprom_read_data(data, address, num),最后释放i2c。在num参数plave中,你想让你的模块执行3个读事务,da应该ACK前2个字节,NAK第三个字节,以完成事务。
由于MT_dialog
你好,
函数i2c_eeprom_read_data()将调用read_data_single函数。这个函数将向传感器发送与调用BEFORE中要求的一样多的读取信号来开始读取。
我在我的传感器中看不到这个功能。我看到一个连续的字节流从传感器发送如附件中的文件。
下面是read_data_single函数:
read_data_single(uint8_t **p, uint32_t address, uint32_t size)
{
int j;
i2c_send_address(地址);
//这个函数发送连续的读取,而传感器需要一个只读!!
For (j = 0;j <大小;j + +)
{
WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果Tx FIFO已满,则等待
SEND_I2C_COMMAND (0 x0100);//设置读访问次数
}
/ /关键部分
GLOBAL_INT_DISABLE ();
//获取接收到的数据
For (j = 0;j <大小;j + +)
{
wait_for_received_byte();//等待收到的数据
**p =(0xFF & GetWord16(I2C_DATA_CMD_REG));//获取接收的字节
(* p) + +;
}
//临界区结束
GLOBAL_INT_RESTORE ();
}
嗨sjabir2004,
您还可以直接使用read_data_single()函数,只要将读取的字节保持在32字节以下。在你之前的帖子中并不清楚,你的问题是什么,因为你说你的传感器从da得到了ack,然后停止发送,在你的帖子的最后你说da根本没有发送ack。使用READ_DATA_SINGLE函数在I2C传感器上测试,我正确地获得了ACK字节。附加的图像是read_data_single()函数的函数,它具有相同的序列正如你的传感器所要求的。
由于MT_dialog
你好,
我的总结:
当我向传感器发送一个已知的命令时,我从传感器得到ACK。
当我向传感器发送read命令时,该命令被传感器确认,传感器开始连续发送三个字节。(因为它是24位)
第一个字节不是由DA确认的,所以它停止发送,尽管我可以在DATA_CMD_REG中看到发送的数据。
一个问题:
地方检察官怎么知道要收集多少字节?(在你发送的图片中,我注意到你给传感器写了3,收集了3个字节)
DA什么时候产生ACK?它是从DATA_CMD_REG读取的每个字节之后吗?
DA14580如何产生ACK?
嗨sjabir2004,
DA知道自从执行3读操作以来收集的字节数。在第一个循环中的read_data_single中,它发出大小(3)读命令,因此它需要3个字节,然后它访问FIFO以获取收到的字节。一旦主设备在他的缓冲区中获得一个字节,就应该发送ACK。
由于MT_dialog
你好,
这正是我所说的,在我发送的传感器的PDF中(这里再次连接),只有一个(地址+读取信号),那么来自DA的ACK的三个收集的字节。
问题是,第一个字节是在缓冲区(我收集它),但没有从DA停止传感器传输的ACK。
嗨sjabir2004,
在第一个交易之后,您获得了一个NACK,虽然您指示您的DA执行3个成功读取?是否有要附加的逻辑分析器跟踪?
由于MT_dialog
你好,
看来我也有类似的问题:
我想从eeprom中读取一些字节。如何获取数据如附件图片所示。
但是作为sjabir,我有一个问题,我只能接收第一个字节,因为我的DA14580发送一个NACK,所以eeprom停止发送其他字节。
下面是我的代码:
GLOBAL_INT_DISABLE ();
Int a = 0;
Uint8_t值[16]= {0};
i2c_eeprom_init(i2c_slave_address,i2c_speed_mode,i2c_address_mode,i2c_address_size);
SEND_I2C_COMMAND (02);/ / 1。你2。
WAIT_WHILE_I2C_FIFO_IS_FULL ();
SEND_I2C_COMMAND (0 x0100);
For (int I = 0; I <16;i++)
{
wait_for_received_byte();//等待收到的数据
value[i] =(0xFF & GetWord16(I2C_DATA_CMD_REG));//获取接收的字节
}
GLOBAL_INT_RESTORE ();
}
它不会比wait_for_received_byte()更进一步(第一个字节发送后)。
我也附上了我的分析仪上的图片。
我很感激任何帮助!
丹尼尔
我发现我自己错了……
我改变了路线
WAIT_WHILE_I2C_FIFO_IS_FULL ();
SEND_I2C_COMMAND (0 x0100);
来
For (int I = 0; I <16;i++)
{
WAIT_WHILE_I2C_FIFO_IS_FULL ();
SEND_I2C_COMMAND (0 x0100);
}