您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子百科>主机配件>内存>

cc2530串口通信

2017年11月08日 14:37 网络整理 作者: 用户评论(0

  编写程序实现实验板定期向PC机串口发送字符串“Hello ! I am CC2530 。\n”。实验板开机后按照设定的时间间隔,不断地向PC及发送字符串,报告自己的状态,每发送一次字符串消息,LED1闪亮一次。具体工作方式如下:

  ① 通电后LED1熄灭。

  ② 设置USART 0使用位置。

  ③ 设置UART工作方式和波特率。

  ④ LED1点亮。

  ⑤ 发送字符串“Hello ! I am CC2530。\n”。

  ⑥ LED1熄灭。

  ⑦ 延时一段时间,延时时间可以设置为3秒。

  ⑧ 返回步骤④循环执行。

  串口通信介绍

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

  并行通信是指数据的各位同时发送或接收,每个数据位使用单独的一条导线,有多少位数据需要传送就需要有多少条数据线。并行通信的特点是各位数据同时传送,传送速度快效率高,并行数据传送需要较多的数据线,因此传送成本高,干扰大,可靠性较差,一般适用于短距离数据通信,多用于计算机内部的数据传送方式。

  串行通信是指数据一位接一位顺序发送或接收。串行通信的特点是数据按位顺序进行,最少只需一根数据传输线即可完成,传输成本低传送数据速度慢,一般用于较长距离的数据传送。

  串行通信又分同步和异步两种方式。

  (1)串行同步通信

  同步通信中,所有设备使用同一个时钟,以数据块为单位传送数据,每个数据块包括同步字符、数据块和校验字符。同步字符位于数据块的开头,用于确认数据字符的开始;接收时,接收设备连续不断地对传输线采样,并把接收到的字符与双方约定的同步字符进行比较,只有比较成功后才会把后面接收到的字符加以存储

  同步通信的优点是数据传输速率高,缺点是要求发送时钟和接收时钟保持严格同步。在数据传送开始时先用同步字符来指示,同时传送时钟信号来实现发送端和接收端同步,即检测到规定的同步字符后,接着就连续按顺序传送数据。这种传送方式对硬件结构要求较高。

  (2)串行异步通信

  异步通信中,每个设备都有自己的时钟信号,通信中双方的时钟频率保持一致。异步通信以字符为单位进行数据传送,每一个字符均按照固定的格式传送,又被称为帧,即异步串行通信一次传送一个帧。

  每一帧数据由起始位(低电平)、数据位、奇偶校验位(可选)、停止位(高电平)组成。帧的格式如图5-1所示:

  cc2530串口通信

  起始位:发送端通过发送起始位而开始一帧数据的传送。起始位使数据线处于逻辑0,用来表示一帧数据的开始。

  数据位:起始位之后就开始传送数据位。在数据位中,低位在前,高位在后。数据的位数可以是5、6、7或者8。

  奇偶校验位:是可选项,双方根据约定用来对传送数据的正确性进行检查。可选用奇校验、偶校验和无校验位。

  停止位:在奇偶检验位之后,停止位使数据线处于逻辑1,用以标志一个数据帧的结束。停止位逻辑值1的保持时间可以是1、1.5或2位,通信双方根据需要确定。

  空闲位:在一帧数据的停止位之后,线路处于空闲状态,可以是很多位,线路上对应的逻辑值是1,表示一帧数据结束,下一帧数据还没有到来。

  2.CC2530的串口通信模块

  CC2530有两个串行通信接口USART 0和USART 1,它们能够分别运行于异步UART模式或者同步SPI模式。两个USART具有同样的功能,可以设置在单独的I/O引脚,如表5-1所示

  cc2530串口通信

  根据映射表可知,在UART模式中,使用双线连接方式,UART 0和UART 1对应的外部设置I/O引脚关系分别为:

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

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

  UART模式的操作具有下列特点:

   8位或者9位有效数据

   奇校验、偶校验或者无奇偶校验

   配置起始位和停止位电平

  配置LSB或者MSB首先传送

   独立收发中断

   独立收发DMA触发

   奇偶校验和数据帧错误状态指示

  UART模式提供全双工传送,接收器中的位同步不影响发送功能。传送一个UART字节包含1个起始位、8个数据位、1个作为可选项的第9位数据或者奇偶校验位再加上1个或2个停止位。实际发送的帧包含8位或者9位,但是数据传送只涉及一个字节。

  1234567891011121314

  3.CC2530串口通信的相关寄存器

  对于CC2530的每个USART串口通信,有5个如下的寄存器(x是USART的编号,为0或者1):

   UxCSR:USARTx控制和状态寄存器

   UxUCR:USARTx UART控制寄存器

   UxGCR:USARTx 通用控制寄存器

   UxBUF:USART x接收/发送数据缓冲寄存器

   UxBAUD:USART x波特率控制寄存器

  1234567

  4.串口0初始化

  串口0 初始化

  PERCFG=0X00; //外设控制寄存器 这里使用串口0位置1

  P0SEL=0X0C; //0_2 0_3设置特殊端口

  U0CSR |=0X80;//0100 0000 0x80 串口通信的语言这里使用USART

  U0BAUD =216 ;

  U0GCR=10 ; //波特率

  U0UCR |=0x80; //流控制禁止

  U0CSR |=0x40; //允许接受数据

  UTX0IF = 0; //接受标志位

  URX0IF = 0; //发送标志位

  URX0IE=1; //使能中断

  EA=1; //中断总开关

  串口设置

  TX 发送数据

  RX 接收数据

  123456789101112131415161718192021

  cc2530串口通信

  波特率设置

  12

  cc2530串口通信

  U0CSR和U0BAUD用来设置波特率

  例如设置波特率位57600:

  U0BAUD = 216;

  U0GCR = 10;

  12345

  具体初始化

  UART0初始化配置

  1、设置USARTX0 为备用位置1,一般采用上电默认,无需配置

  PERCFG &= ~0X01;

  2、设置P0用作串口,P0_2、P0_3作为片上外设I/0

  P0SEL |= 0X0C;

  3、设置P0口外设优先级,采用上电默认值(P2DIR),无需配置

  4、设置UART0波特率

  U0BAUD = 59;

  U0GCR = 10;

  5、USART 模式选择,UART 模式,允许接收

  U0CSR |= 0XC0;

  6、进行USART 清除,并设置数据格式为默认值

  U0UCR |= 0X80;

  7、清零UART0 RX 和 UART0 TX 中断标志

  URX0IF = 0;

  UTX0IF = 0;

  8、使能UART0 RX 中断

  URX0IE = 1;

  9、使能全局中断

  EA = 1;

  123456789101112131415161718192021

  如果接收到了串口发来的数据URX0IF置1;

  如果发送成功UTX0IF置1;

  串口收发配置

  1、串口初始化配置

  2、发送函数

  void SendString(char *p) //发送字符串

  {

  while(1)

  {

  if(*p == ‘\0’)

  break;

  U0DBUF = *p++;

  while(!UTX0IF);

  UTX0IF = 0;

  }

  }

  12345678910111213141516

  3、串口接收中断服务函数

  #pragma vector = URX0_VECTOR

  __interrupt void URX0_f()

  {

  URX0IF = 0;

  buff[i] = U0DBUF;

  if(buff[i] == ‘#’)

  {

  TXstring(buff);

  i = 0;

  }

  else

  i++;

  }

  123456789101112131415

  4、main函数及时钟源的配置

  void main()

  {

  CLKCONCMD &= ~0X47;

  initUART0();

  while(1);

  }

  U0CSR

  USART模式选择

  开启/关闭 接收数据功能,在发送数据的时候需要关闭接收数据功能

  U0CSR |= 0X40; / U0CSR &= ~0X40;

  123456789101112

  cc2530串口通信

  U0UCR

  一般采用上电默认值

  U0UCR |= 0X80;

  1234

  cc2530串口通信

  URX0IF

  清空UART0、UART1的RX 中断标志

  URX0IF = 0;

  1234

  cc2530串口通信

  UTX0IF

  12

  cc2530串口通信

  U0CSR

  一般设置:

  U0CSR |= 0X40; //允许接收

  1234

  cc2530串口通信

  URX0IE

  IEN0 的第二位,使能UART0 RX 中断

  123

  cc2530串口通信

  P2DIR

  端口0外设优先级控制

  使用USART0时 采用上电默认值

  1234

  cc2530串口通信

  代码

  /* 文件名称:uart1.c

  * 功 能:CC2530系统实验-----单片机串口发送数据到PC

  * 描 述:实现从 CC2530 上通过串口每3秒发送字串“Hello ,I am CC2530 。\n ”,在PC端实验串口助手来接收数据。使用 CC2530 的串口 UART 0 ,波特率为 57600,其他参数为上电复位默认值。

  */

  /* 包含头文件 */

  #include “ioCC2530.h” //定义led灯端口

  #define LED1 P1_0 // P1_0定义为P1.0

  unsigned int counter=0; //统计定时器溢出次数

  void initUART0(void)

  {

  PERCFG = 0x00;

  P0SEL = 0x3c;

  U0CSR |= 0x80;

  U0BAUD = 216;

  U0GCR = 10;

  U0UCR |= 0x80;

  UTX0IF = 0; // 清零UART0 TX中断标志

  EA = 1; //使能全局中断

  }

  /************************************************************

  * 函数名称:inittTimer1

  * 功 能:初始化定时器T1控制状态寄存器

  *************************************************************/

  void inittTimer1()

  {

  CLKCONCMD &= 0x80; //时钟速度设置为32MHz

  T1CTL = 0x0E; // 配置128分频,模比较计数工作模式,并开始启动

  T1CCTL0 |= 0x04; //设定timer1通道0比较模式

  T1CC0L =50000 & 0xFF; // 把50000的低8位写入T1CC0L

  T1CC0H = ((50000 & 0xFF00) 》》 8); // 把50000的高8位写入T1CC0H

  T1IF=0; //清除timer1中断标志

  T1STAT &= ~0x01; //清除通道0中断标志

  TIMIF &= ~0x40; //不产生定时器1的溢出中断

  //定时器1的通道0的中断使能T1CCTL0.IM默认使能

  IEN1 |= 0x02; //使能定时器1的中断

  EA = 1; //使能全局中断

  }

  void UART0SendByte(unsigned char c)

  {

  U0DBUF = c;

  while (!UTX0IF); // 等待TX中断标志,即U0DBUF就绪

  UTX0IF = 0; // 清零TX中断标志

  }

  /**************************************************************

  * 函数名称:UART0SendString

  * 功 能:UART0发送一个字符串

  **************************************************************/

  void UART0SendString(unsigned char *str)

  {

  while(*str != ‘\0’)

  {

  UART0SendByte(*str++); // 发送一字节

  }

  }

  /************************************************************

  * 功 能:定时器T1中断服务子程序

  ************************************************************/

  #pragma vector = T1_VECTOR //中断服务子程序

  __interrupt void T1_ISR(void)

  {

  EA = 0; //禁止全局中断

  counter++; //统计T1的溢出次数

  T1STAT &= ~0x01; //清除通道0中断标志

  EA = 1; //使能全局中断

  }

  /************************************************************

  * 函数名称:main

  * 功 能:main函数入口

  *******************************************************/

  void main(void)

  {

  P1DIR |= 0x01; /* 配置P1.0的方向为输出 */

  LED1 = 0;

  inittTimer1(); //初始化Timer1

  initUART0(); // UART0初始化

  while(1)

  {

  if(counter》=15)

  {

  counter=0;

  LED1 = 1;

  UART0SendString(“Hello ! I am CC2530 。\n”);

  LED1 = 0;

  }

  }

  }

非常好我支持^.^

(29) 8.6%

不好我反对

(308) 91.4%

( 发表人:龚婷 )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!