串口收发9bit数据
一般情况下串口收发数据的格式基本都是1bit起始位,8bit数据位,1bit停止位。有时候一些串口协议会要求1bit起始位,9bit数据位,1bit停止位或者1bit起始位,8bit数据位,1bit奇偶校验位,1bit停止位此时就需要用到串口的9bit数据收发功能,我们的RISC-V系列MCU串口的数据寄存器USARTx_DataR的宽度本来就是9bit,因此都可以支持9bit数据收发。
9bit数据收发配置方式如下:
1.带奇偶校验位的9bit数据收发:
1 USART_InitStructure.USART_BaudRate = 115200; 2 3 USART_InitStructure.USART_WordLength = USART_WordLength_9b; 4 5 USART_InitStructure.USART_StopBits = USART_StopBits_1; 6 7 USART_InitStructure.USART_Parity = USART_Parity_Even;//奇偶校验位根据实际情况选择 8 9 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 10 11 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 12 13 USART_Init(USART1, &USART_InitStructure); 14 15 USART_Cmd(USART1, ENABLE);
2.不带奇偶校验位的9bit数据收发:
1 USART_InitStructure.USART_BaudRate = 115200; 2 3 USART_InitStructure.USART_WordLength = USART_WordLength_9b; 4 5 USART_InitStructure.USART_StopBits = USART_StopBits_1; 6 7 USART_InitStructure.USART_Parity = USART_Parity_No; 8 9 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; 10 11 USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx; 12 13 USART_Init(USART1, &USART_InitStructure); 14 15 USART_Cmd(USART1, ENABLE);
其实与普通的8位数据配置基本一致,只是数据长度要改成9bit,然后带奇偶校验时需要设置好奇校验或者偶校验就可以,带奇偶校验的收发在收发数据时硬件会自动根据收发的数据进行奇偶计算并校验;对于不带奇偶校验功能的收发要注意收发数据的变量或数组要设置为uint_16t形式,并且数据要控制不能大于0x1FF,串口的收发库函数也会对收发的数据做过滤,如下:
1 void USART_SendData(USART_TypeDef *USARTx, uint16_t Data) 2 3 { 4 5 USARTx->DATAR = (Data & (uint16_t)0x01FF); 6 7 }
1 uint16_t USART_ReceiveData(USART_TypeDef *USARTx) 2 3 { 4 5 return (uint16_t)(USARTx->DATAR & (uint16_t)0x01FF); 6 7 }
因找不到9bit数据位的串口助手,该测试使用两颗MCU互相收发数据验证。