4、CC2541芯片中级教程-OSAL操作系统(简单AT指令实现+IIC软件和硬件实现驱动MPU6050)
本文根据一周CC2541笔记汇总得来——
适合概览和知识快速索引——
全部链接:
中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探
中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~
OSAL操作系统-实验20 模拟IIC通信+硬件IIC(Mpu6050)
一、AT命令初步(17)
AT 命令式通过串口来通信的
串口一有数据就会调用回调函数,为了防止回调函数被频繁调用,采用(延时+数据长度控制,即:超出某一时间或者超出某一长度就调用 NPI_ReadTransport(buffer,numBytes); 读取一定数据)
第224行将串口收到的数据调用AT指令处理函数进行处理:
1 // AT 命令处理 函数 2 bool simpleBLE_AT_CMD_Handle(uint8 * pBuffer, uint16 length) 3 { 4 bool ret = TRUE; 5 char strTemp[64]; 6 7 // 1、测试 8 if((length == 4) && str_cmp(pBuffer, "AT\r\n", 4))//AT 9 { 10 sprintf(strTemp, "OK\r\n"); 11 NPI_WriteTransport((uint8 * )strTemp, osal_strlen(strTemp)); 12 } 13 // 2、设置LED1的亮灭 14 else if((length == 9) && str_cmp(pBuffer, "AT+LED", 6)) 15 { 16 /* 17 Para: 0 ~ 1 18 AT+LED0\r\n: 关灯 19 AT+LED1\r\n: 开灯 20 Default: 0 21 */ 22 switch(pBuffer[6]) 23 { 24 case '?': 25 sprintf(strTemp, "OK+Get:%d\r\n", g_LED1); 26 NPI_WriteTransport((uint8 * )strTemp, osal_strlen(strTemp)); 27 break; 28 case '0': 29 g_LED1 = 0; 30 HalLedSet(HAL_LED_1, HAL_LED_MODE_OFF); // 关闭led1 31 sprintf(strTemp, "OK+Set0\r\n"); 32 NPI_WriteTransport((uint8 * )strTemp, osal_strlen(strTemp)); 33 break; 34 case '1': 35 g_LED1 = 1; 36 HalLedSet(HAL_LED_1, HAL_LED_MODE_ON); // 点亮led1 37 sprintf(strTemp, "OK+Set1\r\n"); 38 NPI_WriteTransport((uint8 * )strTemp, osal_strlen(strTemp)); 39 break; 40 default: 41 ret = FALSE; 42 break; 43 } 44 } 45 else 46 { 47 sprintf(strTemp, "ERROR\r\n"); 48 NPI_WriteTransport((uint8 * )strTemp, osal_strlen(strTemp)); 49 50 ret = FALSE; 51 } 52 53 return ret; 54 }
258 行, AT\r\n 为测试命令,
业界几乎所有的 AT 命令模块第一条 AT 命令都是这一条,用于测试模块连接是否正常。
264~288 行,我们编写了一个用于点灯的 AT 命令:
AT+LED?\r\n: 查询灯的开关状态
AT+LED0\r\n: 关灯
AT+LED1\r\n: 开灯
总结:整体比较简单就是将串口数据创送给AT指令处理函数处理,串口数据接收采用一定技巧
二、模拟IIC通信+硬件IIC(Mpu6050)20
Cc2541 有硬件 iic 功能,但 cc2540 并没有硬件 iic 功能
Description: This file contains code that is common to all sensor drivers.
在 Hal_sensor.c ti 已经实现了 cc2541 得硬件 iic 驱动,我们使用就行。
simpleBLETest.c中,编写的对 mpu6050 的访问函数。
以上两个函数,实现的是对mpu6050 的寄存器的读写操作。
以上两个文件,实现的是gpio 模拟 iic 的时序,并封装模拟 iic 的读写函数。
在Iic.h中我们定义了 P1.5 与 P1.6 作为 iic的SCL与SDA:
总结:IIC和MPU6050都封装的很好。协议栈是个好东西,方便移植!!!是个宝库!
上面是IIC的模拟实现,其硬件实现使用起来更简单:
在simpleBLETest.c直接将MPU6050的设备地址传送给I2C初始化函数就可以了,然后就直接调用读写函数进行读写!
未完~关注我的cc2541分类