前言
看I2Cdemo之前,想起下游厂商的板子,用的都是GPIO模拟的I2C. 先去查下资料,看看为啥不用硬件I2C.
资料上说,用硬件I2C,优先级必须高,最好用DMA操作I2C, 否则可能时序不对.
看了官方提供的I2Cdemo, 一个2个,其中一个是低功耗唤醒的,剩下一个是I2C_EEPROM_fast_mode_plus, 确实是用DMA做的。
再看细节之前,习惯性的去试试效果。
结果跑不起来。加了ITM打印,继续跑。错误信息如下:
>> I2C_EEPRMOM_fast_mode_plus
TXBUFFERSIZE = 160
>> call Error_Handler() ../Src/main.c : 155, i_loop_cnt = 1, Remaining_Bytes = 160
对应的代码如下:
/*##-2- Start writing process ##############################################*/
/* Initialize Remaining Bytes Value to TX Buffer Size */
Remaining_Bytes = TXBUFFERSIZE;
printf("TXBUFFERSIZE = %d\n", TXBUFFERSIZE);
/* Initialize Memory address to 0 since EEPROM write will start from address 0 */
Memory_Address = 0;
/* Since page size is 4 bytes, the write procedure will be done in a loop */
while (Remaining_Bytes > 0)
{
/* Reset the Transmission complete flag */
I2C_Tx_Complete_Flag = 0;
/* Write EEPROM_PAGESIZE */
if(HAL_I2C_Mem_Write_DMA(&I2cHandle , (uint16_t)EEPROM_ADDRESS, Memory_Address, I2C_MEMADD_SIZE_16BIT, (uint8_t*)(aTxBuffer + Memory_Address), EEPROM_PAGESIZE)!= HAL_OK)
{
/* Writing process Error */
printf(">> call Error_Handler() %s : %d, i_loop_cnt = %d, Remaining_Bytes = %d\n", __FILE__, __LINE__, ++i_loop_cnt, Remaining_Bytes);
Error_Handler();
}
这说明,头一次向I2C设备中写,就没写进去。
看了板子原理图,板子上通过STM32H743的I2C管脚(PB6, PB7)一共接了3个I2C设备。
-
U22 WM8994ECS/R, 这是音频编码芯片。
-
CN20 连接LCD的插座,LCD上有I2C芯片?
-
U26 STM32L152CCT6, 这接着一个ST的MCU.
-
CN4 一个I2C扩展连接器,官方板子没在上面插入I2C芯片.
看着demo的意思,是要向一个I2C类型EEPROM里面读写数据。很可能是插到这个I2C扩展插座中的。
从零件商的网站下载了CN4的3D模型。如果要插入扩展芯片的话,那也应该是一块扩展板。从前面那8个孔插入。
从demo上看,不确定,到底和哪个I2C芯片通讯。
那只能看板子整体demo时,再看硬件I2C操作怎么用。
来源:CSDN
作者:LostSpeed
链接:https://blog.csdn.net/LostSpeed/article/details/104209592