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
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 len: 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] = 0x80; // Freq 10MHz
187 // payload[9] = 0x96;
188 // payload[10] = 0x98;
189 // payload[11] = 0x00;
191 payload[8] = 0x00; // Freq 7.372800MHz
196 // payload[12] = 0x80; // Freq locked 10MHz
197 // payload[13] = 0x96;
198 // payload[14] = 0x98;
199 // payload[15] = 0x00;
201 payload[12] = 0x00; // Freq locked 7.372800MHz
206 payload[16] = 00; // Pulse Duty
211 payload[20] = 00; // Pulse Duty locked
216 // gridUtcGps,ploarity,alignToTow,isLength,isFreq,lockedOtherSet,LockGpsFreq,Active
217 payload[28] = 0b11101111; // Grid=GPS,Pol=Rise
219 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_TP5, lenp, payload, pkt);
220 ublox_send(pkt, len_pkt);
228 void ublox_send_cfg_tp5_timepulse1(void)
230 const unsigned char lenp = 32;
231 unsigned char payload[lenp];
232 unsigned char pkt[64];
233 unsigned int len_pkt;
235 memset(payload, 0, lenp);
237 payload[0] = 0x00; //Timepulse1
239 payload[4] = 50; // cable delay ns
241 payload[8] = 0x40; // Period us
246 payload[12] = 0x40; // Period Locked us
251 payload[16] = 0x00; // Pulse width us
256 // payload[20] = 0xA0; // Pulse width locked 100,000us
257 // payload[21] = 0x86;
258 // payload[22] = 0x01;
259 // payload[23] = 0x00;
261 payload[20] = 0x20; // Pulse width locked 500,000us
266 payload[20] = 0x00; // Pulse width locked 800,000us
272 payload[28] = 0b11110111; // Grid=GPS,Pol=Rise
274 len_pkt = ublox_make_cmd(UBX_CLS_CFG, UBX_ID_CFG_TP5, lenp, payload, pkt);
275 ublox_send(pkt, len_pkt);
277 /**** DEBUG ************************************************/
279 void ublox_rcv_poll(void)
281 unsigned int i, data;
283 unsigned char buf_rcv[48];
286 for(i = 0; i < 1000; i++) {
287 // while(DataRdyUART1() == 0);
288 // data = ReadUART1();
289 while(U1STAbits.URXDA == 0);
291 if ((data & 0xFF) == 0xB5) break;
294 for(i = 0; i < 48; i++) {
295 if (U1STAbits.OERR == 1) {
299 while(U1STAbits.URXDA == 0);
302 for(i = 0; i < 48; i++) {
303 // while(DataRdyUART1() == 0);
304 // data = ReadUART1();
305 sprintf(buf, "%02X ", buf_rcv[i]);
315 void ublox_rcv_poll(void)
317 unsigned int i, data;
321 for(i = 0; i < 1000; i++) {
322 // while(DataRdyUART1() == 0);
323 // data = ReadUART1();
324 while(uart1_rcvbuf_is_data() == 0);
325 data = uart1_rcvbuf_getc();
326 sprintf(buf, "%02X ", data);
330 /**** パケット受信 *************************************/
338 int ublox_decode_nav_timeutc(unsigned char *payload, UbloxNavTimeUtc *g)
340 g->tow = byte4_to_ulong(payload); // ms
341 g->tacc = byte4_to_ulong(payload+4); // ns
342 g->nano = byte4_to_long(payload+8); // ns
343 g->year = byte2_to_uint(payload+12);
344 g->month = byte1_to_uchar(payload+14);
345 g->day = byte1_to_uchar(payload+15);
346 g->hour = byte1_to_uchar(payload+16);
347 g->min = byte1_to_uchar(payload+17);
348 g->sec = byte1_to_uchar(payload+18);
349 g->valid = byte1_to_uchar(payload+19);
353 * 受信バッファから1packet取り出す
359 //TODO: timeout処理, timeout指定
360 //TODO: check sum check
361 int ublox_rcv_pkt(unsigned char *class, unsigned char *id, unsigned int *len, unsigned char *payload)
363 unsigned int i, data;
364 char sts = UBX_STS_HEAD1;
366 unsigned char suma, sumb;
369 while(uart1_rcvbuf_is_data() == 0);
370 data = uart1_rcvbuf_getc();
373 if (data == 0xB5) sts = UBX_STS_HEAD2;
376 if (data == 0x62) sts = UBX_STS_CLASS;
391 *len += ((data << 8) & 0xFF00);
393 sts = UBX_STS_PAYLOAD;
395 case UBX_STS_PAYLOAD:
396 payload[ptr++] = data;
397 if (ptr >= *len) sts = UBX_STS_SUMA;
410 * 受信バッファからACKまたはNAKを取り出す
416 // TODO: timeout処理,timeoutを引数で指定
417 int ublox_rcv_ack(void)
419 unsigned char class, id;
421 unsigned char payload[128];
424 ublox_rcv_pkt(&class, &id, &len, payload);
425 if (class == 0x05 && id == 0x01) {
429 } else if (class == 0x05 && id == 0x00) {