mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-04 19:48:11 +00:00
Code cleanup
This commit is contained in:
parent
73aab88109
commit
cfcd6e5f93
@ -12,12 +12,9 @@
|
|||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
along with Multiprotocol. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
/********************/
|
||||||
//-------------------------------
|
/** A7105 routines **/
|
||||||
//-------------------------------
|
/********************/
|
||||||
//A7105 SPI routines
|
|
||||||
//-------------------------------
|
|
||||||
//-------------------------------
|
|
||||||
#include "iface_a7105.h"
|
#include "iface_a7105.h"
|
||||||
|
|
||||||
void A7105_WriteData(uint8_t len, uint8_t channel)
|
void A7105_WriteData(uint8_t len, uint8_t channel)
|
||||||
@ -39,7 +36,7 @@ void A7105_ReadData() {
|
|||||||
A7105_CSN_off;
|
A7105_CSN_off;
|
||||||
SPI_Write(0x45);
|
SPI_Write(0x45);
|
||||||
for (i=0;i<16;i++)
|
for (i=0;i<16;i++)
|
||||||
packet[i]=A7105_Read();
|
packet[i]=SPI_SDIO_Read();
|
||||||
A7105_CSN_on;
|
A7105_CSN_on;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,28 +52,11 @@ uint8_t A7105_ReadReg(uint8_t address) {
|
|||||||
uint8_t result;
|
uint8_t result;
|
||||||
A7105_CSN_off;
|
A7105_CSN_off;
|
||||||
SPI_Write(address |=0x40); //bit 6 =1 for reading
|
SPI_Write(address |=0x40); //bit 6 =1 for reading
|
||||||
result = A7105_Read();
|
result = SPI_SDIO_Read();
|
||||||
A7105_CSN_on;
|
A7105_CSN_on;
|
||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t A7105_Read(void)
|
|
||||||
{
|
|
||||||
uint8_t result=0;
|
|
||||||
SDI_input;
|
|
||||||
for(uint8_t i=0;i<8;i++)
|
|
||||||
{
|
|
||||||
result=result<<1;
|
|
||||||
if(SDI_1) ///if SDIO =1
|
|
||||||
result |= 0x01;
|
|
||||||
SCLK_on;
|
|
||||||
NOP();
|
|
||||||
SCLK_off;
|
|
||||||
}
|
|
||||||
SDI_output;
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------------------
|
//------------------------
|
||||||
void A7105_SetTxRxMode(uint8_t mode)
|
void A7105_SetTxRxMode(uint8_t mode)
|
||||||
{
|
{
|
||||||
|
@ -75,7 +75,7 @@ uint16_t ASSAN_callback()
|
|||||||
phase++;
|
phase++;
|
||||||
case ASSAN_BIND1:
|
case ASSAN_BIND1:
|
||||||
//Wait for receiver to send the frames
|
//Wait for receiver to send the frames
|
||||||
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
|
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
|
||||||
{ //Something has been received
|
{ //Something has been received
|
||||||
NRF24L01_ReadPayload(packet, ASSAN_PACKET_SIZE);
|
NRF24L01_ReadPayload(packet, ASSAN_PACKET_SIZE);
|
||||||
if(packet[19]==0x13)
|
if(packet[19]==0x13)
|
||||||
|
133
Multiprotocol/Arduino.ino
Normal file
133
Multiprotocol/Arduino.ino
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/************************************/
|
||||||
|
/** Arduino replacement routines **/
|
||||||
|
/************************************/
|
||||||
|
// replacement millis() and micros()
|
||||||
|
// These work polled, no interrupts
|
||||||
|
// micros() MUST be called at least once every 32 milliseconds
|
||||||
|
uint16_t MillisPrecount ;
|
||||||
|
uint16_t lastTimerValue ;
|
||||||
|
uint32_t TotalMicros ;
|
||||||
|
uint32_t TotalMillis ;
|
||||||
|
uint8_t Correction ;
|
||||||
|
|
||||||
|
uint32_t micros()
|
||||||
|
{
|
||||||
|
uint16_t elapsed ;
|
||||||
|
uint8_t millisToAdd ;
|
||||||
|
uint8_t oldSREG = SREG ;
|
||||||
|
cli() ;
|
||||||
|
uint16_t time = TCNT1 ; // Read timer 1
|
||||||
|
SREG = oldSREG ;
|
||||||
|
|
||||||
|
elapsed = time - lastTimerValue ;
|
||||||
|
elapsed += Correction ;
|
||||||
|
Correction = elapsed & 0x01 ;
|
||||||
|
elapsed >>= 1 ;
|
||||||
|
|
||||||
|
uint32_t ltime = TotalMicros ;
|
||||||
|
ltime += elapsed ;
|
||||||
|
cli() ;
|
||||||
|
TotalMicros = ltime ; // Done this way for RPM to work correctly
|
||||||
|
lastTimerValue = time ;
|
||||||
|
SREG = oldSREG ; // Still valid from above
|
||||||
|
|
||||||
|
elapsed += MillisPrecount;
|
||||||
|
millisToAdd = 0 ;
|
||||||
|
|
||||||
|
if ( elapsed > 15999 )
|
||||||
|
{
|
||||||
|
millisToAdd = 16 ;
|
||||||
|
elapsed -= 16000 ;
|
||||||
|
}
|
||||||
|
if ( elapsed > 7999 )
|
||||||
|
{
|
||||||
|
millisToAdd += 8 ;
|
||||||
|
elapsed -= 8000 ;
|
||||||
|
}
|
||||||
|
if ( elapsed > 3999 )
|
||||||
|
{
|
||||||
|
millisToAdd += 4 ;
|
||||||
|
elapsed -= 4000 ;
|
||||||
|
}
|
||||||
|
if ( elapsed > 1999 )
|
||||||
|
{
|
||||||
|
millisToAdd += 2 ;
|
||||||
|
elapsed -= 2000 ;
|
||||||
|
}
|
||||||
|
if ( elapsed > 999 )
|
||||||
|
{
|
||||||
|
millisToAdd += 1 ;
|
||||||
|
elapsed -= 1000 ;
|
||||||
|
}
|
||||||
|
TotalMillis += millisToAdd ;
|
||||||
|
MillisPrecount = elapsed ;
|
||||||
|
return TotalMicros ;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint32_t millis()
|
||||||
|
{
|
||||||
|
micros() ;
|
||||||
|
return TotalMillis ;
|
||||||
|
}
|
||||||
|
|
||||||
|
void delayMilliseconds(unsigned long ms)
|
||||||
|
{
|
||||||
|
uint16_t start = (uint16_t)micros();
|
||||||
|
uint16_t lms = ms ;
|
||||||
|
|
||||||
|
while (lms > 0) {
|
||||||
|
if (((uint16_t)micros() - start) >= 1000) {
|
||||||
|
lms--;
|
||||||
|
start += 1000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Important notes:
|
||||||
|
- Max value is 16000µs
|
||||||
|
- delay is not accurate due to interrupts happening */
|
||||||
|
void delayMicroseconds(unsigned int us)
|
||||||
|
{
|
||||||
|
if (--us == 0)
|
||||||
|
return;
|
||||||
|
us <<= 2; // * 4
|
||||||
|
us -= 2; // - 2
|
||||||
|
#ifdef XMEGA
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"1: sbiw %0,1" "\n\t" // 2 cycles
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"nop \n"
|
||||||
|
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
||||||
|
);
|
||||||
|
#else
|
||||||
|
__asm__ __volatile__ (
|
||||||
|
"1: sbiw %0,1" "\n\t" // 2 cycles
|
||||||
|
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
||||||
|
);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef XMEGA
|
||||||
|
void init()
|
||||||
|
{
|
||||||
|
// this needs to be called before setup() or some functions won't work there
|
||||||
|
sei();
|
||||||
|
}
|
||||||
|
#endif //XMEGA
|
||||||
|
|
@ -99,7 +99,7 @@ static void __attribute__((unused)) BAYANG_send_packet(uint8_t bind)
|
|||||||
|
|
||||||
// Power on, TX mode, 2byte CRC
|
// Power on, TX mode, 2byte CRC
|
||||||
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
|
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? BAYANG_RF_BIND_CHANNEL:hopping_frequency[hopping_frequency_no++]);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? BAYANG_RF_BIND_CHANNEL:hopping_frequency[hopping_frequency_no++]);
|
||||||
hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS;
|
hopping_frequency_no%=BAYANG_RF_NUM_CHANNELS;
|
||||||
|
@ -171,7 +171,7 @@ static void __attribute__((unused)) CG023_send_packet(uint8_t bind)
|
|||||||
|
|
||||||
// Power on, TX mode, 2byte CRC
|
// Power on, TX mode, 2byte CRC
|
||||||
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
if (bind)
|
if (bind)
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, sub_protocol==H8_3D?hopping_frequency[0]:CG023_RF_BIND_CHANNEL);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, sub_protocol==H8_3D?hopping_frequency[0]:CG023_RF_BIND_CHANNEL);
|
||||||
else
|
else
|
||||||
|
@ -148,7 +148,7 @@ static void __attribute__((unused)) CX10_Write_Packet(uint8_t bind)
|
|||||||
|
|
||||||
// Power on, TX mode, 2byte CRC
|
// Power on, TX mode, 2byte CRC
|
||||||
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
// Why CRC0? xn297 does not interpret it - either 16-bit CRC or nothing
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
if (bind)
|
if (bind)
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, CX10_RF_BIND_CHANNEL);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, CX10_RF_BIND_CHANNEL);
|
||||||
else
|
else
|
||||||
@ -197,7 +197,7 @@ uint16_t CX10_callback()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CX10_BIND2:
|
case CX10_BIND2:
|
||||||
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
|
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
|
||||||
{ // RX fifo data ready
|
{ // RX fifo data ready
|
||||||
XN297_ReadPayload(packet, packet_length);
|
XN297_ReadPayload(packet, packet_length);
|
||||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||||
@ -220,7 +220,7 @@ uint16_t CX10_callback()
|
|||||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||||
NRF24L01_FlushRx();
|
NRF24L01_FlushRx();
|
||||||
NRF24L01_SetTxRxMode(RX_EN);
|
NRF24L01_SetTxRxMode(RX_EN);
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP) | BV(NRF24L01_00_PRIM_RX));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) | _BV(NRF24L01_00_PRIM_RX));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CX10_DATA:
|
case CX10_DATA:
|
||||||
|
79
Multiprotocol/Convert.ino
Normal file
79
Multiprotocol/Convert.ino
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/************************/
|
||||||
|
/** Convert routines **/
|
||||||
|
/************************/
|
||||||
|
int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
|
||||||
|
{
|
||||||
|
// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
||||||
|
long y ;
|
||||||
|
x -= in_min ;
|
||||||
|
y = out_max - out_min ;
|
||||||
|
y *= x ;
|
||||||
|
x = y / (in_max - in_min) ;
|
||||||
|
return x + out_min ;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is converted to 8bit values full scale
|
||||||
|
uint8_t convert_channel_8b(uint8_t num)
|
||||||
|
{
|
||||||
|
return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,0,255));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is converted to 8bit values to provided values scale
|
||||||
|
uint8_t convert_channel_8b_scale(uint8_t num,uint8_t min,uint8_t max)
|
||||||
|
{
|
||||||
|
return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,min,max));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is converted sign + magnitude 8bit values
|
||||||
|
uint8_t convert_channel_s8b(uint8_t num)
|
||||||
|
{
|
||||||
|
uint8_t ch;
|
||||||
|
ch = convert_channel_8b(num);
|
||||||
|
return (ch < 128 ? 127-ch : ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is converted to 10bit values
|
||||||
|
uint16_t convert_channel_10b(uint8_t num)
|
||||||
|
{
|
||||||
|
return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,1,1023));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is multiplied by 1.5
|
||||||
|
uint16_t convert_channel_frsky(uint8_t num)
|
||||||
|
{
|
||||||
|
return Servo_data[num] + Servo_data[num]/2;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is converted for HK310
|
||||||
|
void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
|
||||||
|
{
|
||||||
|
uint16_t temp=0xFFFF-(4*Servo_data[num])/3;
|
||||||
|
*low=(uint8_t)(temp&0xFF);
|
||||||
|
*high=(uint8_t)(temp>>8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Channel value is limited to PPM_100
|
||||||
|
uint16_t limit_channel_100(uint8_t ch)
|
||||||
|
{
|
||||||
|
if(Servo_data[ch]>servo_max_100)
|
||||||
|
return servo_max_100;
|
||||||
|
else
|
||||||
|
if (Servo_data[ch]<servo_min_100)
|
||||||
|
return servo_min_100;
|
||||||
|
return Servo_data[ch];
|
||||||
|
}
|
||||||
|
|
@ -35,7 +35,7 @@ static void __attribute__((unused)) ESKY_init(uint8_t bind)
|
|||||||
NRF24L01_Initialize();
|
NRF24L01_Initialize();
|
||||||
|
|
||||||
// 2-bytes CRC, radio off
|
// 2-bytes CRC, radio off
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowledgement
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknowledgement
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
||||||
if (bind)
|
if (bind)
|
||||||
|
@ -105,7 +105,7 @@ uint16_t FY326_callback()
|
|||||||
switch (phase)
|
switch (phase)
|
||||||
{
|
{
|
||||||
case FY326_BIND1:
|
case FY326_BIND1:
|
||||||
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
|
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
|
||||||
{ // RX fifo data ready
|
{ // RX fifo data ready
|
||||||
NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE);
|
NRF24L01_ReadPayload(packet, FY326_PACKET_SIZE);
|
||||||
rxid = packet[13];
|
rxid = packet[13];
|
||||||
@ -127,7 +127,7 @@ uint16_t FY326_callback()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FY326_BIND2:
|
case FY326_BIND2:
|
||||||
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS))
|
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))
|
||||||
{ // TX data sent -> switch to RX mode
|
{ // TX data sent -> switch to RX mode
|
||||||
NRF24L01_SetTxRxMode(TXRX_OFF);
|
NRF24L01_SetTxRxMode(TXRX_OFF);
|
||||||
NRF24L01_FlushRx();
|
NRF24L01_FlushRx();
|
||||||
|
@ -121,7 +121,7 @@ static void __attribute__((unused)) HONTAI_send_packet(uint8_t bind)
|
|||||||
if(sub_protocol == FORMAT_JJRCX1)
|
if(sub_protocol == FORMAT_JJRCX1)
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
else
|
else
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
|
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? HONTAI_RF_BIND_CHANNEL : hopping_frequency[hopping_frequency_no++]);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, bind ? HONTAI_RF_BIND_CHANNEL : hopping_frequency[hopping_frequency_no++]);
|
||||||
hopping_frequency_no %= 3;
|
hopping_frequency_no %= 3;
|
||||||
|
@ -246,7 +246,7 @@ static void __attribute__((unused)) kn_init()
|
|||||||
|
|
||||||
NRF24L01_Initialize();
|
NRF24L01_Initialize();
|
||||||
|
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
||||||
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
||||||
@ -259,7 +259,7 @@ static void __attribute__((unused)) kn_init()
|
|||||||
NRF24L01_Activate(0x73);
|
NRF24L01_Activate(0x73);
|
||||||
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 1); // Dynamic payload for data pipe 0
|
NRF24L01_WriteReg(NRF24L01_1C_DYNPD, 1); // Dynamic payload for data pipe 0
|
||||||
// Enable: Dynamic Payload Length to enable PCF
|
// Enable: Dynamic Payload Length to enable PCF
|
||||||
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, BV(NRF2401_1D_EN_DPL));
|
NRF24L01_WriteReg(NRF24L01_1D_FEATURE, _BV(NRF2401_1D_EN_DPL));
|
||||||
|
|
||||||
NRF24L01_SetPower();
|
NRF24L01_SetPower();
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ static void __attribute__((unused)) MJXQ_send_packet(uint8_t bind)
|
|||||||
if (sub_protocol == H26D)
|
if (sub_protocol == H26D)
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
else
|
else
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
|
|
||||||
NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]);
|
NRF24L01_WriteReg(NRF24L01_05_RF_CH, hopping_frequency[hopping_frequency_no++ / 2]);
|
||||||
hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated
|
hopping_frequency_no %= 2 * MJXQ_RF_NUM_CHANNELS; // channels repeated
|
||||||
|
@ -169,7 +169,7 @@ static void __attribute__((unused)) MT99XX_init()
|
|||||||
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
|
NRF24L01_SetBitrate(NRF24L01_BR_1M); // 1Mbps
|
||||||
NRF24L01_SetPower();
|
NRF24L01_SetPower();
|
||||||
|
|
||||||
XN297_Configure(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP) );
|
XN297_Configure(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP) );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,12 +15,12 @@
|
|||||||
|
|
||||||
// Check selected board type
|
// Check selected board type
|
||||||
#ifndef XMEGA
|
#ifndef XMEGA
|
||||||
#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO)
|
#if not defined(ARDUINO_AVR_PRO) && not defined(ARDUINO_AVR_MINI) && not defined(ARDUINO_AVR_NANO)
|
||||||
#error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini"
|
#error You must select the board type "Arduino Pro or Pro Mini" or "Arduino Mini"
|
||||||
#endif
|
#endif
|
||||||
#if F_CPU != 16000000L || not defined(__AVR_ATmega328P__)
|
#if F_CPU != 16000000L || not defined(__AVR_ATmega328P__)
|
||||||
#error You must select the processor type "ATmega328(5V, 16MHz)"
|
#error You must select the processor type "ATmega328(5V, 16MHz)"
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//******************
|
//******************
|
||||||
@ -156,6 +156,9 @@ struct PPM_Parameters
|
|||||||
uint8_t option;
|
uint8_t option;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Macros
|
||||||
|
#define NOP() __asm__ __volatile__("nop")
|
||||||
|
|
||||||
//*******************
|
//*******************
|
||||||
//*** Timer ***
|
//*** Timer ***
|
||||||
//*******************
|
//*******************
|
||||||
@ -177,207 +180,15 @@ struct PPM_Parameters
|
|||||||
#define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B)
|
#define CLR_TIMSK1_OCIE1B TIMSK1 &=~_BV(OCIE1B)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//*******************
|
//***************
|
||||||
//*** Pinouts ***
|
//*** Flags ***
|
||||||
//*******************
|
//***************
|
||||||
|
|
||||||
// TX
|
|
||||||
#define SERIAL_TX_pin 1 //PD1
|
|
||||||
#define SERIAL_TX_port PORTD
|
|
||||||
#define SERIAL_TX_ddr DDRD
|
|
||||||
#define SERIAL_TX_output SERIAL_TX_ddr |= _BV(SERIAL_TX_pin)
|
|
||||||
#define SERIAL_TX_on SERIAL_TX_port |= _BV(SERIAL_TX_pin)
|
|
||||||
#define SERIAL_TX_off SERIAL_TX_port &= ~_BV(SERIAL_TX_pin)
|
|
||||||
#ifdef DEBUG_TX
|
|
||||||
#define DEBUG_TX_on SERIAL_TX_ON
|
|
||||||
#define DEBUG_TX_off SERIAL_TX_OFF
|
|
||||||
#define DEBUG_TX_toggle SERIAL_TX_port ^= _BV(SERIAL_TX_pin)
|
|
||||||
#else
|
|
||||||
#define DEBUG_TX_on
|
|
||||||
#define DEBUG_TX_off
|
|
||||||
#define DEBUG_TX_toggle
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Dial
|
|
||||||
#define MODE_DIAL1_pin 2
|
|
||||||
#define MODE_DIAL1_port PORTB
|
|
||||||
#define MODE_DIAL1_ipr PINB
|
|
||||||
#define MODE_DIAL2_pin 3
|
|
||||||
#define MODE_DIAL2_port PORTB
|
|
||||||
#define MODE_DIAL2_ipr PINB
|
|
||||||
#define MODE_DIAL3_pin 4
|
|
||||||
#define MODE_DIAL3_port PORTB
|
|
||||||
#define MODE_DIAL3_ipr PINB
|
|
||||||
#define MODE_DIAL4_pin 0
|
|
||||||
#define MODE_DIAL4_port PORTC
|
|
||||||
#define MODE_DIAL4_ipr PINC
|
|
||||||
|
|
||||||
// PPM
|
|
||||||
#define PPM_pin 3 //D3 = PD3
|
|
||||||
#define PPM_port PORTD
|
|
||||||
|
|
||||||
// SDIO
|
|
||||||
#define SDI_pin 5 //D5 = PD5
|
|
||||||
#define SDI_port PORTD
|
|
||||||
#define SDI_ipr PIND
|
|
||||||
#define SDI_ddr DDRD
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define SDI_on SDI_port.OUTSET = _BV(SDI_pin)
|
|
||||||
#define SDI_off SDI_port.OUTCLR = _BV(SDI_pin)
|
|
||||||
#else
|
|
||||||
#define SDI_on SDI_port |= _BV(SDI_pin)
|
|
||||||
#define SDI_off SDI_port &= ~_BV(SDI_pin)
|
|
||||||
#define SDI_1 (SDI_ipr & _BV(SDI_pin))
|
|
||||||
#define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00
|
|
||||||
#endif
|
|
||||||
#define SDI_input SDI_ddr &= ~_BV(SDI_pin)
|
|
||||||
#define SDI_output SDI_ddr |= _BV(SDI_pin)
|
|
||||||
|
|
||||||
//SDO
|
|
||||||
#define SDO_pin 6 //D6 = PD6
|
|
||||||
#define SDO_port PORTD
|
|
||||||
#define SDO_ipr PIND
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define SDO_1 (SDO_port.IN & _BV(SDO_pin))
|
|
||||||
#define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00
|
|
||||||
#else
|
|
||||||
#define SDO_1 (SDO_ipr & _BV(SDO_pin))
|
|
||||||
#define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// SCLK
|
|
||||||
#define SCLK_port PORTD
|
|
||||||
#define SCLK_ddr DDRD
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define SCLK_pin 7 //PD7
|
|
||||||
#define SCLK_on SCLK_port.OUTSET = _BV(SCLK_pin)
|
|
||||||
#define SCLK_off SCLK_port.OUTCLR = _BV(SCLK_pin)
|
|
||||||
#else
|
|
||||||
#define SCLK_pin 4 //D4 = PD4
|
|
||||||
#define SCLK_output SCLK_ddr |= _BV(SCLK_pin)
|
|
||||||
#define SCLK_on SCLK_port |= _BV(SCLK_pin)
|
|
||||||
#define SCLK_off SCLK_port &= ~_BV(SCLK_pin)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// A7105
|
|
||||||
#define A7105_CSN_pin 2 //D2 = PD2
|
|
||||||
#define A7105_CSN_port PORTD
|
|
||||||
#define A7105_CSN_ddr DDRD
|
|
||||||
#define A7105_CSN_output A7105_CSN_ddr |= _BV(A7105_CSN_pin)
|
|
||||||
#define A7105_CSN_on A7105_CSN_port |= _BV(A7105_CSN_pin)
|
|
||||||
#define A7105_CSN_off A7105_CSN_port &= ~_BV(A7105_CSN_pin)
|
|
||||||
|
|
||||||
// CC2500
|
|
||||||
#define CC25_CSN_pin 7 //D7 = PD7
|
|
||||||
#define CC25_CSN_port PORTD
|
|
||||||
#define CC25_CSN_ddr DDRD
|
|
||||||
#define CC25_CSN_output CC25_CSN_ddr |= _BV(CC25_CSN_pin)
|
|
||||||
#define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin)
|
|
||||||
#define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin)
|
|
||||||
|
|
||||||
// NRF24L01
|
|
||||||
#define NRF_CSN_pin 0 //D8 = PB0
|
|
||||||
#define NRF_CSN_port PORTB
|
|
||||||
#define NRF_CSN_ddr DDRB
|
|
||||||
#define NRF_CSN_output NRF_CSN_ddr |= _BV(NRF_CSN_pin)
|
|
||||||
#define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin)
|
|
||||||
#define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin)
|
|
||||||
#define NRF_CE_on
|
|
||||||
#define NRF_CE_off
|
|
||||||
|
|
||||||
// CYRF6936
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define CYRF_CSN_pin 4 //PD4
|
|
||||||
#define CYRF_CSN_port PORTD
|
|
||||||
#define CYRF_CSN_ddr DDRD
|
|
||||||
#define CYRF_CSN_on CYRF_CSN_port.OUTSET = _BV(CYRF_CSN_pin)
|
|
||||||
#define CYRF_CSN_off CYRF_CSN_port.OUTCLR = _BV(CYRF_CSN_pin)
|
|
||||||
#else
|
|
||||||
#define CYRF_CSN_pin 1 //D9 = PB1
|
|
||||||
#define CYRF_CSN_port PORTB
|
|
||||||
#define CYRF_CSN_ddr DDRB
|
|
||||||
#define CYRF_CSN_output CYRF_CSN_ddr |= _BV(CYRF_CSN_pin)
|
|
||||||
#define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin)
|
|
||||||
#define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin)
|
|
||||||
|
|
||||||
#define CYRF_RST_pin 5 //A5 = PC5
|
|
||||||
#define CYRF_RST_port PORTC
|
|
||||||
#define CYRF_RST_ddr DDRC
|
|
||||||
#define CYRF_RST_output CYRF_RST_ddr |= _BV(CYRF_RST_pin)
|
|
||||||
#define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin)
|
|
||||||
#define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//RF Switch
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define PE1_on
|
|
||||||
#define PE1_off
|
|
||||||
#define PE2_on
|
|
||||||
#define PE2_off
|
|
||||||
#else
|
|
||||||
#define PE1_pin 1 //A1 = PC1
|
|
||||||
#define PE1_port PORTC
|
|
||||||
#define PE1_ddr DDRC
|
|
||||||
#define PE1_output PE1_ddr |= _BV(PE1_pin)
|
|
||||||
#define PE1_on PE1_port |= _BV(PE1_pin)
|
|
||||||
#define PE1_off PE1_port &= ~_BV(PE1_pin)
|
|
||||||
|
|
||||||
#define PE2_pin 2 //A2 = PC2
|
|
||||||
#define PE2_port PORTC
|
|
||||||
#define PE2_ddr DDRC
|
|
||||||
#define PE2_output PE2_ddr |= _BV(PE2_pin)
|
|
||||||
#define PE2_on PE2_port |= _BV(PE2_pin)
|
|
||||||
#define PE2_off PE2_port &= ~_BV(PE2_pin)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// LED
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define LED_pin 1 //PD1
|
|
||||||
#define LED_port PORTD
|
|
||||||
#define LED_ddr DDRD
|
|
||||||
#define LED_on LED_port.OUTCLR = _BV(LED_pin)
|
|
||||||
#define LED_off LED_port.OUTSET = _BV(LED_pin)
|
|
||||||
#define LED_toggle LED_port.OUTTGL = _BV(LED_pin)
|
|
||||||
#define LED_output LED_port.DIRSET = _BV(LED_pin)
|
|
||||||
#define IS_LED_on (LED_port.OUT & _BV(LED_pin))
|
|
||||||
#else
|
|
||||||
#define LED_pin 5 //D13 = PB5
|
|
||||||
#define LED_port PORTB
|
|
||||||
#define LED_ddr DDRB
|
|
||||||
#define LED_on LED_port |= _BV(LED_pin)
|
|
||||||
#define LED_off LED_port &= ~_BV(LED_pin)
|
|
||||||
#define LED_toggle LED_port ^= _BV(LED_pin)
|
|
||||||
#define LED_output LED_ddr |= _BV(LED_pin)
|
|
||||||
#define IS_LED_on (LED_port & _BV(LED_pin))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//BIND
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define BIND_pin 2 //PD2
|
|
||||||
#define BIND_port PORTD
|
|
||||||
#define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 )
|
|
||||||
#else
|
|
||||||
#define BIND_pin 5 //D13 = PB5
|
|
||||||
#define BIND_port PORTB
|
|
||||||
#define BIND_ipr PINB
|
|
||||||
#define BIND_ddr DDRB
|
|
||||||
#define BIND_SET_INPUT BIND_ddr &= ~_BV(BIND_pin)
|
|
||||||
#define BIND_SET_OUTPUT BIND_ddr |= _BV(BIND_pin)
|
|
||||||
#define BIND_SET_PULLUP BIND_port |= _BV(BIND_pin)
|
|
||||||
#define IS_BIND_BUTTON_on ( (BIND_ipr & _BV(BIND_pin)) == 0x00 )
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Macros
|
|
||||||
#define NOP() __asm__ __volatile__("nop")
|
|
||||||
#define BV(bit) (1 << bit)
|
|
||||||
|
|
||||||
//Serial flags definition
|
|
||||||
#define RX_FLAG_on protocol_flags |= _BV(0)
|
#define RX_FLAG_on protocol_flags |= _BV(0)
|
||||||
#define RX_FLAG_off protocol_flags &= ~_BV(0)
|
#define RX_FLAG_off protocol_flags &= ~_BV(0)
|
||||||
#define IS_RX_FLAG_on ( ( protocol_flags & _BV(0) ) !=0 )
|
#define IS_RX_FLAG_on ( ( protocol_flags & _BV(0) ) !=0 )
|
||||||
//
|
//
|
||||||
#define CHANGE_PROTOCOL_FLAG_on protocol_flags |= _BV(1)
|
#define CHANGE_PROTOCOL_FLAG_on protocol_flags |= _BV(1)
|
||||||
#define CHANGE_PROTOCOL_FLAG_off protocol_flags &= ~_BV(1)
|
#define CHANGE_PROTOCOL_FLAG_off protocol_flags &= ~_BV(1)
|
||||||
#define IS_CHANGE_PROTOCOL_FLAG_on ( ( protocol_flags & _BV(1) ) !=0 )
|
#define IS_CHANGE_PROTOCOL_FLAG_on ( ( protocol_flags & _BV(1) ) !=0 )
|
||||||
//
|
//
|
||||||
#define POWER_FLAG_on protocol_flags |= _BV(2)
|
#define POWER_FLAG_on protocol_flags |= _BV(2)
|
||||||
@ -395,45 +206,47 @@ struct PPM_Parameters
|
|||||||
#define BIND_BUTTON_FLAG_on protocol_flags |= _BV(5)
|
#define BIND_BUTTON_FLAG_on protocol_flags |= _BV(5)
|
||||||
#define BIND_BUTTON_FLAG_off protocol_flags &= ~_BV(5)
|
#define BIND_BUTTON_FLAG_off protocol_flags &= ~_BV(5)
|
||||||
#define IS_BIND_BUTTON_FLAG_on ( ( protocol_flags & _BV(5) ) !=0 )
|
#define IS_BIND_BUTTON_FLAG_on ( ( protocol_flags & _BV(5) ) !=0 )
|
||||||
|
|
||||||
//PPM RX OK
|
//PPM RX OK
|
||||||
#define PPM_FLAG_off protocol_flags &= ~_BV(6)
|
#define PPM_FLAG_off protocol_flags &= ~_BV(6)
|
||||||
#define PPM_FLAG_on protocol_flags |= _BV(6)
|
#define PPM_FLAG_on protocol_flags |= _BV(6)
|
||||||
#define IS_PPM_FLAG_on ( ( protocol_flags & _BV(6) ) !=0 )
|
#define IS_PPM_FLAG_on ( ( protocol_flags & _BV(6) ) !=0 )
|
||||||
|
//Bind flag
|
||||||
//Bind flag for blinking
|
|
||||||
#define BIND_IN_PROGRESS protocol_flags &= ~_BV(7)
|
#define BIND_IN_PROGRESS protocol_flags &= ~_BV(7)
|
||||||
#define BIND_DONE protocol_flags |= _BV(7)
|
#define BIND_DONE protocol_flags |= _BV(7)
|
||||||
#define IS_BIND_DONE_on ( ( protocol_flags & _BV(7) ) !=0 )
|
#define IS_BIND_DONE_on ( ( protocol_flags & _BV(7) ) !=0 )
|
||||||
|
//
|
||||||
#define BAD_PROTO_off protocol_flags2 &= ~_BV(0)
|
#define BAD_PROTO_off protocol_flags2 &= ~_BV(0)
|
||||||
#define BAD_PROTO_on protocol_flags2 |= _BV(0)
|
#define BAD_PROTO_on protocol_flags2 |= _BV(0)
|
||||||
#define IS_BAD_PROTO_on ( ( protocol_flags2 & _BV(0) ) !=0 )
|
#define IS_BAD_PROTO_on ( ( protocol_flags2 & _BV(0) ) !=0 )
|
||||||
|
//
|
||||||
#define RX_DONOTUPDTAE_off protocol_flags2 &= ~_BV(1)
|
#define RX_DONOTUPDTAE_off protocol_flags2 &= ~_BV(1)
|
||||||
#define RX_DONOTUPDTAE_on protocol_flags2 |= _BV(1)
|
#define RX_DONOTUPDTAE_on protocol_flags2 |= _BV(1)
|
||||||
#define IS_RX_DONOTUPDTAE_on ( ( protocol_flags2 & _BV(1) ) !=0 )
|
#define IS_RX_DONOTUPDTAE_on ( ( protocol_flags2 & _BV(1) ) !=0 )
|
||||||
|
//
|
||||||
#define RX_MISSED_BUFF_off protocol_flags2 &= ~_BV(2)
|
#define RX_MISSED_BUFF_off protocol_flags2 &= ~_BV(2)
|
||||||
#define RX_MISSED_BUFF_on protocol_flags2 |= _BV(2)
|
#define RX_MISSED_BUFF_on protocol_flags2 |= _BV(2)
|
||||||
#define IS_RX_MISSED_BUFF_on ( ( protocol_flags2 & _BV(2) ) !=0 )
|
#define IS_RX_MISSED_BUFF_on ( ( protocol_flags2 & _BV(2) ) !=0 )
|
||||||
|
//TX Pause
|
||||||
#define TX_MAIN_PAUSE_off protocol_flags2 &= ~_BV(3)
|
#define TX_MAIN_PAUSE_off protocol_flags2 &= ~_BV(3)
|
||||||
#define TX_MAIN_PAUSE_on protocol_flags2 |= _BV(3)
|
#define TX_MAIN_PAUSE_on protocol_flags2 |= _BV(3)
|
||||||
#define IS_TX_MAIN_PAUSE_on ( ( protocol_flags2 & _BV(3) ) !=0 )
|
#define IS_TX_MAIN_PAUSE_on ( ( protocol_flags2 & _BV(3) ) !=0 )
|
||||||
|
|
||||||
#define TX_RX_PAUSE_off protocol_flags2 &= ~_BV(4)
|
#define TX_RX_PAUSE_off protocol_flags2 &= ~_BV(4)
|
||||||
#define TX_RX_PAUSE_on protocol_flags2 |= _BV(4)
|
#define TX_RX_PAUSE_on protocol_flags2 |= _BV(4)
|
||||||
#define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 )
|
#define IS_TX_RX_PAUSE_on ( ( protocol_flags2 & _BV(4) ) !=0 )
|
||||||
|
|
||||||
#define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 )
|
#define IS_TX_PAUSE_on ( ( protocol_flags2 & (_BV(4)|_BV(3)) ) !=0 )
|
||||||
|
|
||||||
#define BLINK_BIND_TIME 100
|
//********************
|
||||||
#define BLINK_SERIAL_TIME 500
|
//*** Blink timing ***
|
||||||
|
//********************
|
||||||
|
#define BLINK_BIND_TIME 100
|
||||||
|
#define BLINK_SERIAL_TIME 500
|
||||||
#define BLINK_BAD_PROTO_TIME_LOW 1000
|
#define BLINK_BAD_PROTO_TIME_LOW 1000
|
||||||
#define BLINK_BAD_PROTO_TIME_HIGH 50
|
#define BLINK_BAD_PROTO_TIME_HIGH 50
|
||||||
|
|
||||||
//AUX flags definition
|
//*******************
|
||||||
|
//*** AUX flags ***
|
||||||
|
//*******************
|
||||||
|
#define GET_FLAG(ch, mask) ( ch ? mask : 0)
|
||||||
#define Servo_AUX1 Servo_AUX & _BV(0)
|
#define Servo_AUX1 Servo_AUX & _BV(0)
|
||||||
#define Servo_AUX2 Servo_AUX & _BV(1)
|
#define Servo_AUX2 Servo_AUX & _BV(1)
|
||||||
#define Servo_AUX3 Servo_AUX & _BV(2)
|
#define Servo_AUX3 Servo_AUX & _BV(2)
|
||||||
@ -443,8 +256,6 @@ struct PPM_Parameters
|
|||||||
#define Servo_AUX7 Servo_AUX & _BV(6)
|
#define Servo_AUX7 Servo_AUX & _BV(6)
|
||||||
#define Servo_AUX8 Servo_AUX & _BV(7)
|
#define Servo_AUX8 Servo_AUX & _BV(7)
|
||||||
|
|
||||||
#define GET_FLAG(ch, mask) ( ch ? mask : 0)
|
|
||||||
|
|
||||||
//************************
|
//************************
|
||||||
//*** Power settings ***
|
//*** Power settings ***
|
||||||
//************************
|
//************************
|
||||||
|
@ -23,6 +23,7 @@
|
|||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
//#define DEBUG_TX
|
//#define DEBUG_TX
|
||||||
|
#include "Pins.h"
|
||||||
#include "Multiprotocol.h"
|
#include "Multiprotocol.h"
|
||||||
|
|
||||||
//Multiprotocol module configuration file
|
//Multiprotocol module configuration file
|
||||||
@ -34,6 +35,9 @@
|
|||||||
#undef A7105_INSTALLED // Disable A7105 for OrangeTX module
|
#undef A7105_INSTALLED // Disable A7105 for OrangeTX module
|
||||||
#undef CC2500_INSTALLED // Disable CC2500 for OrangeTX module
|
#undef CC2500_INSTALLED // Disable CC2500 for OrangeTX module
|
||||||
#undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module
|
#undef NRF24L01_INSTALLED // Disable NRF for OrangeTX module
|
||||||
|
#define TELEMETRY // Enable telemetry
|
||||||
|
#define INVERT_TELEMETRY // Enable invert telemetry
|
||||||
|
#define DSM_TELEMETRY // Enable DSM telemetry
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//Global constants/variables
|
//Global constants/variables
|
||||||
@ -213,7 +217,7 @@ void setup()
|
|||||||
#endif
|
#endif
|
||||||
PE1_output;
|
PE1_output;
|
||||||
PE2_output;
|
PE2_output;
|
||||||
//SERIAL_TX_output;
|
SERIAL_TX_output;
|
||||||
|
|
||||||
// pullups
|
// pullups
|
||||||
MODE_DIAL1_port |= _BV(MODE_DIAL1_pin);
|
MODE_DIAL1_port |= _BV(MODE_DIAL1_pin);
|
||||||
@ -826,68 +830,6 @@ void modules_reset()
|
|||||||
prev_power=0xFD; // unused power value
|
prev_power=0xFD; // unused power value
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t map( int16_t x, int16_t in_min, int16_t in_max, int16_t out_min, int16_t out_max)
|
|
||||||
{
|
|
||||||
// return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
|
|
||||||
long y ;
|
|
||||||
x -= in_min ;
|
|
||||||
y = out_max - out_min ;
|
|
||||||
y *= x ;
|
|
||||||
x = y / (in_max - in_min) ;
|
|
||||||
return x + out_min ;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is converted to 8bit values full scale
|
|
||||||
uint8_t convert_channel_8b(uint8_t num)
|
|
||||||
{
|
|
||||||
return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,0,255));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is converted to 8bit values to provided values scale
|
|
||||||
uint8_t convert_channel_8b_scale(uint8_t num,uint8_t min,uint8_t max)
|
|
||||||
{
|
|
||||||
return (uint8_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,min,max));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is converted sign + magnitude 8bit values
|
|
||||||
uint8_t convert_channel_s8b(uint8_t num)
|
|
||||||
{
|
|
||||||
uint8_t ch;
|
|
||||||
ch = convert_channel_8b(num);
|
|
||||||
return (ch < 128 ? 127-ch : ch);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is converted to 10bit values
|
|
||||||
uint16_t convert_channel_10b(uint8_t num)
|
|
||||||
{
|
|
||||||
return (uint16_t) (map(limit_channel_100(num),servo_min_100,servo_max_100,1,1023));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is multiplied by 1.5
|
|
||||||
uint16_t convert_channel_frsky(uint8_t num)
|
|
||||||
{
|
|
||||||
return Servo_data[num] + Servo_data[num]/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is converted for HK310
|
|
||||||
void convert_channel_HK310(uint8_t num, uint8_t *low, uint8_t *high)
|
|
||||||
{
|
|
||||||
uint16_t temp=0xFFFF-(4*Servo_data[num])/3;
|
|
||||||
*low=(uint8_t)(temp&0xFF);
|
|
||||||
*high=(uint8_t)(temp>>8);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Channel value is limited to PPM_100
|
|
||||||
uint16_t limit_channel_100(uint8_t ch)
|
|
||||||
{
|
|
||||||
if(Servo_data[ch]>servo_max_100)
|
|
||||||
return servo_max_100;
|
|
||||||
else
|
|
||||||
if (Servo_data[ch]<servo_min_100)
|
|
||||||
return servo_min_100;
|
|
||||||
return Servo_data[ch];
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mprotocol_serial_init()
|
void Mprotocol_serial_init()
|
||||||
{
|
{
|
||||||
#ifdef XMEGA
|
#ifdef XMEGA
|
||||||
@ -942,7 +884,7 @@ static void set_rx_tx_addr(uint32_t id)
|
|||||||
rx_tx_addr[1] = (id >> 16) & 0xFF;
|
rx_tx_addr[1] = (id >> 16) & 0xFF;
|
||||||
rx_tx_addr[2] = (id >> 8) & 0xFF;
|
rx_tx_addr[2] = (id >> 8) & 0xFF;
|
||||||
rx_tx_addr[3] = (id >> 0) & 0xFF;
|
rx_tx_addr[3] = (id >> 0) & 0xFF;
|
||||||
rx_tx_addr[4] = 0xC1; // for YD717: always uses first data port
|
rx_tx_addr[4] = (rx_tx_addr[2]&0xF0)|(rx_tx_addr[3]&0x0F);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef XMEGA
|
#ifndef XMEGA
|
||||||
@ -985,179 +927,6 @@ static uint32_t random_id(uint16_t adress, uint8_t create_new)
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
/********************/
|
|
||||||
/** SPI routines **/
|
|
||||||
/********************/
|
|
||||||
#ifdef XMEGA
|
|
||||||
#define XNOP() NOP()
|
|
||||||
#else
|
|
||||||
#define XNOP()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void SPI_Write(uint8_t command)
|
|
||||||
{
|
|
||||||
uint8_t n=8;
|
|
||||||
|
|
||||||
SCLK_off;//SCK start low
|
|
||||||
XNOP();
|
|
||||||
SDI_off;
|
|
||||||
XNOP();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if(command&0x80)
|
|
||||||
SDI_on;
|
|
||||||
else
|
|
||||||
SDI_off;
|
|
||||||
XNOP();
|
|
||||||
SCLK_on;
|
|
||||||
XNOP();
|
|
||||||
XNOP();
|
|
||||||
command = command << 1;
|
|
||||||
SCLK_off;
|
|
||||||
XNOP();
|
|
||||||
}
|
|
||||||
while(--n) ;
|
|
||||||
SDI_on;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t SPI_Read(void)
|
|
||||||
{
|
|
||||||
uint8_t result=0,i;
|
|
||||||
for(i=0;i<8;i++)
|
|
||||||
{
|
|
||||||
result=result<<1;
|
|
||||||
if(SDO_1)
|
|
||||||
result |= 0x01;
|
|
||||||
SCLK_on;
|
|
||||||
XNOP();
|
|
||||||
XNOP();
|
|
||||||
NOP();
|
|
||||||
SCLK_off;
|
|
||||||
XNOP();
|
|
||||||
XNOP();
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/************************************/
|
|
||||||
/** Arduino replacement routines **/
|
|
||||||
/************************************/
|
|
||||||
// replacement millis() and micros()
|
|
||||||
// These work polled, no interrupts
|
|
||||||
// micros() MUST be called at least once every 32 milliseconds
|
|
||||||
uint16_t MillisPrecount ;
|
|
||||||
uint16_t lastTimerValue ;
|
|
||||||
uint32_t TotalMicros ;
|
|
||||||
uint32_t TotalMillis ;
|
|
||||||
uint8_t Correction ;
|
|
||||||
|
|
||||||
uint32_t micros()
|
|
||||||
{
|
|
||||||
uint16_t elapsed ;
|
|
||||||
uint8_t millisToAdd ;
|
|
||||||
uint8_t oldSREG = SREG ;
|
|
||||||
cli() ;
|
|
||||||
uint16_t time = TCNT1 ; // Read timer 1
|
|
||||||
SREG = oldSREG ;
|
|
||||||
|
|
||||||
elapsed = time - lastTimerValue ;
|
|
||||||
elapsed += Correction ;
|
|
||||||
Correction = elapsed & 0x01 ;
|
|
||||||
elapsed >>= 1 ;
|
|
||||||
|
|
||||||
uint32_t ltime = TotalMicros ;
|
|
||||||
ltime += elapsed ;
|
|
||||||
cli() ;
|
|
||||||
TotalMicros = ltime ; // Done this way for RPM to work correctly
|
|
||||||
lastTimerValue = time ;
|
|
||||||
SREG = oldSREG ; // Still valid from above
|
|
||||||
|
|
||||||
elapsed += MillisPrecount;
|
|
||||||
millisToAdd = 0 ;
|
|
||||||
|
|
||||||
if ( elapsed > 15999 )
|
|
||||||
{
|
|
||||||
millisToAdd = 16 ;
|
|
||||||
elapsed -= 16000 ;
|
|
||||||
}
|
|
||||||
if ( elapsed > 7999 )
|
|
||||||
{
|
|
||||||
millisToAdd += 8 ;
|
|
||||||
elapsed -= 8000 ;
|
|
||||||
}
|
|
||||||
if ( elapsed > 3999 )
|
|
||||||
{
|
|
||||||
millisToAdd += 4 ;
|
|
||||||
elapsed -= 4000 ;
|
|
||||||
}
|
|
||||||
if ( elapsed > 1999 )
|
|
||||||
{
|
|
||||||
millisToAdd += 2 ;
|
|
||||||
elapsed -= 2000 ;
|
|
||||||
}
|
|
||||||
if ( elapsed > 999 )
|
|
||||||
{
|
|
||||||
millisToAdd += 1 ;
|
|
||||||
elapsed -= 1000 ;
|
|
||||||
}
|
|
||||||
TotalMillis += millisToAdd ;
|
|
||||||
MillisPrecount = elapsed ;
|
|
||||||
return TotalMicros ;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t millis()
|
|
||||||
{
|
|
||||||
micros() ;
|
|
||||||
return TotalMillis ;
|
|
||||||
}
|
|
||||||
|
|
||||||
void delayMilliseconds(unsigned long ms)
|
|
||||||
{
|
|
||||||
uint16_t start = (uint16_t)micros();
|
|
||||||
uint16_t lms = ms ;
|
|
||||||
|
|
||||||
while (lms > 0) {
|
|
||||||
if (((uint16_t)micros() - start) >= 1000) {
|
|
||||||
lms--;
|
|
||||||
start += 1000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Important notes:
|
|
||||||
- Max value is 16000µs
|
|
||||||
- delay is not accurate due to interrupts happening */
|
|
||||||
void delayMicroseconds(unsigned int us)
|
|
||||||
{
|
|
||||||
if (--us == 0)
|
|
||||||
return;
|
|
||||||
us <<= 2; // * 4
|
|
||||||
us -= 2; // - 2
|
|
||||||
#ifdef XMEGA
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"1: sbiw %0,1" "\n\t" // 2 cycles
|
|
||||||
"nop \n"
|
|
||||||
"nop \n"
|
|
||||||
"nop \n"
|
|
||||||
"nop \n"
|
|
||||||
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
|
||||||
);
|
|
||||||
#else
|
|
||||||
__asm__ __volatile__ (
|
|
||||||
"1: sbiw %0,1" "\n\t" // 2 cycles
|
|
||||||
"brne 1b" : "=w" (us) : "0" (us) // 2 cycles
|
|
||||||
);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef XMEGA
|
|
||||||
void init()
|
|
||||||
{
|
|
||||||
// this needs to be called before setup() or some functions won't work there
|
|
||||||
sei();
|
|
||||||
}
|
|
||||||
#endif //XMEGA
|
|
||||||
|
|
||||||
/**************************/
|
/**************************/
|
||||||
/**************************/
|
/**************************/
|
||||||
/** Interrupt routines **/
|
/** Interrupt routines **/
|
||||||
|
@ -221,11 +221,11 @@ void NRF24L01_Reset()
|
|||||||
|
|
||||||
uint8_t NRF24L01_packet_ack()
|
uint8_t NRF24L01_packet_ack()
|
||||||
{
|
{
|
||||||
switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT)))
|
switch (NRF24L01_ReadReg(NRF24L01_07_STATUS) & (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT)))
|
||||||
{
|
{
|
||||||
case BV(NRF24L01_07_TX_DS):
|
case _BV(NRF24L01_07_TX_DS):
|
||||||
return PKT_ACKED;
|
return PKT_ACKED;
|
||||||
case BV(NRF24L01_07_MAX_RT):
|
case _BV(NRF24L01_07_MAX_RT):
|
||||||
return PKT_TIMEOUT;
|
return PKT_TIMEOUT;
|
||||||
}
|
}
|
||||||
return PKT_PENDING;
|
return PKT_PENDING;
|
||||||
@ -322,8 +322,8 @@ void XN297_SetRXAddr(const uint8_t* addr, uint8_t len)
|
|||||||
|
|
||||||
void XN297_Configure(uint8_t flags)
|
void XN297_Configure(uint8_t flags)
|
||||||
{
|
{
|
||||||
xn297_crc = !!(flags & BV(NRF24L01_00_EN_CRC));
|
xn297_crc = !!(flags & _BV(NRF24L01_00_EN_CRC));
|
||||||
flags &= ~(BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
|
flags &= ~(_BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF);
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, flags & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
203
Multiprotocol/Pins.h
Normal file
203
Multiprotocol/Pins.h
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
//*******************
|
||||||
|
//*** Pinouts ***
|
||||||
|
//*******************
|
||||||
|
|
||||||
|
// TX
|
||||||
|
#define SERIAL_TX_pin 1 //PD1
|
||||||
|
#define SERIAL_TX_port PORTD
|
||||||
|
#define SERIAL_TX_ddr DDRD
|
||||||
|
#define SERIAL_TX_output SERIAL_TX_ddr |= _BV(SERIAL_TX_pin)
|
||||||
|
#define SERIAL_TX_on SERIAL_TX_port |= _BV(SERIAL_TX_pin)
|
||||||
|
#define SERIAL_TX_off SERIAL_TX_port &= ~_BV(SERIAL_TX_pin)
|
||||||
|
#ifdef DEBUG_TX
|
||||||
|
#define DEBUG_TX_on SERIAL_TX_ON
|
||||||
|
#define DEBUG_TX_off SERIAL_TX_OFF
|
||||||
|
#define DEBUG_TX_toggle SERIAL_TX_port ^= _BV(SERIAL_TX_pin)
|
||||||
|
#else
|
||||||
|
#define DEBUG_TX_on
|
||||||
|
#define DEBUG_TX_off
|
||||||
|
#define DEBUG_TX_toggle
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Dial
|
||||||
|
#define MODE_DIAL1_pin 2
|
||||||
|
#define MODE_DIAL1_port PORTB
|
||||||
|
#define MODE_DIAL1_ipr PINB
|
||||||
|
#define MODE_DIAL2_pin 3
|
||||||
|
#define MODE_DIAL2_port PORTB
|
||||||
|
#define MODE_DIAL2_ipr PINB
|
||||||
|
#define MODE_DIAL3_pin 4
|
||||||
|
#define MODE_DIAL3_port PORTB
|
||||||
|
#define MODE_DIAL3_ipr PINB
|
||||||
|
#define MODE_DIAL4_pin 0
|
||||||
|
#define MODE_DIAL4_port PORTC
|
||||||
|
#define MODE_DIAL4_ipr PINC
|
||||||
|
|
||||||
|
// PPM
|
||||||
|
#define PPM_pin 3 //D3 = PD3
|
||||||
|
#define PPM_port PORTD
|
||||||
|
|
||||||
|
// SDIO
|
||||||
|
#define SDI_pin 5 //D5 = PD5
|
||||||
|
#define SDI_port PORTD
|
||||||
|
#define SDI_ipr PIND
|
||||||
|
#define SDI_ddr DDRD
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define SDI_on SDI_port.OUTSET = _BV(SDI_pin)
|
||||||
|
#define SDI_off SDI_port.OUTCLR = _BV(SDI_pin)
|
||||||
|
#else
|
||||||
|
#define SDI_on SDI_port |= _BV(SDI_pin)
|
||||||
|
#define SDI_off SDI_port &= ~_BV(SDI_pin)
|
||||||
|
#define SDI_1 (SDI_ipr & _BV(SDI_pin))
|
||||||
|
#define SDI_0 (SDI_ipr & _BV(SDI_pin)) == 0x00
|
||||||
|
#endif
|
||||||
|
#define SDI_input SDI_ddr &= ~_BV(SDI_pin)
|
||||||
|
#define SDI_output SDI_ddr |= _BV(SDI_pin)
|
||||||
|
|
||||||
|
//SDO
|
||||||
|
#define SDO_pin 6 //D6 = PD6
|
||||||
|
#define SDO_port PORTD
|
||||||
|
#define SDO_ipr PIND
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define SDO_1 (SDO_port.IN & _BV(SDO_pin))
|
||||||
|
#define SDO_0 (SDO_port.IN & _BV(SDO_pin)) == 0x00
|
||||||
|
#else
|
||||||
|
#define SDO_1 (SDO_ipr & _BV(SDO_pin))
|
||||||
|
#define SDO_0 (SDO_ipr & _BV(SDO_pin)) == 0x00
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// SCLK
|
||||||
|
#define SCLK_port PORTD
|
||||||
|
#define SCLK_ddr DDRD
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define SCLK_pin 7 //PD7
|
||||||
|
#define SCLK_on SCLK_port.OUTSET = _BV(SCLK_pin)
|
||||||
|
#define SCLK_off SCLK_port.OUTCLR = _BV(SCLK_pin)
|
||||||
|
#else
|
||||||
|
#define SCLK_pin 4 //D4 = PD4
|
||||||
|
#define SCLK_output SCLK_ddr |= _BV(SCLK_pin)
|
||||||
|
#define SCLK_on SCLK_port |= _BV(SCLK_pin)
|
||||||
|
#define SCLK_off SCLK_port &= ~_BV(SCLK_pin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// A7105
|
||||||
|
#define A7105_CSN_pin 2 //D2 = PD2
|
||||||
|
#define A7105_CSN_port PORTD
|
||||||
|
#define A7105_CSN_ddr DDRD
|
||||||
|
#define A7105_CSN_output A7105_CSN_ddr |= _BV(A7105_CSN_pin)
|
||||||
|
#define A7105_CSN_on A7105_CSN_port |= _BV(A7105_CSN_pin)
|
||||||
|
#define A7105_CSN_off A7105_CSN_port &= ~_BV(A7105_CSN_pin)
|
||||||
|
|
||||||
|
// CC2500
|
||||||
|
#define CC25_CSN_pin 7 //D7 = PD7
|
||||||
|
#define CC25_CSN_port PORTD
|
||||||
|
#define CC25_CSN_ddr DDRD
|
||||||
|
#define CC25_CSN_output CC25_CSN_ddr |= _BV(CC25_CSN_pin)
|
||||||
|
#define CC25_CSN_on CC25_CSN_port |= _BV(CC25_CSN_pin)
|
||||||
|
#define CC25_CSN_off CC25_CSN_port &= ~_BV(CC25_CSN_pin)
|
||||||
|
|
||||||
|
// NRF24L01
|
||||||
|
#define NRF_CSN_pin 0 //D8 = PB0
|
||||||
|
#define NRF_CSN_port PORTB
|
||||||
|
#define NRF_CSN_ddr DDRB
|
||||||
|
#define NRF_CSN_output NRF_CSN_ddr |= _BV(NRF_CSN_pin)
|
||||||
|
#define NRF_CSN_on NRF_CSN_port |= _BV(NRF_CSN_pin)
|
||||||
|
#define NRF_CSN_off NRF_CSN_port &= ~_BV(NRF_CSN_pin)
|
||||||
|
#define NRF_CE_on
|
||||||
|
#define NRF_CE_off
|
||||||
|
|
||||||
|
// CYRF6936
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define CYRF_CSN_pin 4 //PD4
|
||||||
|
#define CYRF_CSN_port PORTD
|
||||||
|
#define CYRF_CSN_ddr DDRD
|
||||||
|
#define CYRF_CSN_on CYRF_CSN_port.OUTSET = _BV(CYRF_CSN_pin)
|
||||||
|
#define CYRF_CSN_off CYRF_CSN_port.OUTCLR = _BV(CYRF_CSN_pin)
|
||||||
|
#else
|
||||||
|
#define CYRF_CSN_pin 1 //D9 = PB1
|
||||||
|
#define CYRF_CSN_port PORTB
|
||||||
|
#define CYRF_CSN_ddr DDRB
|
||||||
|
#define CYRF_CSN_output CYRF_CSN_ddr |= _BV(CYRF_CSN_pin)
|
||||||
|
#define CYRF_CSN_on CYRF_CSN_port |= _BV(CYRF_CSN_pin)
|
||||||
|
#define CYRF_CSN_off CYRF_CSN_port &= ~_BV(CYRF_CSN_pin)
|
||||||
|
|
||||||
|
#define CYRF_RST_pin 5 //A5 = PC5
|
||||||
|
#define CYRF_RST_port PORTC
|
||||||
|
#define CYRF_RST_ddr DDRC
|
||||||
|
#define CYRF_RST_output CYRF_RST_ddr |= _BV(CYRF_RST_pin)
|
||||||
|
#define CYRF_RST_HI CYRF_RST_port |= _BV(CYRF_RST_pin)
|
||||||
|
#define CYRF_RST_LO CYRF_RST_port &= ~_BV(CYRF_RST_pin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//RF Switch
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define PE1_on
|
||||||
|
#define PE1_off
|
||||||
|
#define PE2_on
|
||||||
|
#define PE2_off
|
||||||
|
#else
|
||||||
|
#define PE1_pin 1 //A1 = PC1
|
||||||
|
#define PE1_port PORTC
|
||||||
|
#define PE1_ddr DDRC
|
||||||
|
#define PE1_output PE1_ddr |= _BV(PE1_pin)
|
||||||
|
#define PE1_on PE1_port |= _BV(PE1_pin)
|
||||||
|
#define PE1_off PE1_port &= ~_BV(PE1_pin)
|
||||||
|
|
||||||
|
#define PE2_pin 2 //A2 = PC2
|
||||||
|
#define PE2_port PORTC
|
||||||
|
#define PE2_ddr DDRC
|
||||||
|
#define PE2_output PE2_ddr |= _BV(PE2_pin)
|
||||||
|
#define PE2_on PE2_port |= _BV(PE2_pin)
|
||||||
|
#define PE2_off PE2_port &= ~_BV(PE2_pin)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// LED
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define LED_pin 1 //PD1
|
||||||
|
#define LED_port PORTD
|
||||||
|
#define LED_ddr DDRD
|
||||||
|
#define LED_on LED_port.OUTCLR = _BV(LED_pin)
|
||||||
|
#define LED_off LED_port.OUTSET = _BV(LED_pin)
|
||||||
|
#define LED_toggle LED_port.OUTTGL = _BV(LED_pin)
|
||||||
|
#define LED_output LED_port.DIRSET = _BV(LED_pin)
|
||||||
|
#define IS_LED_on (LED_port.OUT & _BV(LED_pin))
|
||||||
|
#else
|
||||||
|
#define LED_pin 5 //D13 = PB5
|
||||||
|
#define LED_port PORTB
|
||||||
|
#define LED_ddr DDRB
|
||||||
|
#define LED_on LED_port |= _BV(LED_pin)
|
||||||
|
#define LED_off LED_port &= ~_BV(LED_pin)
|
||||||
|
#define LED_toggle LED_port ^= _BV(LED_pin)
|
||||||
|
#define LED_output LED_ddr |= _BV(LED_pin)
|
||||||
|
#define IS_LED_on (LED_port & _BV(LED_pin))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//BIND
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define BIND_pin 2 //PD2
|
||||||
|
#define BIND_port PORTD
|
||||||
|
#define IS_BIND_BUTTON_on ( (BIND_port.IN & _BV(BIND_pin)) == 0x00 )
|
||||||
|
#else
|
||||||
|
#define BIND_pin 5 //D13 = PB5
|
||||||
|
#define BIND_port PORTB
|
||||||
|
#define BIND_ipr PINB
|
||||||
|
#define BIND_ddr DDRB
|
||||||
|
#define BIND_SET_INPUT BIND_ddr &= ~_BV(BIND_pin)
|
||||||
|
#define BIND_SET_OUTPUT BIND_ddr |= _BV(BIND_pin)
|
||||||
|
#define BIND_SET_PULLUP BIND_port |= _BV(BIND_pin)
|
||||||
|
#define IS_BIND_BUTTON_on ( (BIND_ipr & _BV(BIND_pin)) == 0x00 )
|
||||||
|
#endif
|
@ -94,7 +94,7 @@ uint16_t SHENQI_callback()
|
|||||||
SHENQI_send_packet();
|
SHENQI_send_packet();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_RX_DR))
|
if( NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_RX_DR))
|
||||||
{
|
{
|
||||||
if(LT8900_ReadPayload(packet, 3))
|
if(LT8900_ReadPayload(packet, 3))
|
||||||
{
|
{
|
||||||
|
@ -34,7 +34,7 @@ enum {
|
|||||||
static void __attribute__((unused)) SLT_init()
|
static void __attribute__((unused)) SLT_init()
|
||||||
{
|
{
|
||||||
NRF24L01_Initialize();
|
NRF24L01_Initialize();
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO)); // 2-bytes CRC, radio off
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO)); // 2-bytes CRC, radio off
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x01); // Enable data pipe 0
|
||||||
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x02); // 4-byte RX/TX address
|
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x02); // 4-byte RX/TX address
|
||||||
@ -93,7 +93,7 @@ static void __attribute__((unused)) SLT_set_tx_id(void)
|
|||||||
static void __attribute__((unused)) SLT_wait_radio()
|
static void __attribute__((unused)) SLT_wait_radio()
|
||||||
{
|
{
|
||||||
if (packet_sent)
|
if (packet_sent)
|
||||||
while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & BV(NRF24L01_07_TX_DS))) ;
|
while (!(NRF24L01_ReadReg(NRF24L01_07_STATUS) & _BV(NRF24L01_07_TX_DS))) ;
|
||||||
packet_sent = 0;
|
packet_sent = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ static void __attribute__((unused)) SLT_send_data(uint8_t *data, uint8_t len)
|
|||||||
{
|
{
|
||||||
SLT_wait_radio();
|
SLT_wait_radio();
|
||||||
NRF24L01_FlushTx();
|
NRF24L01_FlushTx();
|
||||||
NRF24L01_WriteReg(NRF24L01_07_STATUS, BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_RX_DR) | BV(NRF24L01_07_MAX_RT));
|
NRF24L01_WriteReg(NRF24L01_07_STATUS, _BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_RX_DR) | _BV(NRF24L01_07_MAX_RT));
|
||||||
NRF24L01_WritePayload(data, len);
|
NRF24L01_WritePayload(data, len);
|
||||||
//NRF24L01_PulseCE();
|
//NRF24L01_PulseCE();
|
||||||
packet_sent = 1;
|
packet_sent = 1;
|
||||||
|
84
Multiprotocol/SPI.ino
Normal file
84
Multiprotocol/SPI.ino
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/********************/
|
||||||
|
/** SPI routines **/
|
||||||
|
/********************/
|
||||||
|
#ifdef XMEGA
|
||||||
|
#define XNOP() NOP()
|
||||||
|
#else
|
||||||
|
#define XNOP()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void SPI_Write(uint8_t command)
|
||||||
|
{
|
||||||
|
uint8_t n=8;
|
||||||
|
|
||||||
|
SCLK_off;//SCK start low
|
||||||
|
XNOP();
|
||||||
|
SDI_off;
|
||||||
|
XNOP();
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if(command&0x80)
|
||||||
|
SDI_on;
|
||||||
|
else
|
||||||
|
SDI_off;
|
||||||
|
XNOP();
|
||||||
|
SCLK_on;
|
||||||
|
XNOP();
|
||||||
|
XNOP();
|
||||||
|
command = command << 1;
|
||||||
|
SCLK_off;
|
||||||
|
XNOP();
|
||||||
|
}
|
||||||
|
while(--n) ;
|
||||||
|
SDI_on;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t SPI_Read(void)
|
||||||
|
{
|
||||||
|
uint8_t result=0,i;
|
||||||
|
for(i=0;i<8;i++)
|
||||||
|
{
|
||||||
|
result=result<<1;
|
||||||
|
if(SDO_1)
|
||||||
|
result |= 0x01;
|
||||||
|
SCLK_on;
|
||||||
|
XNOP();
|
||||||
|
XNOP();
|
||||||
|
NOP();
|
||||||
|
SCLK_off;
|
||||||
|
XNOP();
|
||||||
|
XNOP();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t SPI_SDIO_Read(void)
|
||||||
|
{
|
||||||
|
uint8_t result=0;
|
||||||
|
SDI_input;
|
||||||
|
for(uint8_t i=0;i<8;i++)
|
||||||
|
{
|
||||||
|
result=result<<1;
|
||||||
|
if(SDI_1) ///if SDIO =1
|
||||||
|
result |= 0x01;
|
||||||
|
SCLK_on;
|
||||||
|
NOP();
|
||||||
|
SCLK_off;
|
||||||
|
}
|
||||||
|
SDI_output;
|
||||||
|
return result;
|
||||||
|
}
|
@ -174,7 +174,7 @@ static void __attribute__((unused)) symax_init()
|
|||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
//
|
//
|
||||||
NRF24L01_ReadReg(NRF24L01_07_STATUS);
|
NRF24L01_ReadReg(NRF24L01_07_STATUS);
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x3F); // Enable all data pipes (even though not used?)
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x3F); // Enable all data pipes (even though not used?)
|
||||||
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
||||||
|
@ -1,8 +1,20 @@
|
|||||||
|
/*
|
||||||
|
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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
//**************************
|
//**************************
|
||||||
// Telemetry serial code *
|
// Telemetry serial code *
|
||||||
// By Midelic on RCGroups *
|
|
||||||
//**************************
|
//**************************
|
||||||
|
|
||||||
#if defined TELEMETRY
|
#if defined TELEMETRY
|
||||||
|
|
||||||
#if defined SPORT_TELEMETRY
|
#if defined SPORT_TELEMETRY
|
||||||
@ -812,4 +824,3 @@ ISR(TIMER0_OVF_vect)
|
|||||||
#endif // BASH_SERIAL
|
#endif // BASH_SERIAL
|
||||||
|
|
||||||
#endif // TELEMETRY
|
#endif // TELEMETRY
|
||||||
|
|
||||||
|
@ -80,7 +80,7 @@ static void __attribute__((unused)) v202_init()
|
|||||||
NRF24L01_Initialize();
|
NRF24L01_Initialize();
|
||||||
|
|
||||||
// 2-bytes CRC, radio off
|
// 2-bytes CRC, radio off
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO));
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO));
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // No Auto Acknoledgement
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x3F); // Enable all data pipes
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x3F); // Enable all data pipes
|
||||||
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
||||||
@ -116,7 +116,7 @@ static void __attribute__((unused)) V202_init2()
|
|||||||
|
|
||||||
// Turn radio power on
|
// Turn radio power on
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
//Done by TX_EN??? => NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_CRCO) | BV(NRF24L01_00_PWR_UP));
|
//Done by TX_EN??? => NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_CRCO) | _BV(NRF24L01_00_PWR_UP));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __attribute__((unused)) V2X2_set_tx_id(void)
|
static void __attribute__((unused)) V2X2_set_tx_id(void)
|
||||||
|
@ -101,7 +101,7 @@ static void __attribute__((unused)) yd717_send_packet(uint8_t bind)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// clear packet status bits and TX FIFO
|
// clear packet status bits and TX FIFO
|
||||||
NRF24L01_WriteReg(NRF24L01_07_STATUS, (BV(NRF24L01_07_TX_DS) | BV(NRF24L01_07_MAX_RT)));
|
NRF24L01_WriteReg(NRF24L01_07_STATUS, (_BV(NRF24L01_07_TX_DS) | _BV(NRF24L01_07_MAX_RT)));
|
||||||
NRF24L01_FlushTx();
|
NRF24L01_FlushTx();
|
||||||
|
|
||||||
if( sub_protocol == YD717 )
|
if( sub_protocol == YD717 )
|
||||||
@ -124,7 +124,7 @@ static void __attribute__((unused)) yd717_init()
|
|||||||
|
|
||||||
// CRC, radio on
|
// CRC, radio on
|
||||||
NRF24L01_SetTxRxMode(TX_EN);
|
NRF24L01_SetTxRxMode(TX_EN);
|
||||||
NRF24L01_WriteReg(NRF24L01_00_CONFIG, BV(NRF24L01_00_EN_CRC) | BV(NRF24L01_00_PWR_UP));
|
NRF24L01_WriteReg(NRF24L01_00_CONFIG, _BV(NRF24L01_00_EN_CRC) | _BV(NRF24L01_00_PWR_UP));
|
||||||
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // Disable Acknoledgement on all data pipes
|
NRF24L01_WriteReg(NRF24L01_01_EN_AA, 0x00); // Disable Acknoledgement on all data pipes
|
||||||
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x00); // Disable all data pipes
|
NRF24L01_WriteReg(NRF24L01_02_EN_RXADDR, 0x00); // Disable all data pipes
|
||||||
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
NRF24L01_WriteReg(NRF24L01_03_SETUP_AW, 0x03); // 5-byte RX/TX address
|
||||||
|
Loading…
x
Reference in New Issue
Block a user