DJI NAZA-M controller (multi copter side) see: https://developer.mbed.org/users/okini3939/notebook/drone/
Dependencies: FutabaSBUS NECnfc mbed
rf920.cpp
00001 #include "mbed.h" 00002 #include "drone.h" 00003 #include "NECnfc.h" 00004 00005 #define RF_CHANNEL 34 00006 00007 NECnfc rf(p13, p14, p15, p16, p17, 38400 * 2, NECnfc::TYPE_920MHz); // tx, rx, reset, wakeup, mode 00008 //cts 12, rts 13 00009 00010 //static int host = NEC_DUMMYID; 00011 const static int host = 0x4b800062; 00012 static int seq = 1; 00013 00014 RawSerial ext(p28, p27); // sub cpu 00015 char recv_buf[NEC_MAXLENGTH + 1]; 00016 volatile int recv_mode = 0; 00017 int recv_len = 0, recv_count = 0; 00018 00019 extern struct Status stat; 00020 extern int rf_dual; 00021 00022 void isrRecv () { 00023 char buf[NEC_MAXLENGTH + 1]; 00024 int i, len, dest, src; 00025 uint8_t sum = 0; 00026 00027 len = rf.readData(&dest, &src, buf, sizeof(buf)); 00028 if (len <= 0) return; 00029 00030 for (i = 0; i < len; i ++) { 00031 sum += (uint8_t)buf[i]; 00032 } 00033 if (sum) return; // sum error 00034 if (strncmp(buf, "Suge", 4) != NULL) return; 00035 00036 len --; 00037 buf[len] = 0; 00038 if (host != src) { 00039 // host = src; 00040 printf("new host %08x\r\n", host); 00041 } 00042 // recvRf((struct AirData *)buf, rf.getRssi()); 00043 recvRf((struct AirData *)buf, 0); 00044 } 00045 00046 int sendRf (struct GroundData *send_data) { 00047 int i; 00048 uint8_t sum = 0; 00049 char *buf = (char*)send_data; 00050 00051 memcpy(send_data->magic, "Suge", 4); 00052 send_data->type = DATA_TYPE_GROUND; 00053 send_data->seq = seq; 00054 seq ++; 00055 if (seq >= 0x10000) seq = 1; 00056 00057 for (i = 0; i < sizeof(struct GroundData) - 1; i ++) { 00058 sum += (uint8_t)buf[i]; 00059 } 00060 send_data->sum = ~sum + 1; // two's complement 00061 00062 if (rf_dual == 3) { 00063 // sub rf 00064 ext.putc(0x0f); 00065 ext.putc(0x5a); 00066 ext.putc(sizeof(struct GroundData)); 00067 ext.putc(~sizeof(struct GroundData)); 00068 for (i = 0; i < sizeof(struct GroundData); i ++) { 00069 ext.putc(buf[i]); 00070 } 00071 return 0; 00072 } else { 00073 // main rf 00074 return rf.sendData(host, buf, sizeof(struct GroundData)); 00075 } 00076 } 00077 00078 // sub cpu 00079 void isrExt () { 00080 char c; 00081 c = ext.getc(); 00082 00083 switch (recv_mode) { 00084 case 0: 00085 if (c == 0x0f) { 00086 recv_mode ++; 00087 } 00088 break; 00089 case 1: 00090 if (c == 0x5a) { 00091 recv_mode ++; 00092 } else { 00093 if (c == 0x0f) break; 00094 recv_mode = 0; 00095 } 00096 break; 00097 case 2: 00098 recv_len = c; 00099 recv_mode ++; 00100 break; 00101 case 3: 00102 if (recv_len == (~c & 0xff) && recv_len <= sizeof(recv_buf)) { 00103 recv_count = 0; 00104 recv_mode ++; 00105 } else { 00106 recv_mode = 0; 00107 } 00108 break; 00109 case 4: 00110 recv_buf[recv_count] = c; 00111 recv_count ++; 00112 if (recv_count >= recv_len || recv_count >= sizeof(recv_buf)) { 00113 recv_mode ++; 00114 } 00115 break; 00116 } 00117 } 00118 00119 void pollRf () { 00120 rf.poll(); 00121 00122 if (recv_mode >= 5) { 00123 // sub rf, distance 00124 recv_mode = 0; 00125 int *distance = (int*)&recv_buf; 00126 stat.distance1 = distance[0]; 00127 stat.distance2 = distance[1]; 00128 00129 if (!(rf_dual & 2)) { 00130 ext.printf("\x0f\x5a\x04\xfbSuge"); 00131 } 00132 } 00133 } 00134 00135 int initRf () { 00136 ext.baud(115200); 00137 ext.attach(isrExt); 00138 00139 if (rf.setRfConfig(NECnfc::PWR_MAX, RF_CHANNEL, NECnfc::BAUD_50k)) return -1; 00140 rf.attach(&isrRecv); 00141 printf("RF %08x\r\n", rf.getId()); 00142 00143 return 0; 00144 }
Generated on Tue Jul 12 2022 21:17:26 by 1.7.2