单线半双工通信的官方资料
单线半双方模式通过设置USART_CR3寄存器的HDSEL位选择。在这个模式里,下面的位必须保持清零状态:
● USART_CR2寄存器的LINEN和CLKEN位
● USART_CR3寄存器的SCEN和IREN位
USART可以配置成遵循单线半双工协议。在单线半双工模式下,TX和RX引脚在芯片内部互连。使用控制位”HALF DUPLEX SEL”(USART_CR3中的HDSEL位)选择半双工和全双工通信。
当HDSEL为’1’时
● RX不再被使用
● 当没有数据传输时,TX总是被释放。因此,它在空闲状态的或接收状态时表现为一个标准I/O口。这就意味该I/O在不被USART驱动时,必须配置成悬空输入(或开漏的输出高)。
除此以外,通信与正常USART模式类似。由软件来管理线上的冲突(例如通过使用一个*仲裁器)。特别的是,发送从不会被硬件所阻碍。当TE位被设置时,只要数据一写到数据寄存器上,发送就继续。
关于上文提到的寄存器及对应的位
1.首先是CR3:
对应代码:USART1->CR3|=1<<3;
USART1->CR3&=~(1<<1);
USART1->CR3&=~(1<<5);
2.然后是CR2:
对应代码:
USART1->CR2&=~(1<<14);
USART1->CR2&=~(1<<11);
修改代码(以实验4 串口实验为模板)
uart_init()部分修改如下:
1.去掉PA10的GPIO_Init部分
2.添加几个寄存器相关代码
中断部分我添加了“如果单片机收到数据,则灯亮”的代码。
主函数我改成了按键发送:
注意事项
因为设置为单线半双工通信后,原来的TXD和RXD现在是连接在一起的,所以用TXD发送数据时,同样可以触发中断,(也就是串口发送的数据串口自身会接收到),所以需要软件设置好相关内容。
硬件连接
最后验证时,按KEY0发送数据,PA9接U转串的RXD,或者直接用板载的USB接口,接收数据时,PA9接U转串的TXD。