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<