• 售前

  • 售后

热门帖子
入门百科

CC2541增长特性值 CHAR6实现串口透传

[复制链接]
杨俊语语il 显示全部楼层 发表于 2021-11-24 15:51:53 |阅读模式 打印 上一主题 下一主题
一、实现串口

1.1、CC2541的串口简介

  CC2541有21个数字输入/输出引脚, 可以配置为通用数字I/O或外设I/O信号, 配置为毗连到ADC、 定时器或 USART外设。这些 I/O 口的用途可以通过一系列寄存器配置,由用户软件加以实现。
  对于 USART 和定时器 I/O,在一个数字 I/O 引脚上选择外设 I/O 功能,须要设置对应的 PxSEL 位为 1。
  外设 I/O 引脚映射如下图所示:


1.2、CC2541串口的寄存器实现方法

  对于每个 USART,有 5 个如下的寄存器(x 是 USART 的编号,为 0 大概1):
  ● UxCSR: USARTx 控制和状态;
  ● UxUCR: USARTx UART 控制;
  ● UxGCR: USARTx 通用控制
  ● UxBUF: USART x 接收/发送数据缓冲
  ● UxBAUD: USART x 波特率控
  CC2541 配置串口的一样平常步骤:
  1、 配置 IO,使用外部装备功能。
  2、 配置相应串口的控制和状态寄存器。
  3、 配置串口工作的波特率。
  具体代码如下:
  1. #include <ioCC2540.h>
  2. #include <string.h>
  3. #include "uart.h"
  4. /*
  5. 串口0,应用的IO口为:RX P0.2                       TX P0.3
  6. */
  7. #define Uart0_SIZE       40
  8. int8 Rx_Flag0=0;
  9. uint8 Rx_length0=0;
  10. uint8 RxData0[Uart0_SIZE];        //存储接收字符串
  11. /****************************************************************************
  12. * 名    称: InitUart()
  13. * 功    能: 串口初始化函数
  14. * 入口参数: 无
  15. * 出口参数: 无
  16. ****************************************************************************/
  17. void Uart0_Init(void)
  18. {
  19.     PERCFG &= ~0x01;        //外设控制寄存器 USART 0的IO位置:0为P0口位置1
  20.     P0SEL = 0x0c;            //P0_2,P0_3用作串口(外设功能)
  21.     P2DIR &= ~0xC0;          //P0优先作为UART0
  22.    
  23.     U0CSR |= 0x80;           //设置为UART方式
  24.     U0GCR |= 11;                                       
  25.     U0BAUD |= 216;           //波特率设为115200
  26.     UTX0IF = 0;              //UART0 TX中断标志初始置位0
  27.     U0CSR |= 0x40;           //允许接收
  28.     IEN0 |= 0x84;            //开总中断允许接收中断  
  29. }
  30. /****************************************************************************
  31. * 名    称: UartSendString()
  32. * 功    能: 串口发送函数
  33. * 入口参数: Data:发送缓冲区   len:发送长度
  34. * 出口参数: 无
  35. ****************************************************************************/
  36. void Uart0_Send(uint8 *Data, uint8 len)
  37. {
  38.     uint8 i;
  39.     U0CSR &= ~0x40;                    //禁止接收
  40.     for(i=0; i<len; i++)
  41.     {
  42.         U0DBUF = *Data++;
  43.         while(UTX0IF == 0);
  44.         UTX0IF = 0;
  45.     }
  46.         U0CSR |= 0x40;                     //允许接收
  47. }
  48. /****************************************************************************
  49. * 名    称: UART0_ISR(void) 串口中断处理函数
  50. * 描    述: 当串口0产生接收中断,将收到的数据保存在RxBuf中
  51. ****************************************************************************/
  52. uint8 ptrdata=0;
  53. #pragma vector = URX0_VECTOR
  54. __interrupt void UART0_ISR(void)
  55. {
  56.     URX0IF = 0;       // 清中断标志
  57.     ptrdata=U0DBUF;
  58.         if(ptrdata!=0x00)/* 因为工程特殊性,过滤掉0X00 */
  59.         {
  60.                     if(Rx_length0<Uart0_SIZE)RxData0[Rx_length0] = ptrdata;     
  61.                  Rx_length0++;
  62.         }
  63. }
  64. uint8 Uart0_Read(uint8 *Data)
  65. {
  66.         if(Rx_length0==0)//接收数据bit为零
  67.         {
  68.                 return 0;
  69.         }else
  70.         {
  71.                 if(Rx_Flag0==0)//接收数据长度为零,(此时正在接收数据)
  72.                 {
  73.                         Rx_Flag0=Rx_length0;
  74.                         return 0;
  75.                 }else
  76.                 {
  77.                         if(Rx_Flag0!=Rx_length0)//接收长度数据有变化,认为数据接收没有收完
  78.                         {
  79.                                 Rx_Flag0=Rx_length0;
  80.                                 return 0;
  81.                         }else//接收数据长度在一个隔离周期(10ms)后没有变化,认为接收完成
  82.                         {
  83.                                 uint8 length=Rx_Flag0;
  84.                                 for(uint8 i=0;i<Rx_Flag0;i++)
  85.                                 {
  86.                                         Data[i]=RxData0[i];
  87.                                 }
  88.                                 Rx_length0=0;
  89.                                 Rx_Flag0=0;
  90.                                 return length;
  91.                         }
  92.                 }
  93.         }
  94. }
