【嵌入式开发】STM8S103F3P6单线半双工串口通信
最近突然接手一个项目,很基础的一些单片机操作就可以完成,唯一值得说道的就是受限于任务要求,需要采用单线通信方式。拿到这个要求的时候有点懵,之前倒是从来没有用过单线的串口通信。
首先翻了下StrongerHuang的例程,没有,看来还是只能自己来了,在这也对StrongerHuang表示感谢,找到datasheet,这里直接可以看到STM8支持单线半双工,还有别的方法,后面再说。
既然有这样的功能,那么再找找Reference manual看,所有的信息如下:
可以看到讲得很简单,主要就是控制寄存器的配置和引脚的设置。按照这个搞了一天都没有弄出来。问题主要出在哪呢(直接马后炮)?
- 引脚使用。上面提到了单线半双工使用的是Tx脚,Rx脚是不用的。因为我这里主要是为了和上位机通信,另一端使用的是CH340做的模块,而无法将其设置为单线半双工模式,所以一定记得在发送和接收时切换CH340这端的Tx和Rx,比如做一个单刀双掷开关在切换时直接拨。
- 引脚配置。最后是在看了官方固件库之后完成的,这里有句话很有意思,Apart from this, the communications are similar to what is done in normal UART mode. 所以官方固件库的做法就是先按照正常配置,然后最后来个HDSEL的设置就OK了。而不要先去做别的配置(好吧,不求甚解了,按照官方配置通信没有问题之后没有去深究为什么)。
最后,Talk is cheap, show you my code.
//直接基于StrongerHuang的例程修改的,只展示最关键的部分
void UART_Initializes(void)
{
UART1_Init((uint32_t)9600, UART1_WORDLENGTH_8D, UART1_STOPBITS_1, UART1_PARITY_NO, UART1_SYNCMODE_CLOCK_DISABLE, UART1_MODE_TXRX_ENABLE);
/* Enable UART1 Half Duplex Mode*/
UART1_HalfDuplexCmd(ENABLE);
}
最后的这个半双工使能是这样的(STM8S的官方库里面有这个文件,路径是下面这个)
STM8S_StdPeriph_Lib\Project\STM8S_StdPeriph_Examples\UART1\UART1_HalfDuplex
void UART1_HalfDuplexCmd(FunctionalState NewState)
{
assert_param(IS_FUNCTIONALSTATE_OK(NewState));
if (NewState != DISABLE)
{
UART1->CR5 |= UART1_CR5_HDSEL; /**< UART1 Half Duplex Enable */
}
else
{
UART1->CR5 &= (uint8_t)~UART1_CR5_HDSEL; /**< UART1 Half Duplex Disable */
}
}
实际上就是对HDSEL进行了操作。其他的配置和串口的使用都跟普通的串口一样。不过如果是真实的半双工对半双工的话,就像手册里面说的,请设计好仲裁机构,注意通信的顺利完成。
现在说说别的方式,最后并没有采用这个方案,因为设计硬件的人设计好了电路。那他是怎么设计的呢?就是直接把普通的串口利用两个光电隔离接在了一起,搜索了一下,这倒是很常见。