这篇文档主要介绍了在W7100A中使用UART通信的基本示例程序。所有的这些示例代码都是基于C语言和Keil编译器完成的。详情请参考W7100A数据手册‘第6章UART’中关于
UART、寄存器、中断等等。
图表1为设置UART波特率所用到的各个寄存器。定时器1(Timer1)相关的寄存器是SMOD和TH1,和定时器2(Timer2)相关的寄存器是RLDH和RLDL。
图表1.波特率设置例子
波特率(bps) |
定时器 1(Timer1) / 模式 2 |
定时器 2(Timer2) |
|
TH1(0x8D) |
RLDH(0xCB), RLDL(0xCA) |
||
SMOD = ‘0’ |
SMOD = ‘1’ |
||
2400 |
160(0xA0) |
64(0x40) |
64384(0XFB80) |
4800 |
208(0xD0) |
160(0xA0) |
64960(0xFDC0) |
9600 |
232(0xE8) |
208(0xD0) |
65248(0xFEE0) |
14400 |
240(0xF0) |
224(0xE0) |
65344(0XFF40) |
19200 |
244(0xF4) |
232(0xE8) |
65392(0XFF70) |
28800 |
248(0xF8) |
240(0xF0) |
65440(0xFFA0) |
38400 |
250(0xFA) |
244(0xF4) |
65464(0XFFB8) |
57600 |
252(0xFC) |
248(0xF8) |
65488(0xFFD0) |
115200 |
254(0xFE) |
252(0xFC) |
65512(0xFFE8) |
230400 |
255(0xFF) |
254(0xFE) |
65524(0xFFF4) |
在一些UART通信的示例中,UART通信有固定的波特率(模式0和模式2)。如果是这种波特率固定的情况,请参考W7100A数据手册第6章UART关于波特率的计算方法。所有的程序都是关于回送(Echo-back)的例子,送回由串行通信中接收到的信息。
W7100A中UART有4个模式,从UART模式0到UART模式3。每个模式下的示例代码的实现将在后面详细介绍。
void Init_iMCU(void) { SCON = 0x10; // 串行模式0, SM00 = 0, SM01 =0, REN=1 }
void PutByte(unsigned char byData) { SBUF = byData; //向串行缓存器中写入数据 while(!TI); //等待直到所有的数据记录完成 TI = 0; //清除发送中断 }
unsigned char GetByte(void) { unsigned char byData; // 等待直到数据接收完成 while(!RI); RI = 0; //清除RI byData = SBUF; //读取数据 return byData; }
void main() { Init_iMCU(); //调用Init_iMCU()函数 while(1) PutByte(GetByte()); //回送(Echo-back)接收到的数据 } |
关于UART模式0下的波特率,选择内部时钟12分频(fosc/12)。考虑到W7100A的内部时钟创建了一个非常快的波特率时钟,频率大小为7.3MHz。这种固定波特率、高速的波特率时钟情况下,通常情况下不会选择模式0。这是因为模式0用的是同步传输,没有起始位和停止位。
在所有的这些示例代码中,在Init_iMCU()函数中将SCON寄存器设置为0x10。PutByte()函数可以把串行输入写入串行缓存器中,然后等待直到所有的数据发送完成,最后清除TI。GetByte()函数则可以返回接收到的串行数据,并且等待直到所有的数据接收完成,最后清除RI。Main()函数中,则是通过调用所有的Init_iMCU()、PutByte()、GetByte()函数将所有接收到的数据进行输出。
因为模式1使用异步通信,起始位和停止位分别位于数据的开头和结尾。定时器1(Timer1)和定时器2(Timer2)溢出产生波特率。后面将详细介绍各个模式下的示例代码程序。
void Init_iMCU(void) { SCON = 0x50; // 串行模式1, SM00 = 0, SM01 =1, REN=1 TMOD |= 0x20; // 定时器1(Timer1)模式2 PCON |= 0x80; // SMOD0 = 1 TL1 = 0xFC; // 波特率设定为115200bps TH1 = 0xFC; // 参考W7100A数据手册 TR1 = 1; //启动定时器1(Timer1) }
void PutByte(unsigned char byData) { SBUF = byData; // 向串行缓存器中写入数据 while(!TI); // 等待数据记录完成 TI = 0; // 清除传输中断 }
unsigned char GetByte(void) { unsigned char byData; //等待直到数据接收 while(!RI); RI = 0; //清除RI byData = SBUF; // 读取数据 return byData; }
void main() { Init_iMCU(); //调用Init_iMCU函数 while(1) PutByte(GetByte()); //回送(Echo-back)接收到的数据 } |
在UART模式1下可以交换使用定时器1(Timer1)和定时器2(Timer2)来设定波特率。在这一章,我们使用定时器1(Timer1)来设定波特率的值。详细请参考W7100A数据手册查看关于波特率的设置。
示例程序中,将SCON寄存器的值设定为0x50,同时设定Timer1在模式2。如果要设置波特率的值,还要将SMOD位置1,TH1寄存器的值设定为0xFC。此时,波特率的值为
115200bps。其它用来输出的代码程序也如同第2章的接收程序大致相同。
void Init_iMCU(void) { SCON = 0x50; // 串行模式1, SM00 = 0, SM01 =1, REN=1 T2CON = 0x30; // 定时器2(Timer2)波特率发生器模式 TH2 = 0xFF; // 波特率设置为115200bps TL2 = 0xE8; // 请参考W7100A数据手册 RLDH = 0xFF; // 重新重载波特率为115200bps RLDL = 0xE8; // 重新重载波特率为115200bps TR2 = 1; // 启动定时器2(Timer2) }
void PutByte(unsigned char byData) { SBUF = byData; // 向串行缓存器中写入数据 while(!TI); // 等待直到所有的数据记录完成 TI = 0; // 清除传输中断 }
unsigned char GetByte(void) { unsigned char byData; // 等待数据接收 while(!RI); RI = 0; //清除RI byData = SBUF; // 读取数据 return byData; }
void main() { Init_iMCU(); //调用Init_iMCU函数 while(1) PutByte(GetByte()); //回送(Echo-back)接收到的数据 } |
UART在模式1下可以交换使用定时器1(Timer1)和定时器2(Timer2)来设定波特率的值。在这一章节,利用定时器2(Timer2)来设定波特率的值。详细请参考W7100A数据手册。
在示例代码中,将SCON寄存器设置为0x50,选择定时器2(Timer2)为波特率产生器模式。为了能够正确的设定波特率的值,还需要将TH2和TL2分别设为0xFF和0xE8。这样设置完成后,波特率的值就是115200bps。RLDH和RLDL的值可以重新重载,分别定义为0xFF和0xE8。其它用来输出的代码程序也如同第2章的接收程序大致相同。
未完待续~~
明天我们还会继续给大家献上如何实现W7100A中的UART,敬请期待~~
文章评论(0条评论)
登录后参与讨论