DSP

ublox NEO-7 SPI接口数据读取调试总结

2019-07-13 19:30发布

        最近在调试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.对于同一地点的经纬度数据来说,应该是一样的。但是从分析出来的数据看,差别还是相当大的,如果有网友有高见,欢迎讨论。