打印
[Zigbee]

CC2530串口通讯-接收字符串

[复制链接]
1015|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gwsan|  楼主 | 2019-8-1 11:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1 理论分析
当 1 写入 UxCSR.RE 位时,在 UART 上数据接收就开始了。然后 UART 会在输入引脚 RXDx 中寻找有效起始位,并且设置 UxCSR.ACTIVE 位为 1。当检测出有效起始位时,收到的字节就传入到接收寄存器,UxCSR.RX_BYTE 位设置为 1。该操作完成时,产生接收中断。同时 UxCSR.ACTIVE 变为低电平。

通过寄存器 UxBUF 提供收到的数据字节。当 UxBUF 读出时,UxCSR.RX_BYTE位由硬件清 0。

注意:
当应用程序读 UxDBUF,很重要的一点是不清除 UxCSR.RX_BYTE。清除UxCSR.RX_BYTE 暗示 UART,使得它以为 UART RX 移位寄存器为空,即使它可能保存有未决数据 (一般是由于背对背传输)。所以 UART 声明 (TTL 为低电平) RT/RTS线,这会允许数据流进入 UART,导致潜在的溢出。因此 UxCSR.RX_BYTE 标志紧密结合了自动 RT/RTS 功能,因此只能被 SoC UART 本身控制。否则应用程序一般可以经历以下事件:RT/RTS 线保持声明(TTL 为低电平)的状态,即使一个背对背传输清楚地表明应该间歇性地停止数据流。


使用特权

评论回复
评论
dirtwillfly 2019-8-3 20:47 回复TA
感谢分享 

相关帖子

沙发
gwsan|  楼主 | 2019-8-1 11:07 | 只看该作者
2 实验详解
2.1 实验目的
1)、了解 CC2530 串口的功能;       
2)、掌握 CC2530 通过串口接收电脑发送过来的数据。

2.2实验设备
硬件:PC 机一台,ZB2530(底板、核心板、仿真器、USB 线)一套;
软件:win7 系统,IAR 8.20 集成开发环境。

使用特权

评论回复
板凳
gwsan|  楼主 | 2019-8-1 11:08 | 只看该作者
2.3实验相关电路图

图 1 FT232

图2 USB

使用特权

评论回复
地板
gwsan|  楼主 | 2019-8-1 11:08 | 只看该作者
2.4实验分析
由于要接收数据,所以在上节实验 Uart 配置的基础上,加上允许 Uart 接收数据就可以了。为了不占用 CPU 资源,我们采用 Uart 中断方式,所以打开接收中断和总中断。

其中一些寄存器在上一讲已经列出,不清楚的请查看上一讲;这一讲使用中断方式实现串口发送数据,在下面会具体分析。

“允许 Uart 接收数据”是配置 U0CSR。而管理中断开关的寄存器配置是 IEN0。

表 1中断使能


使用特权

评论回复
5
gwsan|  楼主 | 2019-8-1 11:08 | 只看该作者
表2USART0控制和状态


使用特权

评论回复
6
gwsan|  楼主 | 2019-8-1 11:09 | 只看该作者
具体相关寄存器的配置如下:

CLKCONCMD &= ~0x40; // 设置系统时钟源为 32MHZ 晶振
while(CLKCONSTA & 0x40); // 等待晶振稳定
CLKCONCMD &= ~0x47; // 设置系统主时钟频率为 32MHZ

PERCFG = 0x00; //位置 1 P0 口
P0SEL = 0x0c; //P0_2,P0_3 用作串口,第二功能
P2DIR &= ~0XC0; //P0 优先作为 UART0 ,优先级

U0CSR |= 0x80; //UART 方式
U0GCR |= 11; //U0GCR 与 U0BAUD 配合
U0BAUD |= 216; // 波特率设为 115200
UTX0IF = 0; //UART0 TX 中断标志清 0
U0CSR |= 0X40; //允许接收
URX0IE=1; //接收中断
EA=1; //开总中断

使用特权

评论回复
7
gwsan|  楼主 | 2019-8-1 11:09 | 只看该作者
2.5参考代码(主要代码)
main.c

/**Includes*********************************************************************/
#include <ioCC2530.h>
#include "Uart.h"

/**宏定义***********************************************************************/
//定义数据类型
#define uint unsigned int
#define uchar unsigned char

#define LED1  P1_0    //P1_0连接LED1
#define LED2  P1_1    //P1_1连接LED2
#define LED3  P0_4    //P1_4连接LED3

/**函数声明*********************************************************************/
void Send_ReceicedData(void);
void Initial_IO(void);
void Delayms(uint xms);

/**全局变量*********************************************************************/
//定义待发送的数据
char Txdata0[]={"龙创科技欢迎您\n"}; //存放"龙创科技欢迎您"
char Txdata1[]={"This is a Uart test.\n"};
char Txdata2[]={"The data CC2530 has received is: \n"};
char Txdata3[]={"\r\n"};
char Rxdata = '\0';


/**
  * @brief     主函数
  * @param     None
  * @retval    None
  */
void main(void)
{
    SetSysClock();               //设置系统时钟为32MHz
     
    InitUART();                  //调用初始化函数
   
    Initial_IO();                 //调用初始化函数
   
   
    UartSend_String(Txdata0,sizeof("龙创科技欢迎您\n"));
    Delayms(500);
    UartSend_String(Txdata1,sizeof("This is a Uart test.\n"));
   
    while(1)
    {
        Send_ReceicedData();      
    }
  
}

