最近突然接手一個項目,很基礎的一些單片機操作就可以完成,唯一值得說道的就是受限於任務要求,需要採用單線通信方式。拿到這個要求的時候有點懵,之前倒是從來沒有用過單線的串口通信。
首先翻了下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進行了操作。其他的配置和串口的使用都跟普通的串口一樣。不過如果是真實的半雙工對半雙工的話,就像手冊裏面說的,請設計好仲裁機構,注意通信的順利完成。
現在說說別的方式,最後並沒有採用這個方案,因爲設計硬件的人設計好了電路。那他是怎麼設計的呢?就是直接把普通的串口利用兩個光電隔離接在了一起,搜索了一下,這倒是很常見。