rework ublox gps init

This commit is contained in:
cyberman54 2022-02-13 15:41:42 +01:00
parent 2d786967ea
commit 2dd9a4701b

View File

@ -10,28 +10,100 @@ TinyGPSPlus gps;
TaskHandle_t GpsTask; TaskHandle_t GpsTask;
HardwareSerial GPS_Serial(1); // use UART #1 HardwareSerial GPS_Serial(1); // use UART #1
// helper functions to send UBX commands to ublox gps chip // Ublox UBX packet data
void sendPacket(byte *packet, byte len) { // UBX CFG-PRT packet
byte CFG_PRT[] = {
0xB5, // sync char 1
0x62, // sync char 2
0x06, // class
0x00, // id
0x14, // length
0x00, // .
0x01, // portID (UART 1)
0x00, // reserved
0x00, // txReady
0x00, // .
0b11010000, // UART mode: 8N1
0b00001000, // .
0x00, // .
0x00, // .
(byte)GPS_BAUDRATE, // baudrate
(byte)(GPS_BAUDRATE >> 8), // .
(byte)(GPS_BAUDRATE >> 16), // .
(byte)(GPS_BAUDRATE >> 24), // .
0b00000011, // input protocols: NMEA + UBX
0b00000000, // .
0b00000010, // output protocols: NMEA
0x00000000, // .
0x00, // reserved
0x00, // .
0x00, // .
0x00 // .
};
uint8_t CK_A = 0; // Array of two bytes for CFG-MSG packets payload.
uint8_t CK_B = 0; byte CFG_MSG_CID[][2] = {
{0xF0, 0x01}, {0xF0, 0x02}, {0xF0, 0x03}, {0xF0, 0x05}, {0xF0, 0x06},
{0xF0, 0x07}, {0xF0, 0x08}, {0xF0, 0x09}, {0xF0, 0x0A}, {0xF0, 0x0E},
{0xF1, 0x00}, {0xF1, 0x03}, {0xF1, 0x04}, {0xF1, 0x05}, {0xF1, 0x06}};
for (int i = 0; i < len; i++) // UBX CFG-MSG packet
GPS_Serial.write(packet[i]); byte CFG_MSG[] = {
0xB5, // sync char 1
0x62, // sync char 2
0x06, // class
0x01, // id
0x03, // length
0x00, // .
0x00, // payload (first byte from messages array element)
0x00, // payload (second byte from messages array element)
0x00 // payload (zero to disable message)
};
// calculate and send Fletcher checksum // UBX TIM-TP5 packet
for (int i = 2; i < len; i++) { byte TIM_TP5[] = {
CK_A += packet[i]; 0xB5, // sync char 1
CK_B += CK_A; 0x62, // sync char 2
} 0x06, // class
GPS_Serial.write(CK_A); 0x31, // id
GPS_Serial.write(CK_B); 0x20, // length
} 0x00, // time pulse index
0x00, // reserved
0x00, // reserved
0x00, // .
0x00, // antenna cable delay [ns]
0x00, // .
0x00, // receiver rf group delay [ns]
0x00, // .
0x00, // frequency unlocked
0x00, // -> no signal
0x00, // .
0x00, // .
0x01, // frequency locked
0x00, // -> 1Hz
0x00, // .
0x00, // .
0x00, // pulse length unlocked
0x00, // -> no pulse
0x00, // .
0x00, // .
0xE8, // pulse length locked
0x03, // -> 1000us = 1ms
0x00, // .
0x00, // .
0x00, // user delay
0x00, // .
0x00, // .
0x00, // .
0b01111111, // flags
0b00000000, // -> UTC time grid
0b00000000, // .
0b00000000 // .
};
void restoreDefaults() {
// UBX CFG-CFG packet // UBX CFG-CFG packet
byte packet[] = { byte CFG_CFG[] = {
0xB5, // sync char 1 0xB5, // sync char 1
0x62, // sync char 2 0x62, // sync char 2
0x06, // class 0x06, // class
@ -53,115 +125,49 @@ void restoreDefaults() {
0b00010001 // devicemask 0b00010001 // devicemask
}; };
sendPacket(packet, sizeof(packet)); // helper functions to send UBX commands to ublox gps chip
void sendPacket(byte *packet, byte len) {
uint8_t CK_A = 0;
uint8_t CK_B = 0;
for (int i = 0; i < len; i++)
GPS_Serial.write(packet[i]);
// calculate and send Fletcher checksum
for (int i = 2; i < len; i++) {
CK_A += packet[i];
CK_B += CK_A;
}
GPS_Serial.write(CK_A);
GPS_Serial.write(CK_B);
} }
void setTimePulse() { void restoreDefaults() { sendPacket(CFG_CFG, sizeof(CFG_CFG)); }
// UBX TIM-TP packet void changeBaudrate() { sendPacket(CFG_PRT, sizeof(CFG_PRT)); }
byte packet[] = { void setTimePulse() { sendPacket(TIM_TP5, sizeof(TIM_TP5)); }
0xB5, // sync char 1
0x62, // sync char 2
0x06, // class
0x07, // id
0x14, // length
0x40, // time interval for time pulse [us]
0x42, // -> 1 sec = 1000000us
0x0F, // .
0x00, // .
0xE8, // length of time pulse [us]
0x03, // -> 1000us
0x00, // .
0x00, // .
0x01, // status -> positive edge
0x00, // timeRef -> UTC
0b00000001, // syncMode asynchronized
0x00, // reserved
0x00, // antenna cable delay [ns]
0x00, // .
0x00, // receiver rf group delay [ns]
0x00, // .
0x00, // user time function delay [ns]
0x00, // .
0x00, // .
0x00 // .
};
sendPacket(packet, sizeof(packet));
}
void disableNmea() { void disableNmea() {
// tinygps++ processes only $GPGGA/$GNGGA and $GPRMC/$GNRMC // tinygps++ processes only $GPGGA/$GNGGA and $GPRMC/$GNRMC
// thus, we disable all other NMEA messages // thus, we disable all other NMEA messages
// Array of two bytes for CFG-MSG packets payload. byte packetSize = sizeof(CFG_MSG);
byte messages[][2] = {{0xF0, 0x01}, {0xF0, 0x02}, {0xF0, 0x03}, {0xF0, 0x05},
{0xF0, 0x06}, {0xF0, 0x07}, {0xF0, 0x08}, {0xF0, 0x09},
{0xF0, 0x0A}, {0xF0, 0x0E}, {0xF1, 0x00}, {0xF1, 0x03},
{0xF1, 0x04}, {0xF1, 0x05}, {0xF1, 0x06}};
// UBX CFG-MSG packet
byte packet[] = {
0xB5, // sync char 1
0x62, // sync char 2
0x06, // class
0x01, // id
0x03, // length
0x00, // .
0x00, // payload (first byte from messages array element)
0x00, // payload (second byte from messages array element)
0x00 // payload (zero to disable message)
};
byte packetSize = sizeof(packet);
// Offset to the place where payload starts. // Offset to the place where payload starts.
byte payloadOffset = 6; byte payloadOffset = 6;
// Iterate over the messages array. // Iterate over the messages array.
for (byte i = 0; i < sizeof(messages) / sizeof(*messages); i++) { for (byte i = 0; i < sizeof(CFG_MSG_CID) / sizeof(*CFG_MSG_CID); i++) {
// Copy two bytes of payload to the packet buffer. // Copy two bytes of payload to the packet buffer.
for (byte j = 0; j < sizeof(*messages); j++) { for (byte j = 0; j < sizeof(*CFG_MSG_CID); j++) {
packet[payloadOffset + j] = messages[i][j]; CFG_MSG[payloadOffset + j] = CFG_MSG_CID[i][j];
} }
sendPacket(packet, packetSize); sendPacket(CFG_MSG, packetSize);
} }
} }
void changeBaudrate(uint32_t baudRate) {
// UBX CFG-PRT packet
byte packet[] = {
0xB5, // sync char 1
0x62, // sync char 2
0x06, // class
0x00, // id
0x14, // length
0x00, // .
0x01, // portID (UART 1)
0x00, // reserved
0x00, // txReady
0x00, // .
0b11010000, // UART mode: 8N1
0b00001000, // .
0x00, // .
0x00, // .
(byte)baudRate, // baudrate
(byte)(baudRate >> 8), // .
(byte)(baudRate >> 16), // .
(byte)(baudRate >> 24), // .
0b00000011, // input protocols: NMEA + UBX
0b00000000, // .
0b00000010, // output protocols: NMEA
0x00000000, // .
0x00, // reserved
0x00, // .
0x00, // .
0x00 // .
};
sendPacket(packet, sizeof(packet));
}
// initialize and configure GPS // initialize and configure GPS
int gps_init(void) { int gps_init(void) {
@ -172,7 +178,7 @@ int gps_init(void) {
restoreDefaults(); restoreDefaults();
delay(100); delay(100);
changeBaudrate(GPS_BAUDRATE); changeBaudrate();
delay(100); delay(100);
GPS_Serial.flush(); GPS_Serial.flush();
GPS_Serial.updateBaudRate(GPS_BAUDRATE); GPS_Serial.updateBaudRate(GPS_BAUDRATE);
@ -206,12 +212,13 @@ bool gps_hasfix() {
} }
// function to poll UTC time from GPS NMEA data; note: this is costly // function to poll UTC time from GPS NMEA data; note: this is costly
time_t get_gpstime(uint16_t *msec) { time_t get_gpstime(uint16_t *msec = 0) {
*msec = 0; const uint16_t txDelay =
70 * 1000 / (GPS_BAUDRATE / 9); // serial tx of 70 NMEA chars
// did we get a current date & time? // did we get a current date & time?
if (gps.time.isValid() && gps.date.isValid() && gps.time.age() < 1000) { if (gps.time.age() < 1000) {
// convert tinygps time format to struct tm format // convert tinygps time format to struct tm format
struct tm gps_tm = {0}; struct tm gps_tm = {0};
@ -236,7 +243,7 @@ time_t get_gpstime(uint16_t *msec) {
} }
#else #else
// best guess top of second // best guess top of second
*msec = gps.time.age() + gps.time.centisecond() * 10; *msec = gps.time.centisecond() * 10 + txDelay;
#endif #endif
return t; return t;