4个职位/ 0个新职位
最后发表
booyeon
离线
最后看到:5年2个月前
加入:2015-09-14福音18:36
I2C数据传输大小

有没有一种方法可以通过I2C一次性发送/接收超过32字节的数据?

设备:
MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨booyeon,

嗨booyeon,

当前的驱动程序实现使用32字节的发送和接收FIFO。您可以发送与当前实现的数据突发,因为驱动程序检查是否TFNF标志,所以它一直在FIFO中提供数据,只要它有空间。关于接收端的驱动程序有这个限制,因为32是FIFO的大小,你将不得不实现一个不同的读取过程,以采取超过32字节,我认为你可以轮询你的接收FIFO的状态(完整,通过I2C_STATUS_REG的RFF和RFNE标志,如果有空间从从站接收FIFO时钟数据或等待直到有空间在FIFO。

由于MT_dialog

booyeon
离线
最后看到:5年2个月前
加入:2015-09-14福音18:36
我做了下面的事,但还是做了

我做了以下的工作,但似乎不起作用。如有问题,请告知。谢谢。

最初请求在开始时读取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);

MT_dialog
离线
最后看到:5个月2个星期前
工作人员
加入:2015-06-08 34
嗨booyeon,

嗨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

主题锁定