zoukankan      html  css  js  c++  java
  • 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   }

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

    但是不能接受字符串

  • 相关阅读:
    mysql索引及优化
    mysql5.5 uuid做主键与int做主键的性能实测
    php生成UUID
    Android 图片的裁剪与相机调用
    Android GPS 临近触发
    Android中GPS类及方法简介
    永久删除 tadb.exe
    linux服务器调整参数支持高并发
    隐藏nginx 版本号信息
    nginx 重写 rewrite 基础及实例
  • 原文地址:https://www.cnblogs.com/tianxxl/p/9869633.html
Copyright © 2011-2022 走看看