【IoT】蓝牙BLE基础:CC254x通信系列之模拟UART协议
        【摘要】 
                    CC254x 模拟 UART: 
1、波特率配置 
/* 波特率配置 */void uart_InitUartS( uint8 baudRate ){  timeoutT3CTL = 0xE3;                      // 设置为 128 分频(BIT[7:5] = 111),不启用中断,正数/倒数模式(BIT[1:...
    
    
    
    CC254x 模拟 UART:
1、波特率配置
  
   - 
    
     
    
    
     
      /* 波特率配置 */
     
    
 
   - 
    
     
    
    
     
      void uart_InitUartS( uint8 baudRate )
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
        timeoutT3CTL = 0xE3;                      // 设置为 128 分频(BIT[7:5] = 111),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
        timeoutT3CC0 = 22;                        // 载入数 = 0.17 / 1000 * 32M / 128 / 2 = 22
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
        // 串口通讯时钟设置
     
    
 
   - 
    
     
    
    
     
        switch( baudRate )
     
    
 
   - 
    
     
    
    
     
        {
     
    
 
   - 
    
     
    
    
     
          case UART_BR_9600:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x63;                  // 设置为 8 分频(BIT[7:5] = 011),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 208;                   // 载入数 = 32M / 9600 / 8 / 2 = 208
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_14400:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x63;                  // 设置为 8 分频(BIT[7:5] = 011),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 139;                   // 载入数 = 32M / 14400 / 8 / 2 = 139
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_19200:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x43;                  // 设置为 4 分频(BIT[7:5] = 010),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 208;                   // 载入数 = 32M / 19200 / 4 / 2 = 208
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_28800:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x43;                  // 设置为 4 分频(BIT[7:5] = 010),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 139;                   // 载入数 = 32M / 28800 / 4 / 2 = 139
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_38400:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x23;                  // 设置为 2 分频(BIT[7:5] = 001),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 208;                   // 载入数 = 32M / 38400 / 2 / 2 = 208
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_57600:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x23;                  // 设置为 2 分频(BIT[7:5] = 001),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 139;                   // 载入数 = 32M / 57600 / 2 / 2 = 139
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_76800:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x23;                  // 设置为 2 分频(BIT[7:5] = 001),不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 104;                   // 载入数 = 32M / 76800 / 2 / 2 = 104
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          case UART_BR_115200:
     
    
 
   - 
    
     
    
    
     
          default:
     
    
 
   - 
    
     
    
    
     
            {
     
    
 
   - 
    
     
    
    
     
              clockT3CTL = 0x03;                  // 设置为不分频,不启用中断,正数/倒数模式(BIT[1:0]=11)
     
    
 
   - 
    
     
    
    
     
              clockT3CC0 = 139;                   // 载入数 = 32M / 115200 / 2 = 139
     
    
 
   - 
    
     
    
    
     
            } break;
     
    
 
   - 
    
     
    
    
     
        }
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
2、定时器配置
  
   - 
    
     
    
    
     
      //启动 TIMER3 - 开始通讯计时:(1)清除计数值 T3CTL[2]=1  (2)开始计数 T3CTL[4]=1
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      #define UART_CLOCK_START()                                { T3CC0 = clockT3CC0; T3CTL = clockT3CTL | 0x14; }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      //暂停 TIMER3 - 停止串口时钟: (1)停止计数 T3CTL[4]=0
     
    
 
   - 
    
     
    
    
     
      #define UART_CLOCK_STOP()                                 { T3CTL &= 0xEF; }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      //等待 TIMER3 - 延时达到串口通讯要求的时钟周期
     
    
 
   - 
    
     
    
    
     
      #define WAIT_TF()                                         { while(!T3OVFIF); T3OVFIF = 0; }
     
    
 
  
 
3、初始化配置
  
   - 
    
     
    
    
     
      void io_config_pin()
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
        P0SEL &= ~BV(2); //gpio   P0_2
     
    
 
   - 
    
     
    
    
     
        P0DIR &= ~BV(2); //input
     
    
 
   - 
    
     
    
    
     
        P0INP &= ~BV(2); //pull_down & up
     
    
 
   - 
    
     
    
    
     
        P0IEN |= BV(2);  //enable irq
     
    
 
   - 
    
     
    
    
     
        P0 |= BV(2);     //high
     
    
 
   - 
    
     
    
    
       
     
    
 
   - 
    
     
    
    
     
        P0SEL &= ~BV(3); //gpio   P0_3
     
    
 
   - 
    
     
    
    
     
        P0DIR |= BV(3);  //output
     
    
 
   - 
    
     
    
    
     
        P0INP &= ~BV(3); //pull_down & up
     
    
 
   - 
    
     
    
    
     
        P0IEN &= ~BV(3);  //disable irq
     
    
 
   - 
    
     
    
    
     
        //P0IEN |= BV(3);
     
    
 
   - 
    
     
    
    
     
        P0 |= BV(3);     //highs
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
4、发送数据
  
   - 
    
     
    
    
     
      #define UARTS_TX_BYTE(_pin, _byte) \    //先发低位
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      { \
     
    
 
   - 
    
     
    
    
     
        uint8 _bit = 8; \
     
    
 
   - 
    
     
    
    
     
        UART_CLOCK_START(); \
     
    
 
   - 
    
     
    
    
     
        _pin = 0; \             //发送起始位—0
     
    
 
   - 
    
     
    
    
     
        WAIT_TF(); \
     
    
 
   - 
    
     
    
    
     
        while ( _bit-- ) \
     
    
 
   - 
    
     
    
    
     
        { \
     
    
 
   - 
    
     
    
    
     
          _pin = _byte & 0x01; \
     
    
 
   - 
    
     
    
    
     
          WAIT_TF(); \
     
    
 
   - 
    
     
    
    
     
          _byte >>= 1; \
     
    
 
   - 
    
     
    
    
     
        } \
     
    
 
   - 
    
     
    
    
     
        _pin = 1; \            //发送结束位—1
     
    
 
   - 
    
     
    
    
     
        WAIT_TF(); \
     
    
 
   - 
    
     
    
    
     
        UART_CLOCK_STOP(); \
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
5、读取数据
  
   - 
    
     
    
    
     
      #define UARTS_RX_BYTE(_pin, _byte) \
     
    
 
   - 
    
     
    
    
     
      { \
     
    
 
   - 
    
     
    
    
     
        uint8 _bit = 8; \
     
    
 
   - 
    
     
    
    
     
        _byte = 0; \
     
    
 
   - 
    
     
    
    
     
        UART_CLOCK_START(); \
     
    
 
   - 
    
     
    
    
     
        WAIT_TF(); \
     
    
 
   - 
    
     
    
    
     
        while ( _bit-- ) \
     
    
 
   - 
    
     
    
    
     
        { \
     
    
 
   - 
    
     
    
    
     
          _byte >>= 1; \
     
    
 
   - 
    
     
    
    
     
          if ( _pin ) _byte |= 0x80; \
     
    
 
   - 
    
     
    
    
     
          WAIT_TF(); \
     
    
 
   - 
    
     
    
    
     
        } \
     
    
 
   - 
    
     
    
    
     
        while ( !T3OVFIF ) \
     
    
 
   - 
    
     
    
    
     
        { \
     
    
 
   - 
    
     
    
    
     
          if ( _pin ) break; \
     
    
 
   - 
    
     
    
    
     
        } \
     
    
 
   - 
    
     
    
    
     
        UART_CLOCK_STOP(); \
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
文章来源: blog.csdn.net,作者:简一商业,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/liwei16611/article/details/73421506
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)