標(biāo)題: 一個(gè)關(guān)于UART通信奇偶校驗(yàn)出錯(cuò)位的讀取話題 [打印本頁(yè)]

作者: taoran    時(shí)間: 2016-11-3 11:58
標(biāo)題: 一個(gè)關(guān)于UART通信奇偶校驗(yàn)出錯(cuò)位的讀取話題
某客戶使用STM32F4系列芯片做產(chǎn)品開發(fā),用到USART外設(shè),將其配置在智能卡模式。USART配置為智能卡模式后,并開啟了奇偶校驗(yàn)。

當(dāng)MCU通過UART從卡端讀取數(shù)據(jù)時(shí),如果讀到的數(shù)據(jù)發(fā)生奇偶校驗(yàn)錯(cuò)誤,根據(jù)相關(guān)通信協(xié)議,USART硬件會(huì)自動(dòng)在剛收到數(shù)據(jù)的結(jié)尾處強(qiáng)行拉低數(shù)據(jù)線一個(gè)時(shí)間段告知智能卡控制器,表示USART接收到的數(shù)據(jù)奇偶校驗(yàn)有錯(cuò),期待數(shù)據(jù)重發(fā)。


他發(fā)現(xiàn),當(dāng)UART從智能卡接收數(shù)據(jù)遇到奇偶校驗(yàn)出錯(cuò)時(shí),的確可以從硬件線路上觀測(cè)到數(shù)據(jù)的重發(fā)?伤能浖邮沾a里卻沒法分辨數(shù)據(jù)正誤,也就是說(shuō)不管是否發(fā)生校驗(yàn)錯(cuò)誤,一律當(dāng)作正確的數(shù)據(jù)接收了進(jìn)來(lái)。他覺得甚為奇怪。

重點(diǎn)懷疑代碼問題,查看其相關(guān)代碼,他的數(shù)據(jù)接收流程大致是這樣的:

先檢測(cè)到USART_SR寄存器中的RXNE為1;然后從USAR_DR寄存器讀取數(shù)據(jù);再接著檢測(cè)USART_SR寄存器中的校驗(yàn)出錯(cuò)位PE位是否為1,如果是1則丟棄剛才收到的數(shù)據(jù)。咋看上去,貌似沒啥問題。
如果查看STM32相關(guān)芯片的參考手冊(cè)就會(huì)發(fā)現(xiàn),通過對(duì)USART_SR的讀和接著對(duì)USART_DR的讀操作序列會(huì)導(dǎo)致對(duì)RXNE和PE位的清零。


既然這樣,按照該客戶的做法,先讀SR,然后讀DR。這個(gè)連續(xù)操作之后已經(jīng)就將RXNE和PE清零了,若再來(lái)讀PE,永遠(yuǎn)讀不到它為1的時(shí)候,即發(fā)現(xiàn)不了校驗(yàn)出錯(cuò)的情況,自然導(dǎo)致數(shù)據(jù)全部被當(dāng)做正確的收納了。


所以,他的接收代碼需要稍微調(diào)整下,先檢查到RXNE為1后,接著檢查PE是否為1,根據(jù)PE是否為1 來(lái)決定從DR中讀得數(shù)據(jù)的取舍并完成對(duì)PE和RXNE的清零。


STM32的寄存器中,尤其是那些狀態(tài)寄存器的部分狀態(tài)標(biāo)志的置位和清零并不一定是簡(jiǎn)單地、對(duì)應(yīng)地直接置1寫0。比方有些寄存器位的清零是對(duì)相關(guān)寄存器位寫1;有些寄存器位的清零則個(gè)軟件操作序列。比方STM32F4/STM32F1系列中USART的PE位、ORE位就是通過軟件操作序列實(shí)現(xiàn)清零。STM32產(chǎn)品線眾多,即使相同外設(shè)的寄存器不同系列間的操作可能略有差異。比如這里談到的USART的PE位、ORE位,在STM32F0系列里是可以通過軟件對(duì)相關(guān)寄存器位寫1達(dá)到對(duì)其清零的目的,此時(shí)無(wú)需軟件操作序列。


當(dāng)然,如果你使用ST官方的參考庫(kù)函數(shù)的話,有些細(xì)節(jié)可能感受不到。開發(fā)過程中在具體使用到某些并不熟悉的寄存器位時(shí),適當(dāng)?shù)睾藢?duì)下手冊(cè)往往是個(gè)不錯(cuò)的舉動(dòng)。有時(shí)一個(gè)無(wú)意的想當(dāng)然的舉動(dòng)可能會(huì)浪費(fèi)很多時(shí)間和精力。


簡(jiǎn)單問題,分享出來(lái),互為提醒。其實(shí),開發(fā)過程中很多折騰人的地方往往就是些小細(xì)節(jié)。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1