有没有一种方法可以通过I2C一次性发送/接收超过32字节的数据?
嗨booyeon,
当前的驱动程序实现使用32字节的发送和接收FIFO。您可以发送与当前实现的数据突发,因为驱动程序检查是否TFNF标志,所以它一直在FIFO中提供数据,只要它有空间。关于接收端的驱动程序有这个限制,因为32是FIFO的大小,你将不得不实现一个不同的读取过程,以采取超过32字节,我认为你可以轮询你的接收FIFO的状态(完整,通过I2C_STATUS_REG的RFF和RFNE标志,如果有空间从从站接收FIFO时钟数据或等待直到有空间在FIFO。
由于MT_dialog
我做了以下的工作,但似乎不起作用。如有问题,请告知。谢谢。
最初请求在开始时读取32字节For (j = 0;j < 32;j + +)SEND_I2C_COMMAND (0 x0100);
然后生成一个基于RXFIFO级别设置为小于32字节的中断;例如16字节。一旦产生中断,检查并读取RXFIFO中可用的数据,并请求更多的数据input_level = GetWord16 (I2C_RXFLR_REG);(我= 0;我< input_level;我+ +)input_buffer[i++] = (0xFF & GetWord16(I2C_DATA_CMD_REG));(j = 0;j < input_level;j + +)SEND_I2C_COMMAND (0 x0100);
基于i2c_eeprom外设的例子,我做了一些修改,如下所示,请尝试一下,似乎在我这边工作。
1.启用NVIC以获得I2C R_RX_FULL中断。
2.将I2C_RX_TL_REG设置为所需的值。
3.取消设置M_TX_EMPTY,因为它默认启用(命中时,FIFO是空的)
4.创建函数i2c_eeprom_read_data_cust():
Uint32_t i2c_eeprom_read_data_cust(uint8_t *rd_data_ptr, Uint32_t地址,Uint32_t大小){Uint32_t bytes_read = 0x100;//示例的剩余部分
i2c_wait_until_eeprom_ready ();i2c_send_address(地址);read_data_cust (&rd_data_ptr地址0 x100);
返回bytes_read;//示例的剩余部分}
5.read_data_cust ():
Static void read_data_cust(uint8_t **p, uint32_t address, uint32_t size){int j;For (j = 0;j <大小;j + +){WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果Tx FIFO是满的,等待SEND_I2C_COMMAND (0 x0100);//设置的读访问次数}}
6.当FIFO阈值超过中断将发生,并将由以下ISR服务:
空白read_i2c_int_custom(空白){而(GetWord16 (I2C_RXFLR_REG)){*test_p =(0xFF & GetWord16(I2C_DATA_CMD_REG)); / /数据//获取接收的字节test_p + +;}}
希望它可以帮助,
嗨booyeon,
当前的驱动程序实现使用32字节的发送和接收FIFO。您可以发送与当前实现的数据突发,因为驱动程序检查是否TFNF标志,所以它一直在FIFO中提供数据,只要它有空间。关于接收端的驱动程序有这个限制,因为32是FIFO的大小,你将不得不实现一个不同的读取过程,以采取超过32字节,我认为你可以轮询你的接收FIFO的状态(完整,通过I2C_STATUS_REG的RFF和RFNE标志,如果有空间从从站接收FIFO时钟数据或等待直到有空间在FIFO。
由于MT_dialog
我做了以下的工作,但似乎不起作用。如有问题,请告知。谢谢。
最初请求在开始时读取32字节
For (j = 0;j < 32;j + +)
SEND_I2C_COMMAND (0 x0100);
然后生成一个基于RXFIFO级别设置为小于32字节的中断;例如16字节。
一旦产生中断,检查并读取RXFIFO中可用的数据,并请求更多的数据
input_level = GetWord16 (I2C_RXFLR_REG);
(我= 0;我< input_level;我+ +)
input_buffer[i++] = (0xFF & GetWord16(I2C_DATA_CMD_REG));
(j = 0;j < input_level;j + +)
SEND_I2C_COMMAND (0 x0100);
嗨booyeon,
基于i2c_eeprom外设的例子,我做了一些修改,如下所示,请尝试一下,似乎在我这边工作。
1.启用NVIC以获得I2C R_RX_FULL中断。
2.将I2C_RX_TL_REG设置为所需的值。
3.取消设置M_TX_EMPTY,因为它默认启用(命中时,FIFO是空的)
4.创建函数i2c_eeprom_read_data_cust():
Uint32_t i2c_eeprom_read_data_cust(uint8_t *rd_data_ptr, Uint32_t地址,Uint32_t大小)
{
Uint32_t bytes_read = 0x100;//示例的剩余部分
i2c_wait_until_eeprom_ready ();
i2c_send_address(地址);
read_data_cust (&rd_data_ptr地址0 x100);
返回bytes_read;//示例的剩余部分
}
5.read_data_cust ():
Static void read_data_cust(uint8_t **p, uint32_t address, uint32_t size)的读访问次数
{
int j;
For (j = 0;j <大小;j + +)
{
WAIT_WHILE_I2C_FIFO_IS_FULL ();//如果Tx FIFO是满的,等待
SEND_I2C_COMMAND (0 x0100);//设置
}
}
6.当FIFO阈值超过中断将发生,并将由以下ISR服务:
空白read_i2c_int_custom(空白)
{
而(GetWord16 (I2C_RXFLR_REG))
{
*test_p =(0xFF & GetWord16(I2C_DATA_CMD_REG)); / /数据//获取接收的字节
test_p + +;
}
}
希望它可以帮助,
由于MT_dialog