為了實(shí)現(xiàn)多個(gè)cc2541的串口通信,先從兩個(gè)做開始刽严。
2017-10-23
實(shí)現(xiàn)了兩個(gè)cc2541的單工通信寸潦。一個(gè)單片機(jī)周期性的從串口發(fā)送數(shù)據(jù),另一個(gè)單片機(jī)接收數(shù)據(jù)琉历,如果數(shù)據(jù)符合要求坠七,則做一次led的閃爍。
參考:http://www.cnblogs.com/chenzhao207/p/4531941.html
可以知道cc2541要兩個(gè)uart旗笔,這里我們用uart0彪置。
void InitUart(void)
{
PERCFG = 0x00; //外設(shè)控制寄存器 USART 0的IO位置:0為P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外設(shè)功能)
P2DIR &= ~0xC0; //P0優(yōu)先作為UART0
U0CSR |= 0x80; //設(shè)置為UART方式
U0GCR |= 8;
U0BAUD |= 59; //波特率設(shè)為9600
UTX0IF = 0; //UART0 TX中斷標(biāo)志初始置位0
U0CSR |= 0x40; //允許接收
IEN0 |= 0x84; //開總中斷允許接收中斷
}
以上為對(duì)uart0進(jìn)行初始化的程序。
PERCFG為外設(shè)io引腳映射控制的寄存器蝇恶。
P0SEL表示的是IO口的功能選擇拳魁,可以選擇為普通IO口,或者作為外設(shè)的口撮弧。0表示普通IO
P2DIR為PORT2的方向和PORT0外設(shè)優(yōu)先級(jí)的控制IO潘懊。其中7,6位表示的是PORT0外設(shè)的優(yōu)先級(jí)設(shè)置(這個(gè)要注意想虎,因?yàn)槊Q比較奇怪)卦尊。P2DIR & = ~0xC0;
將7,6位置零舌厨,也就是將uart0設(shè)為第一優(yōu)先級(jí)岂却。
U0CSR,U0GCR裙椭,U0BAUD等為UART0的設(shè)置寄存器躏哩。
U0CSR |= 0x80
表示將io口設(shè)置為串口模式,因?yàn)檫@個(gè)兩個(gè)io口還兼有spi的模式揉燃。需要注意的是扫尺,U0CSR還和串口的發(fā)送使能有關(guān)。但是這里不能進(jìn)行設(shè)置炊汤,需要在UART0都配置完后才行正驻。
U0GCR |= 8;
U0BAUD |= 59; //波特率設(shè)為9600
這兩句設(shè)置了波特率,設(shè)計(jì)值參考表格抢腐。
計(jì)算公式為:
串口傳送數(shù)據(jù)的函數(shù)姑曙,就是直接把數(shù)據(jù)送到U0DBUF寄存器中,會(huì)自動(dòng)傳送出去迈倍。
發(fā)送和接收的程序差不多伤靠,只有main函數(shù)部分有一些區(qū)別。
在實(shí)驗(yàn)的過程中啼染,遇到了一個(gè)問題使得實(shí)驗(yàn)一直沒有成功宴合。那就是波特率似乎調(diào)的太高了焕梅。原來用的是115200一直傳輸不了,改成9600以后卦洽,在arduino上實(shí)驗(yàn)成功后贞言,在單片機(jī)上也實(shí)驗(yàn)成功了。