使用特权

评论回复
8
gwsan|  楼主 | 2019-8-1 11:09 | 只看该作者
/**
  * @brief     USART接收中断
  * @param     None
  * @retval    None
  */
#pragma vector = URX0_VECTOR
  __interrupt void UART0_ISR(void)
{
    Rxdata = U0DBUF;   //接收数据并存于Rxdata

    URX0IF = 0;    // 清中断标志
}

使用特权

评论回复
9
gwsan|  楼主 | 2019-8-1 11:10 | 只看该作者
/**
  * @brief     将接收到的数据发回给电脑
  * @param     None
  * @retval    None
  */
void Send_ReceicedData(void)
{  
    if ( Rxdata != '\0' )
    {
      UartSend_String(Txdata2,sizeof("The data CC2530 has received is: ")); //提示接收到数据
      Send_char(Rxdata);
      UartSend_String(Txdata3,sizeof("\n"));
      
      if (Rxdata=='1')
      {
        LED1=0;
        Delayms(500);
        LED1=1;        
      }
      
      if (Rxdata=='2')
      {
        LED2=0;
        Delayms(500);
        LED2=1;        
      }

      if (Rxdata=='3')
      {
        LED3=0;
        Delayms(500);
        LED3=1;        
      }  
  
      Rxdata='\0';   
      
    }

}

使用特权

评论回复
10
gwsan|  楼主 | 2019-8-1 11:10 | 只看该作者
/**
  * @brief     IO初始化函数
  * @param     None
  * @retval    None
  */
void Initial_IO(void)
{
    P1DIR |= 0xff;     //P1为输出
    P0DIR |= 0xff;
}

使用特权

评论回复
11
gwsan|  楼主 | 2019-8-1 11:10 | 只看该作者
/**
  * @brief     普通延时函数
  * @param     xms 延时长度
  * @retval    None
  */
void Delayms(uint xms)   
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=587;j>0;j--);
}

使用特权

评论回复
12
gwsan|  楼主 | 2019-8-1 11:11 | 只看该作者
Uart.c

#include "Uart.h"
#define uint unsigned int
#define uchar unsigned char

/**************************************************
//CC2530串口初始化配置
***************************************************/
void InitUART(void)
{
    PERCFG = 0x00;          //位置1 P0口
    P0SEL = 0x0c;           //P0_2,P0_3 用作串口,第二功能
    P2DIR &= ~0XC0;         //P0 优先作为UART0 ,优先级
    U0CSR |= 0x80;          //UART 方式
    U0GCR |= 11;            //U0GCR与U0BAUD配合     
    U0BAUD |= 216;          //波特率设为115200
    UTX0IF = 0;             //UART0 TX 中断标志清0
    U0CSR |= 0X40;          //允许接收
    URX0IE=1;               //接收中断
    EA=1;                   //开总中断,                  
}

使用特权

评论回复
13
gwsan|  楼主 | 2019-8-1 11:11 | 只看该作者
/**************************************************
函 数 名  : Send_char
功能描述  :电脑向串口发送字节
输入参数  : c---所要发送的数据
***************************************************/
void Send_char(uchar c)
{
    U0DBUF = c;
    while(UTX0IF == 0);   //发送完成标志位
    UTX0IF = 0;   
}

使用特权

评论回复
14
gwsan|  楼主 | 2019-8-1 11:11 | 只看该作者
/**************************************************
函 数 名  : UartSend_String
功能描述  :电脑向串口发送字符串
输入参数  : *Data---字符串首地址
             len---字符串长度
***************************************************/
void UartSend_String(char *Data,int len)
{
    int j;
    for(j=0;j<len;j++)
    {
        //U0DBUF = *Data++;
        //while(UTX0IF == 0);
        //UTX0IF = 0;
      Send_char(*Data++);
    }
}

使用特权

评论回复
15
gwsan|  楼主 | 2019-8-1 11:12 | 只看该作者
/**************************************************
函 数 名  : SetSysClock
功能描述  : 设置系统时钟为32MHz
***************************************************/
void SetSysClock(void)
{
    CLKCONCMD &= ~0x40;           //选择系统时钟源为外部32MHz crystal oscillator
    while(CLKCONSTA & 0x40);      //等待晶振稳定为32MHz
    CLKCONCMD &= ~0x47;           //设置系统主时钟频率为32MHZ  
}

注意: char Txdata2[]={“The data CC2530 has received is: \n”};必须加”\n”否则不能输出收到的数据。这是因为Txdata2为一个字符串如果没有结束标志,是不会输出的,需要加结束标志。想更深入了解可以参看相关C语言知识。

使用特权

评论回复
16
gwsan|  楼主 | 2019-8-1 11:12 | 只看该作者
2.6实验现象

编译下载程序到开发板上,打开串口调试助手,配置相关参数(注意是按字符格式发送哦)。

图3串口配置

使用特权

评论回复
17
gwsan|  楼主 | 2019-8-1 11:13 | 只看该作者

用户在串口调试助手上以字符格式发送 1、2 或者 3 时,可分别看到 LED1、LED2 或者 LED3 闪烁一下,而且串口调试助手还好将接收到的数据打印出来。

图4串口信息

使用特权

评论回复
18
parameters| | 2019-8-6 14:44 | 只看该作者
感谢楼主分享!了解学习一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

3426

帖子

1

粉丝