【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(); }