簡(jiǎn)介
這篇文檔主要介紹了在W7100A中使用UART通信的基本示例程序。所有的這些示例代碼都是基于C語(yǔ)言和Keil編譯器完成的。詳情請(qǐng)參考W7100A數(shù)據(jù)手冊(cè)‘第6章UART’中關(guān)于
UART、寄存器、中斷等等。
圖表1為設(shè)置UART波特率所用到的各個(gè)寄存器。定時(shí)器1(Timer1)相關(guān)的寄存器是SMOD和TH1,和定時(shí)器2(Timer2)相關(guān)的寄存器是RLDH和RLDL。
圖表1.波特率設(shè)置例子
波特率(bps)
定時(shí)器 1(Timer1) / 模式 2
定時(shí)器 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)。如果是這種波特率固定的情況,請(qǐng)參考W7100A數(shù)據(jù)手冊(cè)第6章UART關(guān)于波特率的計(jì)算方法。所有的程序都是關(guān)于回送(Echo-back)的例子,送回由串行通信中接收到的信息。
W7100A中UART有4個(gè)模式,從UART模式0到UART模式3。每個(gè)模式下的示例代碼的實(shí)現(xiàn)將在后面詳細(xì)介紹。
模式0, 8位UART, 固定波特率
void Init_iMCU(void)
{
SCON = 0x10; // 串行模式0, SM00 = 0, SM01 =0, REN=1
}
void PutByte(unsigned char byData)
{
SBUF = byData; //向串行緩存器中寫入數(shù)據(jù)
while(!TI); //等待直到所有的數(shù)據(jù)記錄完成
TI = 0; //清除發(fā)送中斷
}
unsigned char GetByte(void)
{
unsigned char byData; // 等待直到數(shù)據(jù)接收完成
while(!RI);
RI = 0; //清除RI
byData = SBUF; //讀取數(shù)據(jù)
return byData;
}
void main()
{
Init_iMCU(); //調(diào)用Init_iMCU()函數(shù)
while(1) PutByte(GetByte()); //回送(Echo-back)接收到的數(shù)據(jù)
}
|
關(guān)于UART模式0下的波特率,選擇內(nèi)部時(shí)鐘12分頻(fosc/12)。考慮到W7100A的內(nèi)部時(shí)鐘創(chuàng)建了一個(gè)非??斓牟ㄌ芈蕰r(shí)鐘,頻率大小為7.3MHz。這種固定波特率、高速的波特率時(shí)鐘情況下,通常情況下不會(huì)選擇模式0。這是因?yàn)槟J?用的是同步傳輸,沒有起始位和停止位。
在所有的這些示例代碼中,在Init_iMCU()函數(shù)中將SCON寄存器設(shè)置為0x10。PutByte()函數(shù)可以把串行輸入寫入串行緩存器中,然后等待直到所有的數(shù)據(jù)發(fā)送完成,最后清除TI。GetByte()函數(shù)則可以返回接收到的串行數(shù)據(jù),并且等待直到所有的數(shù)據(jù)接收完成,最后清除RI。Main()函數(shù)中,則是通過調(diào)用所有的Init_iMCU()、PutByte()、GetByte()函數(shù)將所有接收到的數(shù)據(jù)進(jìn)行輸出。
模式1, 8位UART, 可變波特率
因?yàn)槟J?使用異步通信,起始位和停止位分別位于數(shù)據(jù)的開頭和結(jié)尾。定時(shí)器1(Timer1)和定時(shí)器2(Timer2)溢出產(chǎn)生波特率。后面將詳細(xì)介紹各個(gè)模式下的示例代碼程序。
定時(shí)器1(Timer1) 時(shí)鐘源
void Init_iMCU(void)
{
SCON = 0x50; // 串行模式1, SM00 = 0, SM01 =1, REN=1
TMOD |= 0x20; // 定時(shí)器1(Timer1)模式2
PCON |= 0x80; // SMOD0 = 1
TL1 = 0xFC; // 波特率設(shè)定為115200bps
TH1 = 0xFC; // 參考W7100A數(shù)據(jù)手冊(cè)
TR1 = 1; //啟動(dòng)定時(shí)器1(Timer1)
}
void PutByte(unsigned char byData)
{
SBUF = byData; // 向串行緩存器中寫入數(shù)據(jù)
while(!TI); // 等待數(shù)據(jù)記錄完成
TI = 0; // 清除傳輸中斷
}
unsigned char GetByte(void)
{
unsigned char byData; //等待直到數(shù)據(jù)接收
while(!RI);
RI = 0; //清除RI
byData = SBUF; // 讀取數(shù)據(jù)
return byData;
}
void main()
{
Init_iMCU(); //調(diào)用Init_iMCU函數(shù)
while(1) PutByte(GetByte()); //回送(Echo-back)接收到的數(shù)據(jù)
}
|
在UART模式1下可以交換使用定時(shí)器1(Timer1)和定時(shí)器2(Timer2)來(lái)設(shè)定波特率。在這一章,我們使用定時(shí)器1(Timer1)來(lái)設(shè)定波特率的值。詳細(xì)請(qǐng)參考W7100A數(shù)據(jù)手冊(cè)查看關(guān)于波特率的設(shè)置。
示例程序中,將SCON寄存器的值設(shè)定為0x50,同時(shí)設(shè)定Timer1在模式2。如果要設(shè)置波特率的值,還要將SMOD位置1,TH1寄存器的值設(shè)定為0xFC。此時(shí),波特率的值為
115200bps。其它用來(lái)輸出的代碼程序也如同第2章的接收程序大致相同。
定時(shí)器2(Timer2) 時(shí)鐘源
void Init_iMCU(void)
{
SCON = 0x50; // 串行模式1, SM00 = 0, SM01 =1, REN=1
T2CON = 0x30; // 定時(shí)器2(Timer2)波特率發(fā)生器模式
TH2 = 0xFF; // 波特率設(shè)置為115200bps
TL2 = 0xE8; // 請(qǐng)參考W7100A數(shù)據(jù)手冊(cè)
RLDH = 0xFF; // 重新重載波特率為115200bps
RLDL = 0xE8; // 重新重載波特率為115200bps
TR2 = 1; // 啟動(dòng)定時(shí)器2(Timer2)
}
void PutByte(unsigned char byData)
{
SBUF = byData; // 向串行緩存器中寫入數(shù)據(jù)
while(!TI); // 等待直到所有的數(shù)據(jù)記錄完成
TI = 0; // 清除傳輸中斷
}
unsigned char GetByte(void)
{
unsigned char byData; // 等待數(shù)據(jù)接收
while(!RI);
RI = 0; //清除RI
byData = SBUF; // 讀取數(shù)據(jù)
return byData;
}
void main()
{
Init_iMCU(); //調(diào)用Init_iMCU函數(shù)
while(1) PutByte(GetByte()); //回送(Echo-back)接收到的數(shù)據(jù)
}
|
UART在模式1下可以交換使用定時(shí)器1(Timer1)和定時(shí)器2(Timer2)來(lái)設(shè)定波特率的值。在這一章節(jié),利用定時(shí)器2(Timer2)來(lái)設(shè)定波特率的值。詳細(xì)請(qǐng)參考W7100A數(shù)據(jù)手冊(cè)。
在示例代碼中,將SCON寄存器設(shè)置為0x50,選擇定時(shí)器2(Timer2)為波特率產(chǎn)生器模式。為了能夠正確的設(shè)定波特率的值,還需要將TH2和TL2分別設(shè)為0xFF和0xE8。這樣設(shè)置完成后,波特率的值就是115200bps。RLDH和RLDL的值可以重新重載,分別定義為0xFF和0xE8。其它用來(lái)輸出的代碼程序也如同第2章的接收程序大致相同。
未完待續(xù)~~
明天我們還會(huì)繼續(xù)給大家獻(xiàn)上如何實(shí)現(xiàn)W7100A中的UART,敬請(qǐng)期待~~