diff --git a/Multiprotocol/A7105_SPI.ino b/Multiprotocol/A7105_SPI.ino index 30c022b..f5c83d2 100644 --- a/Multiprotocol/A7105_SPI.ino +++ b/Multiprotocol/A7105_SPI.ino @@ -23,12 +23,12 @@ void A7105_WriteData(uint8_t len, uint8_t channel) { uint8_t i; - CS_off; + A7105_CS_off; SPI_Write(A7105_RST_WRPTR); SPI_Write(0x05); for (i = 0; i < len; i++) SPI_Write(packet[i]); - CS_on; + A7105_CS_on; A7105_WriteReg(0x0F, channel); A7105_Strobe(A7105_TX); } @@ -36,27 +36,27 @@ void A7105_WriteData(uint8_t len, uint8_t channel) void A7105_ReadData() { uint8_t i; A7105_Strobe(0xF0); //A7105_RST_RDPTR - CS_off; + A7105_CS_off; SPI_Write(0x45); for (i=0;i<16;i++) packet[i]=A7105_Read(); - CS_on; + A7105_CS_on; } void A7105_WriteReg(uint8_t address, uint8_t data) { - CS_off; + A7105_CS_off; SPI_Write(address); NOP(); SPI_Write(data); - CS_on; + A7105_CS_on; } uint8_t A7105_ReadReg(uint8_t address) { uint8_t result; - CS_off; + A7105_CS_off; SPI_Write(address |=0x40); //bit 6 =1 for reading result = A7105_Read(); - CS_on; + A7105_CS_on; return(result); } @@ -110,13 +110,13 @@ uint8_t A7105_Reset() } void A7105_WriteID(uint32_t ida) { - CS_off; + A7105_CS_off; SPI_Write(0x06);//ex id=0x5475c52a ;txid3txid2txid1txid0 SPI_Write((ida>>24)&0xff);//53 SPI_Write((ida>>16)&0xff);//75 SPI_Write((ida>>8)&0xff);//c5 SPI_Write((ida>>0)&0xff);//2a - CS_on; + A7105_CS_on; } /* @@ -162,9 +162,9 @@ void A7105_SetPower() } void A7105_Strobe(uint8_t address) { - CS_off; + A7105_CS_off; SPI_Write(address); - CS_on; + A7105_CS_on; } const uint8_t PROGMEM HUBSAN_A7105_regs[] = { diff --git a/Multiprotocol/FrSky1_cc2500.ino b/Multiprotocol/FrSky1_cc2500.ino new file mode 100644 index 0000000..9df5988 --- /dev/null +++ b/Multiprotocol/FrSky1_cc2500.ino @@ -0,0 +1,185 @@ +/* + This project is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Multiprotocol is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Multiprotocol. If not, see . + */ + +#if defined(FRSKY1_CC2500_INO) + +#include "iface_cc2500.h" + +static void __attribute__((unused)) FRSKY1_init() +{ + CC2500_WriteReg(CC2500_17_MCSM1, 0x0c); + CC2500_WriteReg(CC2500_18_MCSM0, 0x18); + CC2500_WriteReg(CC2500_06_PKTLEN, 0xff); + CC2500_WriteReg(CC2500_07_PKTCTRL1, 0x04); + CC2500_WriteReg(CC2500_08_PKTCTRL0, 0x05); + CC2500_WriteReg(CC2500_3E_PATABLE, 0xfe); + CC2500_WriteReg(CC2500_0B_FSCTRL1, 0x08); + CC2500_WriteReg(CC2500_0C_FSCTRL0, option); + CC2500_WriteReg(CC2500_0D_FREQ2, 0x5c); + CC2500_WriteReg(CC2500_0E_FREQ1, 0x58); + CC2500_WriteReg(CC2500_0F_FREQ0, 0x9d); + CC2500_WriteReg(CC2500_10_MDMCFG4, 0xaa); + CC2500_WriteReg(CC2500_11_MDMCFG3, 0x10); + CC2500_WriteReg(CC2500_12_MDMCFG2, 0x93); + CC2500_WriteReg(CC2500_13_MDMCFG1, 0x23); + CC2500_WriteReg(CC2500_14_MDMCFG0, 0x7a); + CC2500_WriteReg(CC2500_15_DEVIATN, 0x41); + for(uint8_t i=19;i<36;i++) + { + uint8_t reg=pgm_read_byte_near(&cc2500_conf[i][0]); + uint8_t val=pgm_read_byte_near(&cc2500_conf[i][1]); + CC2500_WriteReg(reg,val); + } + + CC2500_SetTxRxMode(TX_EN); + CC2500_SetPower(); + + CC2500_Strobe(CC2500_SIDLE); // Go to idle... + prev_option = option ; +} + +static uint8_t __attribute__((unused)) FRSKY1_crc8(uint8_t result, uint8_t *data, uint8_t len, uint8_t polynomial) +{ + 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; + else + result = result << 1; + } + return result; +} + +static uint8_t __attribute__((unused)) FRSKY1_crc8_le(uint8_t init, u8 *data, uint8_t len) +{ + uint8_t result = 0; + + for(uint8_t i = 0; i < 8; i++) + { + result = (result << 1) | (init & 0x01); + init >>= 1; + } + return FRSKY1_crc8(result,data,len,0x83); +} + +static void __attribute__((unused)) FRSKY1_build_bind_packet() +{ + //0e 03 01 57 12 00 06 0b 10 15 1a 00 00 00 61 + packet[0] = 0x0e; //Length + packet[1] = 0x03; //Packet type + packet[2] = 0x01; //Packet type + packet[3] = rx_tx_addr[3]; + packet[4] = rx_tx_addr[2]; + packet[5] = ((state - FRSKY_BIND) % 10) * 5; + packet[6] = packet[5] * 5 + 6; + packet[7] = packet[5] * 5 + 11; + packet[8] = packet[5] * 5 + 16; + packet[9] = packet[5] * 5 + 21; + packet[10] = packet[5] * 5 + 26; + packet[11] = 0x00; + packet[12] = 0x00; + packet[13] = 0x00; + packet[14] = FRSKY1_crc8(0x93, packet, 14, 0x07); +} + +static uint8_t __attribute__((unused)) FRSKY1_calc_channel() +{ + uint32_t temp=seed; + temp = (temp * 0xaa) % 0x7673; + seed = temp; + return (seed & 0xff) % 0x32; +} + +static void __attribute__((unused)) FRSKY1_build_data_packet() +{ + packet[0] = 0x0e; + packet[1] = rx_tx_addr[3]; + packet[2] = rx_tx_addr[2]; + packet[3] = seed & 0xff; + packet[4] = seed >> 8; + if (state == FRSKY_DATA1 || state == FRSKY_DATA3) + packet[5] = 0x0f; + else + if(state == FRSKY_DATA2 || state == FRSKY_DATA4) + packet[5] = 0xf0; + else + packet[5] = 0x00; + uint8_t idx = 0; //= (state == FRSKY_DATA1) ? 4 : 0; + for(uint8_t i = 0; i < 4; i++) + { + uint16_t value = convert_channel_frsky(i+idx); + packet[2*i + 6] = value & 0xff; + packet[2*i + 7] = value >> 8; + } + packet[14] = FRSKY1_crc8(crc8, packet, 14, 0x07); +} + +static uint16_t ReadFRSKY1() +{ + if (state < FRSKY_BIND_DONE) + { + FRSKY1_build_bind_packet(); + CC2500_Strobe(CC2500_SIDLE); + CC2500_WriteReg(CC2500_0A_CHANNR, 0x00); + CC2500_WriteData(packet, packet[0]+1); + state++; + return 53460; + } + if (state == FRSKY_BIND_DONE) + { + state++; + BIND_DONE; + } + 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(); + + CC2500_WriteData(packet, packet[0]+1); + if (state == FRSKY_DATA5) + { + CC2500_SetPower(); + state = FRSKY_DATA1; + } + else + state++; + return 9006; + } + return 0; +} + +uint16_t initFRSKY1() +{ + //u8 data[2] = {(fixed_id >> 8) & 0xff, fixed_id & 0xff}; + crc8 = FRSKY1_crc8_le(0x6b, rx_tx_addr+2, 2); // Use rx_tx_addr[2] and rx_tx_addr[3] since we want to use RX_Num + FRSKY1_init(); + seed = 1; + if(IS_AUTOBIND_FLAG_on) + state = FRSKY_BIND; + else + state = FRSKY_DATA1; + return 10000; +} + +#endif diff --git a/Multiprotocol/FrSky_cc2500.ino b/Multiprotocol/FrSky_cc2500.ino index 6e00447..78bbc89 100644 --- a/Multiprotocol/FrSky_cc2500.ino +++ b/Multiprotocol/FrSky_cc2500.ino @@ -17,26 +17,9 @@ #include "iface_cc2500.h" -//##########Variables######## -//uint32_t state; -//uint8_t len; - -/* -enum { - FRSKY_BIND = 0, - FRSKY_BIND_DONE = 1000, - FRSKY_DATA1, - FRSKY_DATA2, - FRSKY_DATA3, - FRSKY_DATA4, - FRSKY_DATA5 -}; -*/ - static void __attribute__((unused)) frsky2way_init(uint8_t bind) { // Configure cc2500 for tx mode - CC2500_Reset(); // for(uint8_t i=0;i<36;i++) { @@ -142,9 +125,9 @@ static void __attribute__((unused)) frsky2way_data_frame() uint16_t initFrSky_2way() { if(IS_AUTOBIND_FLAG_on) - { + { frsky2way_init(1); - state = FRSKY_BIND;// + state = FRSKY_BIND; } else { diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index 220bbc6..6e2d64c 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -52,7 +52,8 @@ enum PROTOCOLS MODE_SFHSS = 21, // =>CC2500 MODE_J6PRO = 22, // =>CYRF6936 MODE_FQ777 = 23, // =>NRF24L01 - MODE_ASSAN = 24 // =>NRF24L01 + MODE_ASSAN = 24, // =>NRF24L01 + MODE_FRSKY1 = 25 // =>CC2500 }; enum Flysky @@ -148,21 +149,22 @@ struct PPM_Parameters //******************* //*** Pinouts *** //******************* -#define LED_pin 13 //Promini original led on B5 -#define PPM_pin 3 //PPM-D3 +#define LED_pin 5 //D13 = PB5 +#define BIND_pin 5 //D13 = PB5 +#define PPM_pin 3 //D3 = PD3 #ifdef XMEGA - #define SDI_pin 6 //SDIO-D6 + #define SDI_pin 6 //SDIO-D6 #else - #define SDI_pin 5 //SDIO-D5 + #define SDI_pin 5 //D5 = PD5 #endif -#define SCLK_pin 4 //SCK-D4 -#define CS_pin 2 //CS-D2 -#define SDO_pin 6 //D6 -#define CC25_CSN_pin 7 -#define NRF_CSN_pin 8 -#define CYRF_CSN_pin 9 -#define CTRL1 1 //C1 (A1) -#define CTRL2 2 //C2 (A2) +#define SCLK_pin 4 //D4 = PD4 +#define A7105_CS_pin 2 //D2 = PD2 +#define SDO_pin 6 //D6 = PD6 +#define CC25_CSN_pin 7 //D7 = PD7 +#define NRF_CSN_pin 0 //D8 = PB0 +#define CYRF_CSN_pin 1 //D9 = PB1 +#define CTRL1_pin 1 //A1 = PC1 +#define CTRL2_pin 2 //A2 = PC2 // #ifdef XMEGA #define CTRL1_on @@ -177,39 +179,39 @@ struct PPM_Parameters #endif // #ifdef XMEGA - #define CS_on PORTD.OUTSET = _BV(4) //D4 - #define CS_off PORTD.OUTCLR = _BV(4) //D4 + #define A7105_CS_on PORTD.OUTSET = _BV(4) //D4 + #define A7105_CS_off PORTD.OUTCLR = _BV(4) //D4 #else - #define CS_on PORTD |= _BV(2) //D2 - #define CS_off PORTD &= ~_BV(2) //D2 + #define A7105_CS_on PORTD |= _BV(2) //D2 + #define A7105_CS_off PORTD &= ~_BV(2) //D2 #endif // #ifdef XMEGA - #define SCK_on PORTD.OUTSET = _BV(7) //D7 + #define SCK_on PORTD.OUTSET = _BV(7) //D7 #define SCK_off PORTD.OUTCLR = _BV(7) //D7 #else - #define SCK_on PORTD |= _BV(4) //D4 - #define SCK_off PORTD &= ~_BV(4) //D4 + #define SCK_on PORTD |= _BV(4) //D4 + #define SCK_off PORTD &= ~_BV(4) //D4 #endif // #ifdef XMEGA - #define SDI_on PORTD.OUTSET = _BV(5) //D5 + #define SDI_on PORTD.OUTSET = _BV(5) //D5 #define SDI_off PORTD.OUTCLR = _BV(5) //D5 #else - #define SDI_on PORTD |= _BV(5) //D5 - #define SDI_off PORTD &= ~_BV(5) //D5 + #define SDI_on PORTD |= _BV(5) //D5 + #define SDI_off PORTD &= ~_BV(5) //D5 #endif // #ifdef XMEGA - #define SDI_1 (PORTD.IN & (1< 0x80 1=Bind/0=No AutoBindBit=> 0x40 1=Yes /0=No RangeCheck=> 0x20 1=Yes /0=No diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 288af61..4d43874 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -64,6 +64,8 @@ uint8_t rf_ch_num; uint8_t throttle, rudder, elevator, aileron; uint8_t flags; uint16_t crc; +uint8_t crc8; +uint16_t seed; // uint16_t state; uint8_t len; @@ -148,16 +150,15 @@ void setup() PORTE.OUTCLR = 0x01 ; #else // General pinout - DDRD = (1<