复制代码
2.6.3、增长关照开关的处理处罚

  替换 simpleGATTprofile.c文件 的 simpleProfile_WriteAttrCB 函数中的 GATT_CLIENT_CHAR_CFG_UUID 部分
  1. /*******************************************************************************
  2. * @fn          NPI_InitTransport
  3. *
  4. * @brief       This routine initializes the transport layer and opens the port
  5. *              of the device. Note that based on project defines, either the
  6. *              UART, USB (CDC), or SPI driver can be used.
  7. *
  8. * input parameters
  9. *
  10. * @param       npiCback - User callback function when data is available.
  11. *
  12. * output parameters
  13. *
  14. * @param       None.
  15. *
  16. * @return      None.
  17. */
  18. void NPI_InitTransport( npiCBack_t npiCBack )
  19. {
  20.   halUARTCfg_t uartConfig;
  21.   // configure UART
  22.   uartConfig.configured           = TRUE;
  23.   uartConfig.baudRate             = NPI_UART_BR;
  24.   uartConfig.flowControl          = NPI_UART_FC;
  25.   uartConfig.flowControlThreshold = NPI_UART_FC_THRESHOLD;
  26.   uartConfig.rx.maxBufSize        = NPI_UART_RX_BUF_SIZE;
  27.   uartConfig.tx.maxBufSize        = NPI_UART_TX_BUF_SIZE;
  28.   uartConfig.idleTimeout          = NPI_UART_IDLE_TIMEOUT;
  29.   uartConfig.intEnable            = NPI_UART_INT_ENABLE;
  30.   uartConfig.callBackFunc         = (halUARTCBack_t)npiCBack;
  31.   // start UART
  32.   // Note: Assumes no issue opening UART port.
  33.   (void)HalUARTOpen( NPI_UART_PORT, &uartConfig );
  34.   return;
  35. }
复制代码
2.7、增长 char6 的关照开关初始化

  替换 simpleGATTprofile.c文件中 的 SimpleProfile_AddService函数
  1. void My_NPI_InitTransport( npiCBack_t npiCBack, uint8 baudrate, uint8 parity, uint8 stopbit)
  2. {
  3.   halUARTCfg_t uartConfig;
  4.   // configure UART
  5.   uartConfig.configured           = TRUE;
  6.   uartConfig.baudRate             = baudrate;//NPI_UART_BR;
  7.   uartConfig.parity              = parity;
  8.   uartConfig.stopbit              = stopbit;
  9.   uartConfig.flowControl          = NPI_UART_FC;
  10.   uartConfig.flowControlThreshold = NPI_UART_FC_THRESHOLD;
  11.   uartConfig.rx.maxBufSize        = NPI_UART_RX_BUF_SIZE;
  12.   uartConfig.tx.maxBufSize        = NPI_UART_TX_BUF_SIZE;
  13.   uartConfig.idleTimeout          = NPI_UART_IDLE_TIMEOUT;
  14.   uartConfig.intEnable            = NPI_UART_INT_ENABLE;
  15.   uartConfig.callBackFunc         = (halUARTCBack_t)npiCBack;
  16.   // start UART
  17.   // Note: Assumes no issue opening UART port.
  18.   (void)HalUARTOpen( NPI_UART_PORT, &uartConfig );
  19.   return;
  20. }
