本帖最后由 feilusia 于 2014-11-4 10:38 编辑
****************后记**************************************************
后来经16楼提醒,我的下述结论有错误,是我理解错了,希望不要误导到大家。
***************原帖******************************************
在做的项目需要IO口自己写一个通信协议,由于是双向的,所以使用了开漏输出加上拉。
调试中发现线长一点时通信不过,一直以为是我的焊接不行、线不行、协议不行,找了很多天,最终发现是开漏输出的使用出现了问题。于是我被主管骂惨了。
我是这么传输数据的:机子1将数据写到IO口,由于软件到硬件上有些许延时,所以机子1不停的查询IO口状态,等查询到IO口的数值正确时,拉低握手线。
问题就在于:同一时间下IO口只能有一种状态,要么输入要么输出。也就是类似半双工,而我却以为是全双工。在写IO的瞬间它被设置为输出,我又去读引脚导致IO变为输入,而距离短时机子2能接受到数据完全是因为IO口的硬件延迟。
那又如何确定写到IO口的数据已经准备好了呢?
为此我可以做两件事情:
第一件事情是减小上拉电阻,也就是增大电流,这样能使数据在线中传输的快一些,减小长短线造成的不同步影响。
第二件事情是可以在置位IO口后写几句空指令,然后再拉低握手线。当机子2检测到握手线被拉低时,IO口理论上也就置位好了。
当然具体加几句空指令还是需要实际测试。
程序还未改动,先写个笔记总结,自己MARK一下。
/*****************实测**************************/
比较慢的机子在置位数据总线后需要适当延时,否则会出现偶尔电平不稳定的现象。
50M的IO翻转一次需要0.02ns。
所以我把较慢的STM8加上了一条NOP语句,也就是一条指令周期。大概延时在1/16M=62.5ns左右,测试一晚上未出现错误。
|