中级会员
 
- 积分
- 423
- 金钱
- 423
- 注册时间
- 2017-4-1
- 在线时间
- 73 小时
|

楼主 |
发表于 2020-12-8 18:42:31
|
显示全部楼层
经过两天的试验,基本弄明白了一些。
HAL_I2C_Mem_Read()函数是阻塞方式读取数据,一直等到读完全部数据才返回;
HAL_I2C_Mem_Read_IT()函数执行时间大约2uS就返回了,但此时I2C操作并未完成;
HAL_I2C_Mem_Read_DMA函数执行时间大约104uS就返回了,但此时I2C操作并未完成。
对于后两个函数的好处就是可以让CPU执行其他任务,节省等待时间,但此时读取数据是不正确的。当I2C读操作完成时,程序会执行回调函数HAL_I2C_MemRxCpltCallback(),只要在该函数内置一个标志或者发送其他同步信号,就可以正确访问被读取的数据了。
写数据的情况也是类似,只不过回调函数为HAL_I2C_MemTxCpltCallback()。
总的来说,虽然以前对STM32的I2C功能有不好的评价,但下STM32CubeMX的支持下,读写EEPROM还是感到很方便,可靠情也很不错。 |
|