复制代码
2.8 、 增 加 char6 的 通 知 开 关 初 始 化 的 实 时 更 新

   替 换 simpleGATTprofile.c文件中 的simpleProfile_HandleConnStatusCB 函数
  1. static void NpiSerialCallback( uint8 port, uint8 events )
  2. {
  3.         (void)port;//加个 (void),是未了避免编译告警,明确告诉缓冲区不用理会这个变量
  4.         if (events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL)) //串口有数据
  5.         {
  6.                 uint8 numBytes = 0;
  7.                 numBytes = NPI_RxBufLen(); //读出串口缓冲区有多少字节
  8.         if(numBytes == 0)
  9.         {
  10.                 return;
  11.         }else
  12.         {
  13.                 uint8 *buffer = osal_mem_alloc(numBytes);//申请缓冲区 buffer
  14.                 if(buffer)
  15.                 {               
  16.                         NPI_ReadTransport(buffer,numBytes);//读取读取串口缓冲区数据,释放串口数据
  17.                         /*
  18.                                 ......
  19.                                 //        数据处理       
  20.                                 //蓝牙串口透传时,可以在此处调用BLE发送数据的方法
  21.                                 .......
  22.                         */
  23.                        
  24.                         osal_mem_free(buffer);//释放申请的缓冲区
  25.                 }
  26.         }
  27.         }
  28. }
复制代码
2.9、应用层修改

2.9.1、修改特性值初始化的数值

  在 simpleBLEPeripheral.c文件 的 SimpleBLEPeripheral_Init 函数
中添加
  1. /*******************************************************************************
  2. * @fn          NPI_WriteTransport
  3. *
  4. * @brief       This routine writes data from the buffer to the transport layer.
  5. *
  6. * input parameters
  7. *
  8. * @param       buf - Pointer to buffer to write data from.
  9. * @param       len - Number of bytes to write.
  10. *
  11. * output parameters
  12. *
  13. * @param       None.
  14. *
  15. * @return      Returns the number of bytes written to transport.
  16. */
  17. uint16 NPI_WriteTransport( uint8 *buf, uint16 len )
  18. {
  19. return( HalUARTWrite( NPI_UART_PORT, buf, len ) );
  20. }
复制代码
2.9.2、修改应用层的回调函数

  在 simpleBLEPeripheral.c文件的 的 simpleProfileChangeCB 函数中
  1. // Profile Parameters
  2. #define SIMPLEPROFILE_CHAR1                   0  // RW uint8 - Profile Characteristic 1 value
  3. #define SIMPLEPROFILE_CHAR2                   1  // RW uint8 - Profile Characteristic 2 value
  4. #define SIMPLEPROFILE_CHAR3                   2  // RW uint8 - Profile Characteristic 3 value
  5. #define SIMPLEPROFILE_CHAR4                   3  // RW uint8 - Profile Characteristic 4 value
  6. #define SIMPLEPROFILE_CHAR5                   4  // RW uint8 - Profile Characteristic 4 value
  7. #define SIMPLEPROFILE_CHAR6                   5  // RW uint8 - Profile Characteristic 5 value
  8. // Simple Profile Service UUID
  9. #define SIMPLEPROFILE_SERV_UUID               0xFFE0
  10.    
  11. // Key Pressed UUID
  12. #define SIMPLEPROFILE_CHAR1_UUID            0xFFE6
  13. #define SIMPLEPROFILE_CHAR2_UUID            0xFFE5
  14. #define SIMPLEPROFILE_CHAR3_UUID            0xFFE4
  15. #define SIMPLEPROFILE_CHAR4_UUID            0xFFE3
  16. #define SIMPLEPROFILE_CHAR5_UUID            0xFFE2
  17. #define SIMPLEPROFILE_CHAR6_UUID            0xFFE1
  18.   
  19. // Simple Keys Profile Services bit fields
  20. #define SIMPLEPROFILE_SERVICE               0x00000001
  21. // Length of Characteristic 5 in bytes
  22. #define SIMPLEPROFILE_CHAR5_LEN          5
  23. #define SIMPLEPROFILE_CHAR6_LEN          20
  24.   
