以s3c24xx为例,其它的cpu也类似,只是寄存器定义不一样而已。
其实Xmodem协议本身我就不说了,网上多的是。请大家至少有些对ARM CPU,Xmodem有点了解才看此文,如果你什么都不懂,这篇文章你会云里雾里的
需要注意的要点:
1. Datasheet上提到的modem是浮云,与xmodem协议无关。一般我们的板子接上三根线TXD,RXD,GND,就可以和终端进行通讯,只要能和终端通信,恭喜你,就能实现xmodem协议。至于COM口的其他引脚:RTS,CTS等等,可能那是和真正的Modem(猫)通信需要的引线,大家不用管。
2.一般查询UTRSTAT通过中断或者轮询(polling)来进行,为了简单,我使用polling,关掉Uart的FIFO功能。简单嘛!
3. 板子上初始化Uart以后,是板子主动发送NAK(0x15)给终端(Hype temiral),时间可以自行定义,有些Arm推荐3秒钟,但是设置为30秒也行。
4.在3秒的等待时间,如果用户在终端选择xmodem上传文件,文件不会立刻上传,等待板子发送NAK以后,才开始上传。
5.在这些基本的代码中,时序非常非常重要。开始我的代码如下:
do
{
putc(NAK); //发送NAK给终端
DelayTime(time); //延时3秒钟, 一般time值十进制:6000000
} while( !(UTRSTAT0 & RXD0READY));
有什么问题吗? 发送NAK以后,我开始sleep,拜托,这可是实时的操作,板子和终端信号线都准备发信号通信。
就这sleep,上传文件肯定失败啦! 正解如下:
do
{
DelayTime(time); //延时3秒钟, 一般time值十进制:6000000
putc(NAK); //发送NAK给终端
} while( !(UTRSTAT0 & RXD0READY));
6.当读取了一个char值从寄存器URXH0,请调用while( !(UTRSTAT0 & RXD0READY)); 读取下一个数据,
int i = 0;
do
{
while(!(UTRSTAT0 & RXD0READY));
ch = URXH0;
i++;
} while(i<132)
真实的代码请大家自己实现吧!