为了实现多个cc2541的串口通信,先从两个做开始。
2017-10-23
实现了两个cc2541的单工通信。一个单片机周期性的从串口发送数据,另一个单片机接收数据,如果数据符合要求,则做一次led的闪烁。
参考:http://www.cnblogs.com/chenzhao207/p/4531941.html
image.png可以知道cc2541要两个uart,这里我们用uart0。
void InitUart(void)
{
PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
P2DIR &= ~0xC0; //P0优先作为UART0
U0CSR |= 0x80; //设置为UART方式
U0GCR |= 8;
U0BAUD |= 59; //波特率设为9600
UTX0IF = 0; //UART0 TX中断标志初始置位0
U0CSR |= 0x40; //允许接收
IEN0 |= 0x84; //开总中断允许接收中断
}
以上为对uart0进行初始化的程序。
PERCFG为外设io引脚映射控制的寄存器。
P0SEL表示的是IO口的功能选择,可以选择为普通IO口,或者作为外设的口。0表示普通IO
P2DIR为PORT2的方向和PORT0外设优先级的控制IO。其中7,6位表示的是PORT0外设的优先级设置(这个要注意,因为名称比较奇怪)。P2DIR & = ~0xC0;
将7,6位置零,也就是将uart0设为第一优先级。
U0CSR,U0GCR,U0BAUD等为UART0的设置寄存器。
U0CSR |= 0x80
表示将io口设置为串口模式,因为这个两个io口还兼有spi的模式。需要注意的是,U0CSR还和串口的发送使能有关。但是这里不能进行设置,需要在UART0都配置完后才行。
U0GCR |= 8;
U0BAUD |= 59; //波特率设为9600
这两句设置了波特率,设计值参考表格。
image.png计算公式为:
image.png
串口传送数据的函数,就是直接把数据送到U0DBUF寄存器中,会自动传送出去。
发送和接收的程序差不多,只有main函数部分有一些区别。
在实验的过程中,遇到了一个问题使得实验一直没有成功。那就是波特率似乎调的太高了。原来用的是115200一直传输不了,改成9600以后,在arduino上实验成功后,在单片机上也实验成功了。
网友评论