【嵌入式開發】STM8S103F3P6單線半雙工串口通信

 最近突然接手一個項目,很基礎的一些單片機操作就可以完成,唯一值得說道的就是受限於任務要求,需要採用單線通信方式。拿到這個要求的時候有點懵,之前倒是從來沒有用過單線的串口通信。
 首先翻了下StrongerHuang的例程,沒有,看來還是隻能自己來了,在這也對StrongerHuang表示感謝,找到datasheet,這裏直接可以看到STM8支持單線半雙工,還有別的方法,後面再說。
 main features
 既然有這樣的功能,那麼再找找Reference manual看,所有的信息如下:
 single wire half duplex
 可以看到講得很簡單,主要就是控制寄存器的配置和引腳的設置。按照這個搞了一天都沒有弄出來。問題主要出在哪呢(直接馬後炮)?
 

  • 引腳使用。上面提到了單線半雙工使用的是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進行了操作。其他的配置和串口的使用都跟普通的串口一樣。不過如果是真實的半雙工對半雙工的話,就像手冊裏面說的,請設計好仲裁機構,注意通信的順利完成。
現在說說別的方式,最後並沒有採用這個方案,因爲設計硬件的人設計好了電路。那他是怎麼設計的呢?就是直接把普通的串口利用兩個光電隔離接在了一起,搜索了一下,這倒是很常見。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章