123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- /*
- * ublox.h
- *
- * Created on: Oct 28, 2017
- * Author: Milosz Iskrzynski SQ6NTI
- */
- #ifndef UBLOX_H_
- #define UBLOX_H_
- #include <stdint.h>
- #include "stm32l4xx_hal.h"
- /* UBX sync bytes */
- #define UBX_SYNC1 0xB5
- #define UBX_SYNC2 0x62
- /* UBX NAV Message Class */
- #define UBX_NAV 0x01
- #define UBX_NAV_POSLLH 0x02
- #define UBX_NAV_STATUS 0x03
- #define UBX_NAV_SOL 0x06
- #define UBX_NAV_TIMEUTC 0x21
- /* UBX RXM Message Class */
- #define UBX_RXM 0x02
- /* UBX INF Message Class */
- #define UBX_INF 0x04
- /* UBX ACK Message Class */
- #define UBX_ACK 0x05
- #define UBX_ACK_NAK 0x00
- #define UBX_ACK_ACK 0x01
- /* UBX CFG Message Class */
- #define UBX_CFG 0x06
- #define UBX_CFG_PRT 0x00
- #define UBX_CFG_MSG 0x01
- #define UBX_CFG_RST 0x04
- #define UBX_CFG_RXM 0x11
- #define UBX_CFG_NAV5 0x24
- /* Other UBX Message Classes */
- #define UBX_MON 0x0A
- #define UBX_AID 0x0B
- #define UBX_TIM 0x0D
- #define UBX_ESF 0x10
- /* NMEA Standard Message Class */
- #define NMEA_STD 0xF0
- #define NMEA_STD_GGA 0x00
- #define NMEA_STD_GLL 0x01
- #define NMEA_STD_GSA 0x02
- #define NMEA_STD_GSV 0x03
- #define NMEA_STD_RMC 0x04
- #define NMEA_STD_VTG 0x05
- /* NMEA Proprietary Message Class */
- #define NMEA_PROP 0xF0
- /* UBX header */
- typedef struct __attribute__((packed)) {
- uint8_t syncChar1; // 0xB5
- uint8_t syncChar2; // 0x62
- uint8_t messageClass;
- uint8_t messageId;
- uint16_t payloadLength;
- } ubxHeader;
- /* UBX ACK-ACK message (0x05 0x01) */
- typedef struct {
- uint8_t msgClass;
- uint8_t msgID;
- } ubxAckAck;
- /* UBX ACK-NAK message (0x05 0x00) */
- typedef struct {
- uint8_t msgClass;
- uint8_t msgID;
- } ubxAckNak;
- /* UBX CFG-MSG message (0x06 0x01) */
- typedef struct {
- uint8_t msgClass;
- uint8_t msgID;
- uint8_t rate;
- } ubxCfgMsg;
- /* UBX CFG-NAV5 message (0x06 0x24) */
- typedef struct {
- uint16_t mask; // Parameters Bitmask 0b0000000011111111 to set all params)
- uint8_t dynModel; // Dynamic Platform model: 0 Portable, 2 Stationary, 3 Pedestrian, 4 Automotive, 5 Sea, 6 Airborne with <1g Acceleration, 7 Airborne with <2g Acceleration, 8 Airborne with <4g Acceleration
- uint8_t fixMode; // Position Fixing Mode. - 1: 2D only - 2: 3D only - 3: Auto 2D/3D
- int32_t fixedAlt; // Fixed altitude (mean sea level) for 2D fix mode. [0.01 m]
- uint32_t fixedAltVar; // Fixed altitude variance for 2D mode. [0.0001 m^2]
- int8_t minElev; // Minimum Elevation for a GNSS satellite to be used in NAV [deg]
- uint8_t drLimit; // Maximum time to perform dead reckoning (linear extrapolation) in case of GPS signal loss [s]
- uint16_t pDop; // Position DOP Mask to use [0.1]
- uint16_t tDop; // Time DOP Mask to use [0.1]
- uint16_t pAcc; // Position Accuracy Mask [m]
- uint16_t tAcc; // Time Accuracy Mask [m]
- uint8_t staticHoldThresh; // Static hold threshold [cm/s]
- uint8_t dgpsTimeOut; // DGPS timeout, firmware 7 and newer only [s]
- uint32_t reserved2; // Always set to zero
- uint32_t reserved3; // Always set to zero
- uint32_t reserved4; // Always set to zero
- } ubxCfgNav5;
- /* UBX CFG-PRT message (0x06 0x00) */
- typedef struct {
- uint8_t portID; // Port Identifier Number (= 1 or 2 for UART ports)
- uint8_t reserved1; // Reserved
- uint16_t txReady; // TX ready PIN configuration
- uint32_t mode; // A bit mask describing the UART mode
- uint32_t baudRate; // Baud rate in bits/second [Bits/s]
- uint16_t inProtoMask; // A mask describing which input protocols are active
- uint16_t outProtoMask; // A mask describing which output protocols are active
- uint8_t reserved2[2]; // Reserved
- } ubxCfgPrt;
- /* UBX CFG-RST message (0x06 0x04) */
- typedef struct {
- uint16_t navBbrMask; // BBR Sections to clear. (Special: 0x0000 Hotstart, 0x0001 Warmstart, 0xFFFF Coldstart)
- uint8_t resetMode; // Reset Type
- uint8_t reserved1; // Reserved
- } ubxCfgRst;
- /* UBX CFG-RXM message (0x06 0x11) */
- typedef struct {
- uint8_t reserved1; // Always set to 8
- uint8_t lpMode; // Low Power Mode (0: max performance, 1: power save, 4: eco)
- } ubxCfgRxm;
- /* UBX NAV-POSLLH message (0x01 0x02) */
- typedef struct {
- uint32_t iTOW; // GPS Millisecond Time of Week [ms]
- int32_t lon; // Longitude [1e-7 deg]
- int32_t lat; // Latitude [1e-7 deg]
- int32_t height; // Height above Ellipsoid [mm]
- int32_t hMSL; // Height above mean sea level [mm]
- uint32_t hAcc; // Horizontal Accuracy Estimate [mm]
- uint32_t vAcc; // Vertical Accuracy Estimate [mm]
- } ubxNavPosllh;
- /* UBX NAV-SOL message (0x01 0x06) */
- typedef struct {
- uint32_t iTOW; // GPS Millisecond Time of Week [ms]
- int32_t fTOW; // Fractional Nanoseconds remainder of rounded ms above, range -500000 .. 500000 [ns]
- int16_t week; // GPS week (GPS time)
- uint8_t gpsFix; // GPSfix Type (0x00 No Fix, 01 Dead Reckoning only, 02 2D-Fix, 03 3D-Fix, 04 GPS + dead reckoning combined, 05 Time only fix)
- uint8_t flags; // Fix Status Flags
- int32_t ecefX; // ECEF X coordinate [cm]
- int32_t ecefY; // ECEF Y coordinate [cm]
- int32_t ecefZ; // ECEF Z coordinate [cm]
- uint32_t pAcc; // 3D Position Accuracy Estimate [cm]
- int32_t ecefVX; // ECEF X velocity [cm/s]
- int32_t ecefVY; // ECEF Y velocity [cm/s]
- int32_t ecefVZ; // ECEF Z velocity [cm/s]
- uint32_t sAcc; // Speed Accuracy Estimate [cm/s]
- uint16_t pDOP; // Position DOP [0.01]
- uint8_t reserved1; // Reserved
- uint8_t numSV; // Number of SVs used in Nav Solution
- uint32_t reserved2; // Reserved
- } ubxNavSol;
- /* UBX NAV-STATUS message (0x01 0x03) */
- typedef struct {
- uint32_t iTOW; // GPS Millisecond Time of Week [ms]
- uint8_t gpsFix; // GPSfix Type (0x00 No Fix, 01 Dead Reckoning only, 02 2D-Fix, 03 3D-Fix, 04 GPS + dead reckoning combined, 05 Time only fix)
- uint8_t flags; // Fix Status Flags
- uint8_t fixStat; // Fix Status Information
- uint8_t flags2; // Further information about navigation output
- uint32_t ttff; // Time to first fix (millisecond time tag)
- uint32_t msss; // Milliseconds since Startup / Reset
- } ubxNavStatus;
- /* UBX NAV-TIMEUTC message (0x01 0x021) */
- typedef struct {
- uint32_t iTOW; // GPS Millisecond Time of Week [ms]
- uint32_t tAcc; // Time Accuracy Estimate [ns]
- int32_t nano; // Nanoseconds of second, range -1e9 .. 1e9 (UTC) [ns]
- uint16_t year; // Year, range 1999..2099 (UTC) [y]
- uint8_t month; // Month, range 1..12 (UTC) [month]
- uint8_t day; // Day of Month, range 1..31 (UTC) [d]
- uint8_t hour; // Hour of Day, range 0..23 (UTC) [h]
- uint8_t min; // Minute of Hour, range 0..59 (UTC) [min]
- uint8_t sec; // Seconds of Minute, range 0..59 (UTC) [s]
- uint8_t valid; // Validity Flags
- } ubxNavTimeutc;
- /* UBX Message */
- typedef union {
- ubxAckAck ackack;
- ubxAckNak acknak;
- ubxCfgMsg cfgmsg;
- ubxCfgNav5 cfgnav5;
- ubxCfgPrt cfgprt;
- ubxCfgRst cfgrst;
- ubxCfgRxm cfgrxm;
- ubxNavPosllh navposllh;
- ubxNavStatus navstatus;
- ubxNavSol navsol;
- ubxNavTimeutc navtimeutc;
- } ubxMessage;
- /* UBX checksum */
- typedef struct {
- uint8_t ck_a;
- uint8_t ck_b;
- } ubxChecksum;
- /* UBX packet */
- typedef struct __attribute__((packed)) {
- ubxHeader header;
- ubxMessage message;
- ubxChecksum checksum;
- } ubxPacket;
- /* Ublox GPS current data */
- typedef struct {
- int32_t lat;
- int32_t lon;
- int32_t alt;
- int32_t speed;
- uint8_t sats;
- uint16_t year;
- uint8_t month;
- uint8_t day;
- uint8_t hour;
- uint8_t minute;
- uint8_t second;
- uint8_t fix;
- } ubxGPSData;
- void ubxInit(UART_HandleTypeDef *uart);
- void ubxRxByte(uint8_t data);
- void ubxProcessPacket(const ubxPacket *packet);
- int ubxResponseWait(int timeout);
- void ubxSendPacket(uint8_t messageClass, uint8_t messageId, uint16_t payloadLength, ubxMessage message);
- void ubxTxPacket(ubxPacket packet);
- uint8_t *serializeUbxPacket(ubxPacket *ubxPacket);
- ubxChecksum ubxCalcChecksum(const ubxPacket *packet);
- ubxGPSData ubxLastGPSData(void);
- extern void UART_ReInit(UART_HandleTypeDef*, uint32_t);
- extern void UART_TxStart(UART_HandleTypeDef*);
- extern int UART_TxFinished(UART_HandleTypeDef*);
- #endif /* UBLOX_H_ */
|