由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3)
本系列教程将结合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的协议栈分为两部分:
- 主流蓝牙BLE控制芯片详解(3):创杰 IS1685S(07-18)
- 苹果光环加持,蓝牙Beacon技术成室内定位应用最大黑马(08-02)
- 主流蓝牙BLE控制芯片详解(4):Nordic nRF51822(07-20)
- 蓝牙BLE之室内定位iBeacon应用测验(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)(07-18)