【IoT】蓝牙BLE基础:CC254x通信系列之模拟UART协议

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(); 
}
经验分享 程序员 微信小程序 职场和发展