ZigBee开发(6)--基础实验串口通信

一、并行通信与串行通信

        微控制器与外设之间的数据通信,根据连线结构和传送方式的不同,可以分为两种:并行通信和串行通信。

        并行通信:指数据的各位同时发送或接收,每个数据位使用单独的一条导线。传输速度快、效率高,但需要的数据线较多,成本高。 

        串行通信:指数据一位接一位地顺 序发送或接收。需要的数据线少,成本低,但传输速度慢,效率低。

二、CC2530的串口通信模块

        CC2530有两个串行通信接口USART0USART1,它们能够分别运行于异步UART模式或者同步SPI模式

        两个USART接口具有相同的功能,通过PERCFG寄存器可以设置两个USART接口对应外部I/O引脚的映射关系:

        位置1:RX0 --- P0_2   TX0 --- P0_3               RX1 --- P0_5   TX1 --- P0_4

        位置2:RX0 --- P1_4   TX0 --- P1_5               RX1 --- P1_7   TX1 --- P1_6

        对每个USART串口通信编程,本质是设置相关的5个寄存器:

        <1> UxCSR:   USARTx的控制和状态寄存器。

        <2> UxUCR:  USARTx的UART控制寄存器。

        <3> UxGCR:  USARTx的通用控制寄存器。

        <4> UxDBUF:USARTx的接收/发送数据缓冲寄存器。

        <4> UxBAUD:USARTx的波特率控制寄存器。

三、UART口与计算机的COM口连接

        先认识两种电平:TTL电平和RS232电平。

        TTL电平:       逻辑0----小于0.8V     逻辑1----大于2.4V。

        RS232电平  逻辑0----5~15V         逻辑1---- -5~-15V。

        计算机的串行通信接口是RS-232的标准接口,而CC2530单片机的UART接口则是TTL电平,两者的电气规范不一致,所以要完成两者之间的数据通信,就需要借助接口芯片在两者之间进行电平转换,常用的有MAX232芯片。

        注意:DB9接口中,公头和母头的排列顺序是不同的

 

【1】计算波特率

        CC2530的波特率由BAUD_E和BAUD_M共同决定:

        F为微控制器的系统时钟频率:16MHz32MHz

        在TI公司提供的数据手册中,给出了32MHz系统时钟下各常用波特率的参数值,由计算公式亦不难得出16MHz系统时钟下对应的参数值。

【2】串口0的初始化函数

        选择外设的引脚映射位置,并将对应的引脚设置为外设功能 ,然后对波特率、控制寄存器和中断的相关控制位进行设置。

【3】数据接收中断服务函数

        USART0发送完成的中断向量是:0x3B ,也可以使用宏定义:URX0_VEXTOR 。在该中断服务函数中,要手工清除接收中断标志位URX0IF

        当数据接收完毕后,通过将一个自定义的变量Flag设置为1,告诉主函数,已经成 功接收到所需要的数据,主函数可以对其进行解析和执行指令。

【4】发送字节及发送字符串函数

        当USART 的发送/接收数据缓冲寄存器UxDBUF被写入数据时,该字节就会发送到TXD引脚,开始数据的传输。由于UxDBUF是双缓冲的,所以在发送开始后会立即触发TX完成中断标志UTX0IF,并且数据缓冲器被卸载,也就是说,当字节正在发送时,新 的字节能够装入数据缓冲器UxDBUF

        在单字节的发送函数中,把要发送的数据写入UxDBUF后,查询TX完成标志UTX0IF,当该标志被置1时,表示数据发送完成,然后清除该标志。

 1 #include <ioCC2530.h>
 2 
 3 #define uint unsigned int
 4 #define uchar unsigned char
 5 
 6 void usart_Init(void);
 7 void usart_Send_Byte(uchar c);
 8 void usart_Send_String(uchar *data,uint len);
 9 
10 int main()
11 {
12   CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ晶振
13   while(CLKCONSTA & 0x40); //等待晶振稳定为 32M
14   CLKCONCMD &= ~0x47; //设置系统主时钟频率为
15   usart_Init();
16   
17   usart_Send_String("123456789",9);
18   while(1);
19 }
20 void usart_Init(void)
21 {
22   PERCFG &= ~0x01;//位置 1 P0 口
23   P0SEL |= 0x0c;//P0_2,P0_3用作串口,第二功能
24   P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级
25   U0CSR |= 0x80;//UART 方式
26   U0UCR |= 0x0c;
27   
28   U0GCR |= 11;//U0GCR 与 U0BAUD 配合
29   U0BAUD |= 216;// 波特率设为 115200
30   
31   U0CSR |= 0x40;//允许接收
32   EA = 1;//开总中断
33   URX0IE = 1;//开串口接收中断
34   
35   UTX0IF = 0;//UART0 TX 中断标志初始置位 
36   URX0IF = 0;//UART0 RX 中断标志初始置位 
37 }
38 void usart_Send_Byte(uchar c)
39 {
40   U0DBUF = c;
41   while( !UTX0IF );//等待发送完成标志位置1
42   UTX0IF = 0;
43 }
44 void usart_Send_String(uchar *data,uint len)
45 {
46   while(len--)
47   {
48     usart_Send_Byte(*data++);
49   }
50 }
51 
52 #pragma vector = URX0_VECTOR
53   __interrupt void USART0_Receive(void)
54   {
55     uchar c = U0DBUF;
56     URX0IF = 0;
57     usart_Send_Byte(c+1);
58   }

实现接受道德数据加一以后发送出去

但是不能接受字符串

原文地址:https://www.cnblogs.com/tianxxl/p/9869633.html