1. 程式人生 > >ublox NEO-7 SPI介面資料讀取除錯總結

ublox NEO-7 SPI介面資料讀取除錯總結

        最近在除錯ublox NEO-7 GPS,主控晶片為TMS320C6722,這款DSP外設沒有UART,所以用SPI匯流排與GPS進行通訊。最初想在網上搜一些關於SPI介面的ublox資料讀取經驗,但網上都是清一色的UART介面讀取ublox資料。通過這兩天閱讀手冊和在硬體上的實踐除錯,總算有了一些結果,所以總結下來,希望能給看到本文的網友提供些除錯經驗,也歡迎眾網友與博主進行討論。

        對於ublox的官方手冊,需要看的應該就三個:1.MAX7-NEO7_HardwareIntegrationManual_(UBX-13003704);2.NEO-7P_DataSheet_(UBX-13003787);3.u-blox7-V14_ReceiverDescriptionProtocolSpec_Public_(GPS.G7-SW-12001)。其中1和2跟硬體設計聯絡較密切,可以只看其關於SPI的部分,第三部分講的是通訊協議,需要仔細看。

        一、首先我們需要再強調一下SPI匯流排的特點。SPI匯流排的傳輸是需要首先確定主機和從機的,ublox手冊上指出當採用NEO-7上的SPI介面時GPS作為從機,與其連線的MCU作為主機;這裡的SPI匯流排為四線連線:MISO、MOSI、CLK(時鐘引腳)、CS(片選引腳);SPI傳輸時時鐘訊號由主機提供,也就是傳輸頻率由主機確定;傳輸總是由主機先發送資料觸發傳輸開始,也就是說如果主機不傳送資料的話,主從機之間是無法進行資料通訊的,而且主從機的傳輸總是同步進行。 手冊上說NMEA與UBX協議對於SPI介面來說都支援,然後問題來了:用UART進行與GPS通訊時,NMEA協議的GGA、GLL、GSA、GSV、RMC、VTG資訊是定週期向MCU傳送的,對於非同步通訊的UART來說只要開啟接收中斷,當有資料來時只要進入中斷接收資料就可以。而對於SPI匯流排來說,由於其是全雙工同步通訊,所以如果MCU沒有首先發資料的話,即使GPS向MCU發資料,這些資料也不會被MCU接收。

        二、關於MCU與ublox通訊的一些總結:

              1.在上面提到的手冊2中有一點需要注意:

        截圖中有個 tINTI,Initialization Time,在MCU程式中需要將片選引腳拉低然後500us後再使能SPI。可以在拉低片選引腳後簡單的做一個for迴圈,估計大於500us後再去使能SPI,但是這樣做有些不專業而且浪費CPU,可以用定時器去做。

        2.SPI的一些配置在手冊3中可以查到,手冊3的附錄中,MCU方的SPI設定需要與其相對應


        上面沒有提到資料長度,可以推測GPS的SPI只能傳輸8位資料長度,在寫MCU方的SPI驅動時這一點要注意。

        3.因為SPI為同步傳輸,所以資料的傳輸開始必須由MCU觸發。雖然NMEA協議週期向MCU傳送資料,但是如果MCU不首先發送資料的話,MCU就會忽略GPS發過來的這些資料,即使開啟SPI接收中斷,也不會進入中斷。

        

       注意看黃色部分,當主從機都空閒時互相傳送0xFF。

       所以如果想收到NMEA的資料可以這樣做:MCU需要開啟SPI的接收中斷,若想開始接收GPS傳送過來的資料,在主程式中向GPS傳送一個0xFF,這樣就開始了MCU與GPS之間的同步傳輸。當有資料過來時,MCU就會進入SPI接收中斷,在接收中斷中需要做的事有兩件:接收資料,存入陣列;傳送0xFF。如果不在中斷中向GPS返回個0xFF,那麼資料傳輸就會中斷。經過在硬體中的試驗,因為GPS的NMEA協議週期向MCU傳送資料,所以在不傳送NMEA協議時,GPS向MCU傳送的全為0xFF。

                                          

        上面的截圖是按上述步驟做時MCU從GPS接收到的資料。把接收到的資料放在的陣列SPI_RX_BUF中。由於是在室內測的,所以發過來的資訊基本就是空資訊,也就是2C2C2C........2C為逗號的ASCII。將上面的協議翻譯後,就是GGA、GLL、GSA、GSV、RMC、VTG各條資訊。中間一堆一堆的FF是GPS不傳送NMEA資訊時向MCU返還的資料。

        4.還有就是ublox的SPI介面也支援UBX協議,用UBX協議可對GPS做些設定,當然也能獲得UBX協議的經緯度資訊,而不用NMEA協議的經緯度資訊。

        假如我想通過UBX協議獲取天線配置資訊,我需要向GPS傳送CFG_ANT資訊,GPS在收到資訊後會立即向MCU返還天線配置資訊,天線配置資訊後面還要跟隨ACK資訊,以表示GPS是否對資訊做了正確處理。

                                          

        截圖中除了FF部分,包含了GPS返回的UBX協議中CFG的天線配置資訊,以及ACK資訊。

        還有,UBX協議中的經緯度資訊放在了NAV中,那麼我們如何獲得NAV中的資訊中呢?

        

        上面是UBX部分的一點截圖,上面說要想獲得NAV中的資訊,只需要把payload部分設為空(也就是不傳送payload),這時資料幀的length = 0;比如說我想要獲得NAV_PTV資訊,只需要傳送:

                                0xB5      0x62     0x01    0x07    0x00    0x00    0x08     0x19

        注意length為16位,不是8位。

                                                               

        上面為在室外測的資訊,將上面資料解析之後確實是 NAV_PTV資訊,但是後面跟了一堆別的資訊,熟悉NMEA協議的人馬上就能看出後面跟的是NMEA協議的資料幀。後來經過多次試驗,得出結論:用UBX協議獲取GPS的經緯度資訊,在請求傳送之後,資料並不會馬上發回給MCU,而是與NMEA的週期資訊一起傳送給MCU,並且在NMEA協議資訊之前傳送給MCU,後面緊跟NMEA週期數據幀。

        5.在室外測得時候,我是在北航新主樓測的(北京),但是用UBX協議返回的經緯度資訊與NMEA返回的經緯度資訊稍有差別。把返回的資料解析後,UBX返回的經緯度資訊為:lon=116.3453160,lat=39.9788831;NMEA返回的經緯度資訊為:lon=116.2071869,lat=39.5873377.對於同一地點的經緯度資料來說,應該是一樣的。但是從分析出來的資料看,差別還是相當大的,如果有網友有高見,歡迎討論。