有没有办法通过I2C发送/接收32个字节的数据?
敬佩龙,
当前的驱动程序实现使用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(0x0100);
然后基于RxFifo级别设置为小于32字节的中断;例如16字节。一旦中断,在rxfifo生成,检查和读取可用数据,请求更多数据input_level = getword16(i2c_rxflr_reg);for(i = 0; i input_buffer [i ++] =(0xff&getword16(i2c_data_cmd_reg));for(j = 0; j send_i2c_command(0x0100);
基于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,地址,0x100);
返回bytes_read;//离开了举例}
5. read_data_cust():
静态void read_data_cust(uint8_t ** p,uint32_t地址,uint32_t大小){in j;for(j = 0; j {等待_while_i2c_fifo_is_full();//等待TX FIFO已满send_i2c_command(0x0100);//设置 times的读取访问}}
6.当FIFO阈值超过中断时,将发生并将由以下ISR服务:
void read_i2c_int_custom(void){而(getword16(i2c_rxflr_reg)){* test_p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节test_p ++;}}
希望能帮助到你,
敬佩龙,
当前的驱动程序实现使用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(0x0100);
然后基于RxFifo级别设置为小于32字节的中断;例如16字节。input_buffer [i ++] =(0xff&getword16(i2c_data_cmd_reg));send_i2c_command(0x0100);
一旦中断,在rxfifo生成,检查和读取可用数据,请求更多数据
input_level = getword16(i2c_rxflr_reg);
for(i = 0; i
for(j = 0; j
敬佩龙,
基于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,地址,0x100);
返回bytes_read;//离开了举例
}
5. read_data_cust():
静态void read_data_cust(uint8_t ** p,uint32_t地址,uint32_t大小){ times的读取访问
{
in j;
for(j = 0; j
等待_while_i2c_fifo_is_full();//等待TX FIFO已满
send_i2c_command(0x0100);//设置
}
}
6.当FIFO阈值超过中断时,将发生并将由以下ISR服务:
void read_i2c_int_custom(void)
{
而(getword16(i2c_rxflr_reg))
{
* test_p =(0xff&getword16(i2c_data_cmd_reg));//获取收到的字节
test_p ++;
}
}
希望能帮助到你,
谢谢mt_dialog.