微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3)

时间:07-22 来源:本站整理 点击:

  

  本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第三部分:

  第三部分知识点:

  第十一节 串口通信

  第十二节 Flash的读写

  第十三节 BLE协议栈简介

  第十四节 OSAL工作原理

  第十五节 BLE蓝牙4.0协议栈启动分析
 

  有关TI 的CC254x芯片介绍,可点击下面链接查看:

  主流蓝牙BLE控制芯片详解(1):TI CC2540
 

  同系列资料推荐:

  由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)

  由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)
 

  有关本文的工具下载,大家可以到以下这个地址:

  朱兆祺ForARM

  第十一节 串口通信

  在软件开发过程中调试是一个很关键的过程,而调试用的最多的手段就是打印Log,嵌入式平台很少有显示设备,所以我们需要将信息通过串口打印到PC端。

  MT254xboard上已经通过RS232芯片将UART0连接到DB9,我们只需要将DB9连接到电脑即可,UART0 对应的外部设备 IO 引脚关系为:P0_2------RX,P0_3------TX。

  我们需要将这两个IO配置为复用功能,CC2540的USART可以配置为SPI模式或者异步UART模式,这里我们需要配置为异步UART模式。

  首先配置IO为UART模式:

  PERCFG &= ~0x01; // 配置UART为位置 1

  P0SEL = 0x3c; // P0_2,P0_3,P0_4,P0_5用作串口功能

  P2DIR &= ~0XC0; // P0 优先作为UART0

  配置UART0寄存器,将UART0配置为8N1模式,波特率为115200。

  U0CSR |= 0x80; // UART 方式

  U0GCR |= 11; // U0GCR与U0BAUD配合

  U0BAUD |= 216; // 波特率设为115200

  UTX0IF = 0; // 清除中断标志

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

  IEN0 |= 0x84; // 开总中断,接收中断

  这里采用中断方式来接收串口数据,并在中断中回调应用层的接收处理函数。

  #pragma vector = URX0_VECTOR

  __interrupt void UART0_ISR(void)

  {

  uint8 ch;

  URX0IF = 0; // 清中断标志

  ch = U0DBUF;

  if ( NULL != RecvCb ) // 调用回调函数

  {

  RecvCb(ch);

  }

  }

  为了测试串口的通讯功能,这里我们通过串口接收命令的方式来控制LED的亮灭和蜂鸣器的响和停止,并且显示当前的状态。根据串口输出提示,发送对应字符可以实现相应功能,并且显示状态。

  

  第十二节 Flash的读写

  嵌入式系统中需要存储数据,而片内的Flash资源很匮乏,所以我们经常需要使用SpiFlash来存储数据,MT254xboard中板载了一个 512Kbyte的Flash,下面我们来驱动此Flash。上一小节中我们用SPI的方式驱动了LCD12864,这节我们继续用SPI来驱动板载的 Flash,<GD25Q40.pdf>详细的说明了如何驱动这片Flash,在此不做累述,我们复制LCD12864工程,重命名为SpiFlash,在此工程中添加GD25Q40的两个驱动文件。

  

  下面我们来检测这个Flash,检测的方法为,全部写入0xAA,然后再读出,对比是否为0xAA,如果是,那Flash是没有问题的,否则Flash可能已经有坏块。具体的代码见例程,这个过程所需要的时间取决于我们需要检测的区域大小,如果完全检测,则可能需要几分钟的时间。

  int main(void)

  {

  SysStartXOSC();

  LCD12864_Init(); // LCD初始化

  GD25Q40_Init(); // Flash初始化

  LCD12864_DisStr(0, "Flash Check.。。。");

  sprintf(LCDBuf, "Flash ID :%04X", GD25Q40_ReadID()); // 读取器件ID

  LCD12864_DisStr(1, LCDBuf);

  GD25Q40_EraseChip(); // 擦除整片Flash 大约需要10S

  LCD12864_DisStr(2, "Erase Chip Complete");

  uint32 iCnt = 0;

  // 全部写入0xAA

  const uint8 Write = 0xAA;

  for(iCnt=0; iCnt < CHECK_ADDR_RANGE; iCnt++)

  {

  GD25Q40_Write(&Write, iCnt, 1); // 写入0xAA

  }

  // 读取Flash内部的值,与写入的值对比

  uint8 Read;

  for(iCnt=0; iCnt < CHECK_ADDR_RANGE; iCnt++)

  {

  GD25Q40_Read(&Read, iCnt, 1);

  if(Read != Write)

  {

  LCD12864_DisStr(3, "Flash Error");

  break;

  }

  }

  // 写入的值与读出的值完全一样

  if(iCnt >= CHECK_ADDR_RANGE)

  {

  LCD12864_DisStr(3, "Flash Check Success");

  }

  GD25Q40_EraseChip(); // 再次擦除

  while(1);

  return 0;

  }

  MT254X蓝牙4.0开发板Flash效果:

  

  第十三节 BLE协议栈简介

TI的协议栈分为两部分:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top