diff --git a/Multiprotocol/CYRF6936_SPI.ino b/Multiprotocol/CYRF6936_SPI.ino index 53772e8..407e872 100644 --- a/Multiprotocol/CYRF6936_SPI.ino +++ b/Multiprotocol/CYRF6936_SPI.ino @@ -98,14 +98,14 @@ void CYRF_SetTxRxMode(uint8_t mode) { if(mode==TXRX_OFF) { - if(protocol!=PROTO_WFLY) + if( protocol!=PROTO_WFLY && protocol!=PROTO_MLINK ) CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); // 4=IDLE, 8=TX, C=RX CYRF_WriteRegister(CYRF_0E_GPIO_CTRL,0x00); // XOUT=0 PACTL=0 } else { //Set the post tx/rx state - if(protocol!=PROTO_WFLY) + if( protocol!=PROTO_WFLY && protocol!=PROTO_MLINK ) CYRF_WriteRegister(CYRF_0F_XACT_CFG, mode == TX_EN ? 0x28 : 0x2C); // 4=IDLE, 8=TX, C=RX if(mode == TX_EN) #ifdef ORANGE_TX_BLUE diff --git a/Multiprotocol/MLINK_cyrf6936.ino b/Multiprotocol/MLINK_cyrf6936.ino index 0e6d7ad..c25c081 100644 --- a/Multiprotocol/MLINK_cyrf6936.ino +++ b/Multiprotocol/MLINK_cyrf6936.ino @@ -17,6 +17,8 @@ #include "iface_cyrf6936.h" +#undef MLINK_HUB_TELEMETRY + #define MLINK_FORCE_ID #define MLINK_BIND_COUNT 696 // around 20s #define MLINK_NUM_FREQ 78 @@ -28,11 +30,17 @@ enum { MLINK_BIND_PREP_RX, MLINK_BIND_RX, MLINK_PREP_DATA, - MLINK_RF, - MLINK_SEND, + MLINK_SEND1, + MLINK_CHECK1, + MLINK_SEND2, + MLINK_CHECK2, + MLINK_SEND3, + MLINK_CHECK3, + MLINK_RX, + MLINK_CHECK4, }; -uint8_t MLINK_Data_Code[16], MLINK_Offset; +uint8_t MLINK_Data_Code[16], MLINK_CRC_Init, MLINK_Unk_6_2; const uint8_t PROGMEM MLINK_init_vals[][2] = { //Init from dump @@ -45,7 +53,7 @@ const uint8_t PROGMEM MLINK_init_vals[][2] = { //{ CYRF_0C_XTAL_CTRL, 0x00 }, // Set to GPIO on reset //{ CYRF_0D_IO_CFG, 0x00 }, // Set to GPIO on reset //{ CYRF_0E_GPIO_CTRL, 0x00 }, // Set by the CYRF_SetTxRxMode function - //{ CYRF_0F_XACT_CFG, 0x04 }, // end state idle -> Set by the CYRF_SetTxRxMode function + { CYRF_0F_XACT_CFG, 0x04 }, // end state idle { CYRF_10_FRAMING_CFG, 0x00 }, // SOP disabled { CYRF_11_DATA32_THOLD, 0x05 }, // not used??? { CYRF_12_DATA64_THOLD, 0x0F }, // 64 Chip Data PN Code Correlator Threshold @@ -72,58 +80,37 @@ static void __attribute__((unused)) MLINK_cyrf_config() CYRF_SetTxRxMode(TX_EN); } -static uint8_t __attribute__((unused)) MLINK_BR(uint8_t byte) -{ - uint8_t result = 0; - for(uint8_t i=0;i<8;i++) - { - result = (result<<1) | (byte & 0x01); - byte >>= 1; - } - return result; -} - -static void __attribute__((unused)) MLINK_CRC(uint8_t byte) -{ - crc8 = crc8 ^ MLINK_BR(byte); // Reflected in - for ( uint8_t j = 0; j < 8; j++ ) - if ( crc8 & 0x80 ) - crc8 = (crc8<<1) ^ 0x31; - else - crc8 <<= 1; -} - static void __attribute__((unused)) MLINK_send_bind_data_packet() { uint8_t p_c=packet_count>>1; - memset(packet, p_c<0x16?0x00:0xFF, MLINK_PACKET_SIZE); + memset(packet, p_c<0x16?0x00:0xFF, MLINK_PACKET_SIZE-1); packet[0]=0x0F; // bind packet[1]=p_c; switch(p_c) { case 0x00: - packet[2]=0x40; //unknown - packet[4]=0x01; //unknown - packet[5]=0x03; //unknown - packet[6]=0xE3; //unknown + packet[2]=0x40; //unknown but seems constant + packet[4]=0x01; //unknown but seems constant + packet[5]=0x03; //unknown but seems constant + packet[6]=0xE3; //unknown but seems constant break; case 0x05: - packet[6]=0x07; //unknown + packet[6]=MLINK_CRC_Init; //CRC init value break; case 0x06: - packet[2]=0x3A; //unknown + packet[2]=MLINK_Unk_6_2; //unknown and different //Start of hopping frequencies for(uint8_t i=0;i<4;i++) packet[i+3]=hopping_frequency[i]; break; case 0x15: - packet[6]=0x51; //unknown + packet[6]=0x51; //unknown but seems constant break; case 0x16: - packet[2]=0x51; //unknown - packet[3]=0xEC; //unknown - packet[4]=0x05; //unknown + packet[2]=0x51; //unknown but seems constant + packet[3]=0xEC; //unknown but seems constant + packet[4]=0x05; //unknown but seems constant break; case 0x1A: packet[1]=0xFF; @@ -145,18 +132,26 @@ static void __attribute__((unused)) MLINK_send_bind_data_packet() if(i+p_c_50x19) + { + packet[1]=0xFF; + memset(&packet[2], 0x00, MLINK_PACKET_SIZE-3); + } //Calculate CRC crc8=0xFF; // Init = 0xFF for(uint8_t i=0;i>8; packet[i*2+2]=tmp; } //Calculate CRC - crc8=MLINK_BR(hopping_frequency_no + MLINK_Offset); // Init = relected freq index + offset + crc8=bit_reverse(hopping_frequency_no + MLINK_CRC_Init); // Init = relected freq index + offset for(uint8_t i=0;i 0x19*2) + { + if(packet[0] == 0x8F) + packet_count++; + else if(packet[0] == 0x9F) + packet_count=0x80; // End bind + else + packet_count=0; // Restart bind... + } } } } + else + packet_count=0; CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x20); // Enable RX abort CYRF_WriteRegister(CYRF_0F_XACT_CFG, 0x24); // Force end state CYRF_WriteRegister(CYRF_29_RX_ABORT, 0x00); // Disable RX abort @@ -256,13 +294,14 @@ uint16_t ReadMLINK() if(packet_count) return 18136; case MLINK_BIND_TX: - if(--bind_counter==0 || packet_count>=0x1A*2) + if(--bind_counter==0 || packet_count>=0x1B*2) { // Switch to normal mode BIND_DONE; phase=MLINK_PREP_DATA; + return 22720; } MLINK_send_bind_data_packet(); - if(packet_count == 0) + if(packet_count == 0 || packet_count > 0x19*2) { phase++; // MLINK_BIND_PREP_RX return 4700; // Original is 4900 @@ -280,58 +319,143 @@ uint16_t ReadMLINK() CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x82); // Prepare to receive phase++; //MLINK_BIND_RX return 28712-4700; + + case MLINK_PREP_DATA: CYRF_ConfigDataCode(MLINK_Data_Code,16); + MLINK_CRC_Init += 0xED; hopping_frequency_no = 0x00; - packet_count = 0; - MLINK_build_data_packet(); - phase++; - case MLINK_RF: - /*sum=0; - start=micros(); - while ((uint8_t)((uint8_t)micros()-(uint8_t)start) < 200) // Wait max 200µs for TX to finish - { - if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) - break; // Packet transmission complete - sum++; - } - debugln("S:%d",sum);*/ - //Set RF channel CYRF_ConfigRFChannel(hopping_frequency[hopping_frequency_no]); - //Set power CYRF_SetPower(0x38); - phase++; // MLINK_SEND - return 3100; - case MLINK_SEND: - /*sum=0; - start=micros(); - while ((uint8_t)((uint8_t)micros()-(uint8_t)start) < 200) // Wait max 200µs for TX to finish - { - if(CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS) & 0x02) - break; // Packet transmission complete - sum++; - } - debugln("SS:%d",sum);*/ - //Send packet + #ifdef MLINK_HUB_TELEMETRY + packet_count = 0; + telemetry_lost = 1; + #endif + phase++; + case MLINK_SEND1: + MLINK_build_data_packet(); CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); CYRF_WriteRegisterMulti(CYRF_20_TX_BUFFER, packet, MLINK_PACKET_SIZE); CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x82); - //Build next packet - packet_count++; - if(packet_count >= 78) - packet_count=0; - if(packet_count%3 == 0) - {//Change RF channel every 3 packets - phase=MLINK_RF; - hopping_frequency_no++; - if(hopping_frequency_no>=MLINK_NUM_FREQ) - hopping_frequency_no=0; - } - #ifdef MULTI_SYNC - telemetry_set_input_sync(6000); - #endif + phase++; + return 4880; + case MLINK_CHECK1: + status=CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); + //debugln("C1:%02X",status); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x00); + phase++; + return 1111; + case MLINK_SEND2: MLINK_build_data_packet(); - return 6000; + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); + CYRF_WriteRegisterMulti(CYRF_20_TX_BUFFER, packet, MLINK_PACKET_SIZE); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x82); + phase++; + return 4617; + case MLINK_CHECK2: + status=CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); + //debugln("C2:%02X",status); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x00); + phase++; + if(hopping_frequency_no%5==0) + return 1017; + return 1422; + case MLINK_SEND3: + MLINK_build_data_packet(); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x40); + CYRF_WriteRegisterMulti(CYRF_20_TX_BUFFER, packet, MLINK_PACKET_SIZE); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x82); + phase++; + return 4611; + case MLINK_CHECK3: + status=CYRF_ReadRegister(CYRF_04_TX_IRQ_STATUS); + //debugln("C3:%02X",status); + CYRF_WriteRegister(CYRF_02_TX_CTRL, 0x00); + + //check RX but there is nothing to check... + status=CYRF_ReadRegister(CYRF_05_RX_CTRL); + //debugln("CTRL:%02X",status); + len=CYRF_ReadRegister(CYRF_09_RX_COUNT); + //debugln("L=%02X",len) + if( len && len<=8 ) + CYRF_ReadDataPacketLen(packet, len*2); + CYRF_WriteRegister(CYRF_05_RX_CTRL,0x00); + + //Next channel + hopping_frequency_no++; + if(hopping_frequency_no>=MLINK_NUM_FREQ) + hopping_frequency_no=0; + CYRF_ConfigRFChannel(hopping_frequency[hopping_frequency_no]); + + //Receive telemetry + if(hopping_frequency_no%5==0) + {//Receive telemetry + CYRF_SetTxRxMode(RX_EN); // Receive mode + CYRF_WriteRegister(CYRF_05_RX_CTRL, 0x82); // Prepare to receive + phase++; //MLINK_RX + return 8038; + } + else + CYRF_SetPower(0x38); + phase=MLINK_SEND1; + return 4470; + case MLINK_RX: + #ifdef MLINK_HUB_TELEMETRY + //TX LQI calculation + packet_count++; + if(packet_count>=100) + { + packet_count=0; + TX_LQI=telemetry_counter; + if(telemetry_counter==0) + telemetry_lost = 1; + telemetry_counter = 0; + } + #endif + status=CYRF_ReadRegister(CYRF_05_RX_CTRL);//CYRF_07_RX_IRQ_STATUS); + debug("T(%02X):",status); + //status=CYRF_ReadRegister(CYRF_05_RX_CTRL); + //if( (status&0x80) == 0 ) + {//Packet received + len=CYRF_ReadRegister(CYRF_09_RX_COUNT); + debug("(%X)",len) + if( len && len<=8 ) + { + CYRF_ReadDataPacketLen(packet_in, len*2); + #ifdef MLINK_HUB_TELEMETRY + if(len==8) + { + //Check CRC + crc8=bit_reverse(MLINK_CRC_Init); + for(uint8_t i=0;i