11 // payload長さからパケット全体の長さ(checksum含む)をget
12 #define UBX_PKTLEN(len_payload) (len_payload + 8)
17 #define UBX_STS_HEAD1 0
18 #define UBX_STS_HEAD2 1
19 #define UBX_STS_CLASS 2
21 #define UBX_STS_LEN1 4
22 #define UBX_STS_LEN2 5
23 #define UBX_STS_PAYLOAD 6
24 #define UBX_STS_SUMA 7
25 #define UBX_STS_SUMB 8
28 * lenp: payload length
30 static void ublox_make_sum(unsigned char *pkt, unsigned int lenp, unsigned char *suma, unsigned char *sumb)
35 for(i = 0; i < lenp+4; i++) {
36 *suma += pkt[UBX_CLASS + i];
42 * unsgined char lenp: payloadのバイト数
43 * return: 作成したパケットpktのバイト数
45 int ublox_make_cmd(unsigned char id1, unsigned char id2, unsigned int lenp, unsigned char *payload, unsigned char pkt[])
47 unsigned char suma, sumb;
53 pkt[4] = (0xFF & lenp);
54 pkt[5] = (0xFF & (lenp >> 8));
55 memcpy(&pkt[UBX_PAYLOAD], payload, lenp);
57 ublox_make_sum(pkt, lenp, &suma, &sumb);
58 pkt[UBX_PAYLOAD + lenp] = suma;
59 pkt[UBX_PAYLOAD + lenp + 1] = sumb;
60 return UBX_PKTLEN(lenp);
66 void ublox_debug_pkt_out(unsigned char *pkt, int len)
71 for(i = 0; i < len; i++) {
72 sprintf(buf, "%02X ", (unsigned char)(pkt[i] & 0xFF));
81 void ublox_send(unsigned char *pkt, unsigned int len_pkt)
85 for(i = 0; i < len_pkt; i++) {
86 // while(U1STAbits.UTXBF==1); /* Wait until TX buf read for new data */
87 while(uart1_tx_is_full());
92 /**** コマンド送信 *************************/
97 void ublox_send_cfg_prt(unsigned long bps)
99 const unsigned char lenp = 20;
100 unsigned char payload[lenp];
101 unsigned char pkt[32];
103 unsigned int len_pkt;
105 payload[0] = 0x01; // Port
107 payload[2] = 0x00; // TxReady
110 payload[4] = 0b11010000; // 8bit
111 payload[5] = 0b00001000; // 1stop non-parity
115 payload[8] = (bps & 0xFF);
116 payload[9] = ((bps >> 8)& 0xFF);
117 payload[10] = ((bps >> 16)& 0xFF);
118 payload[11] = ((bps >> 24)& 0xFF);
119 payload[12] = 0x01; // inProtoMask
121 payload[14] = 0x01; // outProtoMask
123 payload[16] = 0x00; // reserved
128 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_PRT, lenp, payload, pkt);
129 ublox_send(pkt, len_pkt);
135 void ublox_send_cfg_nmea(void)
137 const unsigned char lenp = 4;
138 unsigned char payload[lenp];
139 unsigned char pkt[32];
140 unsigned int len_pkt;
147 len_pkt = ublox_make_cmd(UBX_CLS_CFG, 0x17, lenp, payload, pkt);
148 ublox_send(pkt, len_pkt);
154 void ublox_send_cfg_msg(void)
156 const unsigned char lenp = 3;
157 unsigned char payload[lenp];
158 unsigned char pkt[32];
159 unsigned int len_pkt;
161 payload[0] = UBX_CLS_NAV;
162 payload[1] = UBX_ID_NAV_TIMEUTC;
163 payload[2] = 1; // Rate[Hz]
165 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_MSG, lenp, payload, pkt);
166 ublox_send(pkt, len_pkt);
173 void ublox_send_cfg_tp5_timepulse2(void)
175 const unsigned char lenp = 32;
176 unsigned char payload[lenp];
177 unsigned char pkt[64];
178 unsigned int len_pkt;
180 memset(payload, 0, lenp);
182 payload[0] = 0x01; // Timepulse2
184 payload[4] = 50; // cable delay ns
186 payload[8] = 0x00; // Freq 7.372800MHz
191 payload[12] = 0x00; // Freq locked 7.372800MHz
196 payload[16] = 00; // Pulse Duty
201 payload[20] = 00; // Pulse Duty locked
206 // gridUtcGps,ploarity,alignToTow,isLength,isFreq,lockedOtherSet,LockGpsFreq,Active
207 payload[28] = 0b11101111; // Grid=GPS,Pol=Rise
209 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_TP5, lenp, payload, pkt);
210 ublox_send(pkt, len_pkt);
218 void ublox_send_cfg_tp5_timepulse1(void)
220 const unsigned char lenp = 32;
221 unsigned char payload[lenp];
222 unsigned char pkt[64];
223 unsigned int len_pkt;
225 memset(payload, 0, lenp);
227 payload[0] = 0x00; //Timepulse1
229 payload[4] = 50; // cable delay ns
231 payload[8] = 0x40; // Period 1,000,000us
236 payload[12] = 0x40; // Period Locked us
241 payload[16] = 0x20; // Pulse width 500,000us
246 payload[20] = 0xA0; // Pulse width locked 100,000us
251 payload[28] = 0b11110111; // Grid=GPS,Pol=Rise
253 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_TP5, lenp, payload, pkt);
254 ublox_send(pkt, len_pkt);
256 /**** DEBUG ************************************************/
258 void ublox_rcv_poll(void)
260 unsigned int i, data;
262 unsigned char buf_rcv[48];
265 for(i = 0; i < 1000; i++) {
266 // while(DataRdyUART1() == 0);
267 // data = ReadUART1();
268 while(U1STAbits.URXDA == 0);
270 if ((data & 0xFF) == 0xB5) break;
273 for(i = 0; i < 48; i++) {
274 if (U1STAbits.OERR == 1) {
278 while(U1STAbits.URXDA == 0);
281 for(i = 0; i < 48; i++) {
282 // while(DataRdyUART1() == 0);
283 // data = ReadUART1();
284 sprintf(buf, "%02X ", buf_rcv[i]);
294 void ublox_rcv_poll(void)
296 unsigned int i, data;
300 for(i = 0; i < 1000; i++) {
301 // while(DataRdyUART1() == 0);
302 // data = ReadUART1();
303 while(uart1_rcvbuf_is_data() == 0);
304 data = uart1_rcvbuf_getc();
305 sprintf(buf, "%02X ", data);
309 /**** パケット受信 *************************************/
317 int ublox_decode_nav_timeutc(unsigned char *payload, UbloxNavTimeUtc *g)
319 g->tow = byte4_to_ulong(payload); // ms
320 g->tacc = byte4_to_ulong(payload+4); // ns
321 g->nano = byte4_to_long(payload+8); // ns
322 g->year = byte2_to_uint(payload+12);
323 g->month = byte1_to_uchar(payload+14);
324 g->day = byte1_to_uchar(payload+15);
325 g->hour = byte1_to_uchar(payload+16);
326 g->min = byte1_to_uchar(payload+17);
327 g->sec = byte1_to_uchar(payload+18);
328 g->valid = byte1_to_uchar(payload+19);
332 * 受信バッファから1packet取り出す
338 //TODO: timeout処理, timeout指定
339 //TODO: check sum check
340 int ublox_rcv_pkt(unsigned char *class, unsigned char *id, unsigned int *len, unsigned char *payload)
342 unsigned int i, data;
343 char sts = UBX_STS_HEAD1;
345 unsigned char suma, sumb;
348 while(uart1_rcvbuf_is_data() == 0);
349 data = uart1_rcvbuf_getc();
352 if (data == 0xB5) sts = UBX_STS_HEAD2;
355 if (data == 0x62) sts = UBX_STS_CLASS;
370 *len += ((data << 8) & 0xFF00);
372 sts = UBX_STS_PAYLOAD;
374 case UBX_STS_PAYLOAD:
375 payload[ptr++] = data;
376 if (ptr >= *len) sts = UBX_STS_SUMA;
389 * 受信バッファからACKまたはNAKを取り出す
395 // TODO: timeout処理,timeoutを引数で指定
396 int ublox_rcv_ack(void)
398 unsigned char class, id;
400 unsigned char payload[128];
403 ublox_rcv_pkt(&class, &id, &len, payload);
404 if (class == 0x05 && id == 0x01) {
406 // PDEBUG("ACK\r\n");
408 } else if (class == 0x05 && id == 0x00) {
410 // PDEBUG("NACK\r\n");