2009.04.30
月底了,自己花在ModBus上面的时间已经很多了。从刚开始的熟悉协议到阅读周立功的源码,加上期间自己考驾照一周,打篮球眼角缝了几针修养了一周,不知不觉一个月就这样飞快的过了,而ModBus的学习进度却像蜗牛爬一样。都没有什么进展。原先的计划是先把ZLG/ModBus移植到EASYARM2104上面,然后自己把整个上层协议写一下,却发现,自己去卡死在移植这上面。因为移植过程中总是会出现各种各样的莫名其妙的问题。有时候真的想,如果不涉及底层那该多好啊。至少我这个人物是早就可以完成的。经过N次的折磨开发板及被折磨之后,今天晚上终于移植成功了。
ZLG/ModBus提供了上层协议,涉及到底层的那些函数要自己写。比如,串口发送接收函数,定时器的初始化及其中断的设置。源程序里面带着一个不完整的基于Magic2410的实验代码。但是这个平台跟我现在在用的EASYARM2104还是有差别的。Magic2410的mcu是三星的S3C2410,ARM9,内部有四个定时器。而EASYARM2104的mcu是LPC2106,ARM7核,两个定时器。 这那个实验程序里面,就是充分利用了四个定时器来。其中一个用作uC/OS II的时钟节拍发生器,剩下三个分别实现T15,T35,T10mS。那我在移植的时候就呆了。LPC2106只有两个定时器,一个给uC/OS II 用了,剩下一个怎么能实现三个定时呢?
我这边试了几种方法:
1)把Timer1用来实现T15。 T35用UART0的CTI中断来实现。T10mS就直接用uC/OS II的延时函数来实现。
用这种办法,把Slave程序烧写到板上。然后主机上上面打开ModBus调试精灵,想从站发命令。发现,该命令可以接收到。即在ADU的缓冲区里面看到发过去的命令,但是ADU没有进一步处理,没有成功提取出PDU。而这部分的工作室由CTI中断实现的。也就是说,发生CTI中断。但是我之前的设置都没有问题啊!!查看了LPC2106的manual guide,才知道问题出在哪里。
我在初始化UART0的时候,把激活接收中断的触发点设置为一个字节。这样,一点U0RBR寄存器里面有数据,就发生中断,该终端会调用ReceivOneChar函数接收一个字节。如果命令有八个字节的话,就会发生八次这样的中断。而CTI中断的触发条件是:当UART0 Rx FIFO包含至少一个字节,并且在接受3.5至4.5个字节的时间内没有发生任何的UART0 Rx FIFO动作时触发的。也就很明显了。一旦FIFO里面有一个字节,都会发生RDA中断,数据就会被取走。故前面那个条件无法满足。也就无法激活CTI超时中断。
2)用Timer1实现T15,T35则利用字节数做为出发的条件。
3)用Timer1实现T35,T15则不实现,UART0发动的时候,连续发送就好了。而此时T35触发的中断,完成ADU的检测,及ADU2PDU的处理。
to be continue...
阅读(1731) | 评论(1) | 转发(0) |