From 97956b6c5eafd4e05a4cea37a47eceaadedde8e7 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Thu, 1 Sep 2016 13:42:33 +0200 Subject: [PATCH] FrSky1 CRC messed up... --- Multiprotocol/FrSky1_cc2500.ino | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/Multiprotocol/FrSky1_cc2500.ino b/Multiprotocol/FrSky1_cc2500.ino index df948a7..53d056c 100644 --- a/Multiprotocol/FrSky1_cc2500.ino +++ b/Multiprotocol/FrSky1_cc2500.ino @@ -60,14 +60,14 @@ static void __attribute__((unused)) FRSKY1_init() CC2500_Strobe(CC2500_SIDLE); // Go to idle... } -static uint8_t __attribute__((unused)) FRSKY1_crc8(uint8_t result, uint8_t *data, uint8_t len, uint8_t polynomial) +static uint8_t __attribute__((unused)) FRSKY1_crc8(uint8_t result, uint8_t *data, uint8_t len) { for(uint8_t i = 0; i < len; i++) { result = result ^ data[i]; for(uint8_t j = 0; j < 8; j++) if(result & 0x80) - result = (result << 1) ^ polynomial; + result = (result << 1) ^ 0x07; else result = result << 1; } @@ -83,7 +83,15 @@ static uint8_t __attribute__((unused)) FRSKY1_crc8_le(uint8_t init, uint8_t *dat result = (result << 1) | (init & 0x01); init >>= 1; } - return FRSKY1_crc8(result,data,len,0x83); + for(uint8_t i = 0; i < len; i++) + { + result = result ^ data[i]; + for(uint8_t j = 0; j < 8; j++) + if(result & 0x01) + result = (result >> 1) ^ 0x83; + else + result = result >> 1; + } } static void __attribute__((unused)) FRSKY1_build_bind_packet() @@ -103,7 +111,7 @@ static void __attribute__((unused)) FRSKY1_build_bind_packet() packet[11] = 0x00; packet[12] = 0x00; packet[13] = 0x00; - packet[14] = FRSKY1_crc8(0x93, packet, 14, 0x07); + packet[14] = FRSKY1_crc8(0x93, packet, 14); } static uint8_t __attribute__((unused)) FRSKY1_calc_channel() @@ -135,7 +143,7 @@ static void __attribute__((unused)) FRSKY1_build_data_packet() packet[2*i + 6] = value & 0xff; packet[2*i + 7] = value >> 8; } - packet[14] = FRSKY1_crc8(crc8, packet, 14, 0x07); + packet[14] = FRSKY1_crc8(crc8, packet, 14); } static uint16_t ReadFRSKY1() @@ -157,11 +165,6 @@ static uint16_t ReadFRSKY1() if (state >= FRSKY_DATA1) { CC2500_Strobe(CC2500_SIDLE); - if (option != prev_option) - { - CC2500_WriteReg(CC2500_0C_FSCTRL0, option); - prev_option=option; - } uint8_t chan = FRSKY1_calc_channel(); CC2500_WriteReg(CC2500_0A_CHANNR, chan * 5 + 6); FRSKY1_build_data_packet(); @@ -169,6 +172,11 @@ static uint16_t ReadFRSKY1() CC2500_WriteData(packet, packet[0]+1); if (state == FRSKY_DATA5) { + if (option != prev_option) + { + CC2500_WriteReg(CC2500_0C_FSCTRL0, option); + prev_option=option; + } CC2500_SetPower(); state = FRSKY_DATA1; }