复制代码
三、实现串口0和BLE数据透传

3.1、串口接收数据并通过无线发送

  在1.3.3章节界说的串口回调函数NpiSerialCallback()中可以接收串口数据,此时可以通过调用无线发送数据的函数,将数据发送出去。数据发送函数如下:
  1. // Characteristic 6 UUID: 0xFFE1
  2. CONST uint8 simpleProfilechar6UUID[ATT_BT_UUID_SIZE] =
  3. {
  4.   LO_UINT16(SIMPLEPROFILE_CHAR6_UUID), HI_UINT16(SIMPLEPROFILE_CHAR6_UUID)
  5. };
复制代码
3.2、无线接收数据并通过串口发送

  在2.9.2章节中修改的应用层的回调函数simpleProfileChangeCB()可以接收无线数据,在此处可以将无线数据通过串口发送出去。
四、实现串口1和BLE数据透传

4.1、在IAR 设置中添加宏界说

  ZAPP_P2=TRUE
  如图所示:
4.2、修改串口配置

  在npi.h文件内修改串口配置如下:
  1. // Simple Profile Characteristic 6 Properties
  2. static uint8 simpleProfileChar6Props = GATT_PROP_READ | GATT_PROP_WRITE_NO_RSP | GATT_PROP_NOTIFY;
  3. // Characteristic 6 Value
  4. static uint8 simpleProfileChar6[SIMPLEPROFILE_CHAR6_LEN] = { 0, 0, 0, 0, 0 };
  5. static uint8 simpleProfileChar6Len = 0;
  6. // Simple Profile Characteristic 6 Configuration Each client has its own
  7. // instantiation of the Client Characteristic Configuration. Reads of the
  8. // Client Characteristic Configuration only shows the configuration for
  9. // that client and writes only affect the configuration of that client.
  10. static gattCharCfg_t simpleProfileChar6Config[GATT_MAX_NUM_CONN];
  11. // Simple Profile Characteristic 6 User Description
  12. static uint8 simpleProfileChar6UserDesp[17] = "Characteristic 6\0";
复制代码
4.3、添加串口一的IO口初始化代码

  在1.3.2章节的串口初始化函数调用前添加串口1的IO口初始化代码,如下:
  1.     // Characteristic 6 Declaration
  2.     {
  3.       { ATT_BT_UUID_SIZE, characterUUID },
  4.       GATT_PERMIT_READ,
  5.       0,
  6.       &simpleProfileChar6Props
  7.     },
  8.       // Characteristic Value 6
  9.       {
  10.         { ATT_BT_UUID_SIZE, simpleProfilechar6UUID },
  11.         GATT_PERMIT_READ | GATT_PERMIT_WRITE,
  12.         0,
  13.         simpleProfileChar6
  14.       },
  15.       // Characteristic 6 configuration
  16.       {
  17.         { ATT_BT_UUID_SIZE, clientCharCfgUUID },
  18.         GATT_PERMIT_READ | GATT_PERMIT_WRITE,
  19.         0,
  20.         (uint8 *)simpleProfileChar6Config
  21.       },
  22.       // Characteristic 6 User Description
  23.       {
  24.         { ATT_BT_UUID_SIZE, charUserDescUUID },
  25.         GATT_PERMIT_READ,
  26.         0,
  27.         simpleProfileChar6UserDesp
  28.       },
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作