×
嵌入式 > 技术百科 > 详情

【嵌入式开发】STM8S103F3P6单线半双工串口通信

发布时间:2020-12-28 发布时间:
|

最近突然接手一个项目,很基础的一些单片机操作就可以完成,唯一值得说道的就是受限于任务要求,需要采用单线通信方式。拿到这个要求的时候有点懵,之前倒是从来没有用过单线的串口通信。 

首先翻了下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_LibProjectSTM8S_StdPeriph_ExamplesUART1UART1_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进行了操作。其他的配置和串口的使用都跟普通的串口一样。不过如果是真实的半双工对半双工的话,就像手册里面说的,请设计好仲裁机构,注意通信的顺利完成。 


现在说说别的方式,最后并没有采用这个方案,因为设计硬件的人设计好了电路。那他是怎么设计的呢?就是直接把普通的串口利用两个光电隔离接在了一起,搜索了一下,这倒是很常见。 

 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
洪荒之力+无比专注=国内首款机器人离线编程软件