描述:
去年做的一个项目用到了STM32F103, FreeRTOS, DB18B20来读取温度参数。
发现时不时会发生读取温度参数的CRC校验错误,发生概率不高。大部分情况会将0误读为1。后来采取了再读一遍的方式克服这个问题。
本质原因:
FreeRTOS使用了1000Hz的定时器来做Scheduler的任务调度,虽然我们设定任务切换方式为抢占式的,但是任务调度还是要进行的,而且就由这个1ms一次的定时器任务来实现,所以会影响DB18B20的读写时序。毕竟18B20的读窗口只有12us,有一定的概率被定时器任务影响。
解决办法:
增加下面两个函数来设置关键区域,防止被中断打扰:taskENTER_CRITICAL(), taskEXIT_CRITICAL()。 使用下来效果不错,CRC不出错了。
uint8_t ReadBit(uint16_t pin){
GPIO_PinState bit;
taskENTER_CRITICAL();
Enable_TX(pin);
Wire_Off(pin);
DelayUs(DELAY_PULL_LOW);
//Wire_On(pin);
//DelayUs(DELAY_PULL_LOW);
Enable_RX(pin);
DelayUs(12);
bit = Wire_Read( pin);
LED1_Off();
taskEXIT_CRITICAL();
return bit;
}
Refer:
请参考上面的代码,链接:
github上的代码示例
网友评论