最近在做一個項目,由於實時性要求高所以想把串口通訊、I2C、SIP都通過DMA來完成。
先用CubeMx配置後生成工程,然後做串口DMA收發測試程序一切順利,接下來搞了一天I2C,總是在不成功,邏輯分析儀上SDA、SCL只看到有一個脈衝,斷點調試發現死鎖在
while(__HAL_I2C_GET_FLAG(hi2c, I2C_FLAG_BUSY) != RESET);
幾乎放棄。後來看到:https://www.cnblogs.com/jackweibe/p/6056821.html 終於找到問題所在。
測試EEPROM:
特別要注意:I2C的地址是8位還是16位,如果是8位:
HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000)
HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_8BIT,&(I2C_Buffer_Write[i]),8, 1000)
16位:
HAL_I2C_Mem_Write(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000)
HAL_I2C_Mem_Read(&hi2c2, ADDR, i, I2C_MEMADD_SIZE_16BIT,&(I2C_Buffer_Write[i]),8, 1000)