1. CC2541通过串口和PM25设备PMS7003通信,串口9600波特率,手机APP显示数据一直是128,先检查蓝牙数据通路问题,数据通路没问题
2. 看下串口是否OK,串口也不通,看到宏定义ZAPP_P2,不清楚是什么用途,本次使用P0_4,P0_5,串口UART1的ALT1。使用宏定义ZAPP_P2和uart_alt1,去掉宏定义CC2540_MINIDK,增加HAL_UART=TRUE,关闭流控#define NPI_UART_FC FALSE,关闭功耗控制xPOWER_SAVING
3. 修改串口波特率9600。
1 #define NPI_UART_BR HAL_UART_BR_9600
4. 修改串口的引脚
1 #define PxSEL P0SEL //串口配置到P0口 2 #define HAL_UART_PERCFG_BIT 0x00 // USART1 on P0, Alt-1; so clear this bit,使用ALT1,所以清零 3 #define HAL_UART_PRIPO 0x40 // USART0 priority over UART1.串口优先级 4 #define HAL_UART_Px_CTS 0x04 // Peripheral I/O Select for CTS flow control. 串口流控引脚 5 #define HAL_UART_Px_RTS 0x08 // Peripheral I/O Select for RTS must be manual. 串口流控引脚 6 #define HAL_UART_Px_SEL 0x30 // Peripheral I/O Select for Rx/Tx. 串口的RXD和TXD引脚,P0_4和P0_5
5. 修改串口的中断配置,疑问是为啥是用P0中断,而不是UART1的RXD中断?
1 #define PxDIR P0DIR //串口在P0 2 #define PxIEN P0IEN //P0中断使能 3 #define PxIFG P0IFG //P0中断使能 4 #define PxIF P0IF 5 #define DMA_RDYIn P0_2 //CTS流控引脚 6 #define DMA_RDYOut P0_3 //RTS流控引脚 7 #define DMA_RDYIn_BIT BV(2) // Same as the I/O Select for CTS flow control.//CTS流控引脚 8 #define DMA_RDYOut_BIT BV(3) // Same as the I/O Select for manual RTS flow ctrl.//RTS流控引脚 9 // Falling edge ISR on P1.4-7 pins. 10 #define PICTL_BIT BV(0) // 中断边沿检测 11 #define IENx IEN1 //中断使能寄存器,这里的疑问就是为啥使能的是P0的中断,不是UART1的RXD中断 12 #define IEN_BIT BV(5) //中断使能寄存器第5位P0IE
6. 修改中断函数halUart0TxIsr
1 HAL_ISR_FUNCTION( halUart0TxIsr, UTX0_VECTOR ) 2 { 3 HAL_ENTER_ISR(); 4 5 if (dmaCfg.txHead == dmaCfg.txTail) 6 { 7 IEN2 &= ~UTXxIE; 8 dmaCfg.txMT = 1; 9 } 10 else 11 { 12 UTXxIF = 0; 13 UxDBUF = dmaCfg.txBuf[dmaCfg.txHead++]; 14 15 if ((HAL_UART_DMA_TX_MAX != 256) && (dmaCfg.txHead >= HAL_UART_DMA_TX_MAX)) 16 { 17 dmaCfg.txHead = 0; 18 } 19 } 20 21 HAL_EXIT_ISR(); 22 }
7. 看下IEN1的寄存器
1 SFRBIT( IEN1 , 0xB8, _IEN17, _IEN16, P0IE, T4IE, T3IE, T2IE, T1IE, DMAIE )
8. 串口初始化函数和发送
1 NPI_InitTransport(NpiSerialCallback); 2 uart1Send("1h1h0",5);
9. 串口接收回调函数
1 uint8 buffer[32] = {0}; 2 static void NpiSerialCallback(uint8 port, uint8 events) 3 { 4 (void) port; 5 if(events & (HAL_UART_RX_TIMEOUT | HAL_UART_RX_FULL)) // 6 { 7 uint8 num_bytes = 0; 8 num_bytes = NPI_RxBufLen(); //读取串口缓冲区有多少个字节 9 NPI_ReadTransport(buffer, num_bytes); 10 }
10. 完成,可以正常的收发数据。