嵌入式技术
在嵌入式产品的开发中少不了各种外围设备的搭配使用。嵌入式开发中需要做到将加入系统的外设连接起来,并能够完成所需要的功能开发。
在众多的设备中,MCU与外设进行通信都是按照一定的协议进行的,都涉及到时序,只有按照约定好的协议才能进行通信。
比如,常见的 1-Write单总线、IIC总线、SMBus总线、SPI总线等等的协议,都是需要在约定的通信协议下才能完成通信。而通信协议的实现反馈到MCU的时候,就只是一种IO口电平的变化输出,以及外设传送数据到MCU也是一种电平的变化或者是电平的时间宽度变化。
笔者在项目开发中就遇到过和外设通信中需要测量波形的变化确认数据状态的情况,遇到过一些小问题,随即记录下来分享一下调试心得,也做一个备忘。
情况是这样,项目开发中,有一个外设需要加入到系统中,这个外设是由生产厂商规定好了通信协议的,收发数据都要按照协议的规定进行,MCU接收数据的规定如下:
在通信总线上的低电平期间,有20mA的电流变化时外设回复数据“1”,没有电流变化为数据“0”。
电流的变化通过硬件电路转换成电压的变化,MCU通过AD检测进行判断,从而得知数据的变化状态。按照我们思路,MUC在低电平期间检测到电流的变化启动AD检测,根据AD值确认数据状态。如下图示:
伪代码示意如下:
while( !GPIO_Check_Pin ) // 通过电平变化确定电流变化
{
uint_32 adValue = 0;
if( GPIO_Check_Pin )
{
adValue = getAdValue(); // 读取AD值
if(adValue > x)
xxx;
}
}
一般到这里认为应该也就算是完成了,可是在实际测试中发现,获取得到的AD值跟电路上实际的电压是有很多的出入的,测量总是不准确。
苦思冥想,多次测量之后发现,原来跟时序的变化有关。原因到底什么呢?
原来,正常的想法都是波形变化之后进行测量,而没有考虑过波形的变化在不同的处理器上差异,以及硬件本身的延迟,往往不会立即就能发生翻转的,有一个变化的过程的。
比如,理想的时序波形变化是这样的:
然而,实际的时序波形变化是这样的:
所以,在波形发生变化的时候就进行测量,很多时候往往得不到正确的结果,可以测量的电位点都不对,测量发生在了电平变化的期间。
所以,要准确测量,合适的方法是等待一段时间,电平变化稳定之后再进行测量,结果就更加证实准确。如下:
所以,伪代码示意如下:
while( !GPIO_Check_Pin ) // 通过电平变化确定电流变化
{
uint_32 adValue = 0;
if( GPIO_Check_Pin )
{
delay();
adValue = getAdValue(); // 读取AD值
if(adValue > x)
xxx;
}
}
很多的嵌入式系统中,考虑到成本、工艺、实用性等的因素,很多的处理器都不会实用很强大的MCU,主频可能都比较低,性能有限,很多的外设反应速度可能也不及MCU,所以延时等待在很多时候都很有必要。
全部0条评论
快来发表一下你的评论吧 !