SPI接口與CRC算法在雙DSP數(shù)據(jù)通信中的應(yīng)用
從機(jī)發(fā)送/主機(jī)接收的驅(qū)動(dòng)設(shè)計(jì)
本文引用地址:http://2s4d.com/article/117273.htm(1) 從機(jī)發(fā)送數(shù)據(jù)的驅(qū)動(dòng)設(shè)計(jì)。當(dāng)從機(jī)的發(fā)送FIFO為空時(shí),將觸發(fā)并進(jìn)入發(fā)送中斷服務(wù)函數(shù), 在此函數(shù)中將待發(fā)送的16字?jǐn)?shù)據(jù)寫(xiě)入發(fā)送FIFO,然后向主機(jī)發(fā)出接收申請(qǐng)。
(2) 主機(jī)接收數(shù)據(jù)的驅(qū)動(dòng)設(shè)計(jì)。在確知從機(jī)已將待發(fā)送的數(shù)據(jù)寫(xiě)入發(fā)送FIFO之后,主機(jī)即向從機(jī)發(fā)送一幀無(wú)效數(shù)據(jù),目的是提供從機(jī)發(fā)送數(shù)據(jù)所需的同步時(shí)鐘。與此同時(shí),主機(jī)可接收到自從機(jī)發(fā)出的16字?jǐn)?shù)據(jù),并觸發(fā)接收中斷,在相應(yīng)的中斷服務(wù)函數(shù)中將數(shù)據(jù)讀出即可。
通信協(xié)議的設(shè)計(jì)與實(shí)現(xiàn)
協(xié)議的內(nèi)容與實(shí)現(xiàn)
(1) 數(shù)據(jù)幀格式。主機(jī)與從機(jī)遵循相同的幀格式。每個(gè)數(shù)據(jù)幀長(zhǎng)度為32字節(jié),其中前30字節(jié)為有效數(shù)據(jù),后兩字節(jié)為前30字節(jié)的CRC校驗(yàn)碼。
(2) 主機(jī)的收/發(fā)機(jī)制。主機(jī)的收/發(fā)流程如圖4所示。在主機(jī)中啟動(dòng)定時(shí)器中斷功能,在定時(shí)中斷服務(wù)函數(shù)中讀取MRE和SCRCE信號(hào)的狀態(tài)。其中SCRCE信號(hào)標(biāo)識(shí)了從機(jī)對(duì)前一數(shù)據(jù)幀的校驗(yàn)結(jié)果,為0表示校驗(yàn)失敗,當(dāng)主機(jī)讀取到此狀態(tài)時(shí),就將前一數(shù)據(jù)幀重發(fā);MRE信號(hào)標(biāo)識(shí)了從機(jī)的待發(fā)數(shù)據(jù)準(zhǔn)備狀態(tài),為0表示從機(jī)已將待發(fā)送的一幀數(shù)據(jù)寫(xiě)入發(fā)送FIFO,主機(jī)讀取到此狀態(tài)時(shí),應(yīng)立即啟動(dòng)接收操作,當(dāng)主機(jī)接收到一幀新的數(shù)據(jù)時(shí),應(yīng)立即對(duì)齊進(jìn)行校驗(yàn),并根據(jù)校驗(yàn)結(jié)果設(shè)置MCRCE信號(hào)的狀態(tài),作為從機(jī)是否重發(fā)的依據(jù)。
(3) 從機(jī)的收/發(fā)機(jī)制。從機(jī)的收/發(fā)流程如圖4所示。在從機(jī)中啟動(dòng)定時(shí)器中斷功能,在定時(shí)中斷服務(wù)函數(shù)中讀取MCRCE信號(hào)的狀態(tài),此信號(hào)標(biāo)識(shí)了主機(jī)對(duì)前一數(shù)據(jù)幀的校驗(yàn)結(jié)果,為0表示校驗(yàn)失敗,從機(jī)讀取到此狀態(tài)時(shí)應(yīng)將前一數(shù)據(jù)幀重發(fā)。若不需重發(fā),則繼續(xù)發(fā)送新的數(shù)據(jù)幀。當(dāng)從機(jī)將待發(fā)送的數(shù)據(jù)幀寫(xiě)入發(fā)送FIFO后,立即將MRE信號(hào)置為0,請(qǐng)求主機(jī)接收;當(dāng)從機(jī)接收到新的數(shù)據(jù)幀后,立即進(jìn)行校驗(yàn),若校驗(yàn)失敗,則將SCRCE信號(hào)置為0,請(qǐng)求主機(jī)將前一數(shù)據(jù)幀重發(fā)。
基于CRC算法的校驗(yàn)機(jī)制
SPI協(xié)議將數(shù)據(jù)幀全部視作有效數(shù)據(jù),使用同步時(shí)鐘協(xié)調(diào)雙方的發(fā)送/接收,實(shí)現(xiàn)數(shù)據(jù)的正確傳輸。為進(jìn)一步提高通信雙方的差錯(cuò)檢測(cè)能力,帶來(lái)更高的可靠性保障,在接收方引入了數(shù)據(jù)校驗(yàn)機(jī)制??紤]到CRC (Cyclic Redundancy Check) 算法誤碼檢測(cè)能力強(qiáng)且易于實(shí)現(xiàn)[5],本系統(tǒng)使用CRC算法實(shí)現(xiàn)接收方的數(shù)據(jù)幀校驗(yàn)。
CRC校驗(yàn)的原理可概括如下:被校驗(yàn)的n位數(shù)據(jù)塊可看作是n階二進(jìn)制多項(xiàng)式m(x)=an-1xn-1 + an-2xn-2 + ? + a1x + a0,發(fā)送方和接收方約定一個(gè)r階的生成多項(xiàng)式g(x),發(fā)送方以xrm(x)為被除數(shù),以g(x)為除數(shù),做除法運(yùn)算,得到余數(shù)多項(xiàng)式y(tǒng)(x)即為m(x)的校驗(yàn)碼,將該校驗(yàn)碼附在n位數(shù)據(jù)塊之后一并發(fā)送至接收方。接收方以接收到的數(shù)據(jù)多項(xiàng)式為被除數(shù),以g(x)為除數(shù),做除法運(yùn)算,若余數(shù)為0,證明校驗(yàn)成功,否則校驗(yàn)失敗。
為提高計(jì)算效率,本系統(tǒng)采用一種基于查表機(jī)制的并行處理方法。
首先選擇生成多項(xiàng)式g(x),考慮到CRC-16國(guó)際標(biāo)準(zhǔn)工程實(shí)用價(jià)值較高,此處也采用該標(biāo)準(zhǔn),此時(shí)g(x)=x16 + x15 + x2 + 1。將所有單字節(jié)數(shù)據(jù)的CRC-16校驗(yàn)碼提前計(jì)算出來(lái),存于表中待查。
將待校驗(yàn)的數(shù)據(jù)塊(長(zhǎng)度為30字節(jié))看作是多字節(jié)序列,取第一個(gè)字節(jié)B30并查表得其兩字節(jié)余式,將此余式的高字節(jié)與B29做模2加運(yùn)算,低字節(jié)與B28做模2加運(yùn)算,分別得結(jié)果B*29和B*28,并得到新的多字節(jié)序列< B*29 B*28?B3B2B1>,再取B*29重復(fù)進(jìn)行上述操作,得新的多字節(jié)序列< B**28B*27?B3B2B1>,如此往復(fù),直到最后多字節(jié)序列變?yōu)?lt; B*2B1>,將此序列左移16位得< B*2B100>,取B*2并查表得其兩字節(jié)余式,將此余式的高字節(jié)與B1做模2加運(yùn)算,低字節(jié)與0做模2加運(yùn)算,分別得結(jié)果B*1和C*2,得新的序列< B*1C*20>,再重復(fù)此操作,可得雙字節(jié)序列< C**2C1>,此即序列的CRC-16校驗(yàn)碼。
將此校驗(yàn)碼附于之后,一并發(fā)送至接收方;接收方對(duì)全部32字節(jié)的數(shù)據(jù)序列進(jìn)行上述CRC-16編碼運(yùn)算,若余式為0則認(rèn)為校驗(yàn)成功,否則證明傳輸過(guò)程中有丟碼或誤碼。
通信相關(guān)文章:通信原理
評(píng)論