select326 发表于 2018-3-13 11:50:57

IIC通信时,有时候会卡住,

用STM32F103C8T6 做了个核心板,使用软件模拟IIC和12864的OLED屏幕通信,项目中使用CubeMX构建,添加了FreeRTOS。
配置有三个任务,其中,display 任务负责把CACHE中的数据不停的发送给屏幕,
其他二个任务负责给CACHE中写入数据 。

初始化以后,程序运行正确,画线条成功,大约画了40左右条线的时候,就会很慢,感觉象是很卡的样子。

DEBUG发现,这个时候,系统会卡在IIC_Stop 方法上面。。。

#define SCL_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_13,GPIO_PIN_RESET)
#define SDA_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_12,GPIO_PIN_RESET)


大约是这二行上面,就不再继续 运行了。。。。

还请大神帮分析问题所在

wenyangzeng 发表于 2018-3-13 12:41:30

IIC器件发送应答信号时如果被其他中断打断,就可能出现上述现象。建议进行IIC通讯时禁止其他中断发生。

发表于 2018-3-13 13:48:59

HAL库,建议用硬件I2C通讯。

select326 发表于 2018-3-13 14:01:50

安 发表于 2018-3-13 13:48
HAL库,建议用硬件I2C通讯。

使用硬件IIC的话,只怕是需要修改引脚了,但是,板子是别人做好的,引脚 不能修改,可有办法使用硬件IIC ?

select326 发表于 2018-3-13 14:03:08

wenyangzeng 发表于 2018-3-13 12:41
IIC器件发送应答信号时如果被其他中断打断,就可能出现上述现象。建议进行IIC通讯时禁止其他中断发生。 ...

IIC通信是会一直持续进行的,这个是由FreeRTOS调度的。我如何来做到禁止中断发生?

wenyangzeng 发表于 2018-3-13 14:06:37

select326 发表于 2018-3-13 14:03
IIC通信是会一直持续进行的,这个是由FreeRTOS调度的。我如何来做到禁止中断发生? ...

至少中断优先级改变一下

发表于 2018-3-13 14:13:07

不行,只能用模拟的I2C了。看一下驱动,STOP的时候是不是有挂起等待时间的操作?可能是其他的任务影响的。

Tcreat 发表于 2018-3-13 14:18:27

最近怎么那么多涉及到I2C的

toofree 发表于 2018-3-13 14:20:48

把其余任务去掉,只开I2C的,看看还卡死不?排除多任务造成的影响。
至于I2C问题,论坛问的人也不少了,可以搜索参考一下别人回复。同一问题,多次回答比较浪费资源。

熊猫火锅 发表于 2018-3-13 14:36:50

关闭中断吧,实在没办法,就修改优先级别。最好是用硬件I2C.
页: [1] 2
查看完整版本: IIC通信时,有时候会卡住,