最近突然接手一个项目,很基础的一些单片机操作就可以完成,唯一值得说道的就是受限于任务要求,需要采用单线通信方式。拿到这个要求的时候有点懵,之前倒是从来没有用过单线的串口通信。
首先翻了下StrongerHuang的例程,没有,看来还是只能自己来了,在这也对StrongerHuang表示感谢,找到datasheet,这里直接可以看到STM8支持单线半双工,还有别的方法,后面再说。
既然有这样的功能,那么再找找Reference manual看,所有的信息如下:
可以看到讲得很简单,主要就是控制寄存器的配置和引脚的设置。按照这个搞了一天都没有弄出来。问题主要出在哪呢(直接马后炮)?
最后,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进行了操作。其他的配置和串口的使用都跟普通的串口一样。不过如果是真实的半双工对半双工的话,就像手册里面说的,请设计好仲裁机构,注意通信的顺利完成。
现在说说别的方式,最后并没有采用这个方案,因为设计硬件的人设计好了电路。那他是怎么设计的呢?就是直接把普通的串口利用两个光电隔离接在了一起,搜索了一下,这倒是很常见。
原文:https://www.cnblogs.com/portb/p/12037326.html