14 changed files with 0 additions and 1538 deletions
-
41remote/lib/readme.txt
-
14remote/platformio.ini
-
180remote/src/cc2500.cpp
-
85remote/src/cc2500.h
-
73remote/src/config.h
-
306remote/src/frskyd.cpp
-
81remote/src/frskyd.h
-
150remote/src/iface_cc2500.h
-
106remote/src/io_data.cpp
-
25remote/src/io_data.h
-
98remote/src/main.cpp
-
264remote/src/pins.h
-
86remote/src/spi.cpp
-
29remote/src/spi.h
@ -1,41 +0,0 @@ |
|||
|
|||
This directory is intended for the project specific (private) libraries. |
|||
PlatformIO will compile them to static libraries and link to executable file. |
|||
|
|||
The source code of each library should be placed in separate directory, like |
|||
"lib/private_lib/[here are source files]". |
|||
|
|||
For example, see how can be organized `Foo` and `Bar` libraries: |
|||
|
|||
|--lib |
|||
| | |
|||
| |--Bar |
|||
| | |--docs |
|||
| | |--examples |
|||
| | |--src |
|||
| | |- Bar.c |
|||
| | |- Bar.h |
|||
| | |- library.json (optional, custom build options, etc) http://docs.platformio.org/page/librarymanager/config.html |
|||
| | |
|||
| |--Foo |
|||
| | |- Foo.c |
|||
| | |- Foo.h |
|||
| | |
|||
| |- readme.txt --> THIS FILE |
|||
| |
|||
|- platformio.ini |
|||
|--src |
|||
|- main.c |
|||
|
|||
Then in `src/main.c` you should use: |
|||
|
|||
#include <Foo.h> |
|||
#include <Bar.h> |
|||
|
|||
// rest H/C/CPP code |
|||
|
|||
PlatformIO will find your libraries automatically, configure preprocessor's |
|||
include paths and build them. |
|||
|
|||
More information about PlatformIO Library Dependency Finder |
|||
- http://docs.platformio.org/page/librarymanager/ldf.html |
@ -1,14 +0,0 @@ |
|||
; PlatformIO Project Configuration File |
|||
; |
|||
; Build options: build flags, source filter |
|||
; Upload options: custom upload port, speed and extra flags |
|||
; Library options: dependencies, extra library storages |
|||
; Advanced options: extra scripting |
|||
; |
|||
; Please visit documentation for the other options and examples |
|||
; http://docs.platformio.org/page/projectconf.html |
|||
|
|||
[env:leonardo] |
|||
platform = atmelavr |
|||
board = leonardo |
|||
framework = arduino |
@ -1,180 +0,0 @@ |
|||
#include "cc2500.h"
|
|||
#include "config.h"
|
|||
#include "pins.h"
|
|||
#include "Arduino.h"
|
|||
|
|||
CC2500::CC2500(SPI *spi) |
|||
{ |
|||
this->spi = spi; |
|||
this->bind_done = false; |
|||
|
|||
CC2500_CS_OUTPUT; |
|||
CC2500_CS_ON; |
|||
|
|||
LOW_NOISE_AMP_OUTPUT; |
|||
LOW_NOISE_AMP_OFF; |
|||
} |
|||
|
|||
void CC2500::write_register(uint8_t address, uint8_t data) |
|||
{ |
|||
// select chip
|
|||
CC2500_CS_OFF; |
|||
|
|||
// first address then data
|
|||
spi->write(address); |
|||
NOP; |
|||
spi->write(data); |
|||
|
|||
// deselect chip
|
|||
CC2500_CS_ON; |
|||
} |
|||
void CC2500::write_register_multi(uint8_t address, const uint8_t data[], uint8_t length) |
|||
{ |
|||
CC2500_CS_OFF; |
|||
|
|||
spi->write(CC2500_WRITE_BURST | address); |
|||
|
|||
for (uint8_t i = 0; i < length; i++) { |
|||
spi->write(data[i]); |
|||
} |
|||
|
|||
CC2500_CS_ON; |
|||
} |
|||
|
|||
void CC2500::write_data(uint8_t *dpbuffer, uint8_t len) |
|||
{ |
|||
this->strobe(CC2500_SFTX); |
|||
this->write_register_multi(CC2500_3F_TXFIFO, dpbuffer, len); |
|||
this->strobe(CC2500_STX); |
|||
} |
|||
|
|||
|
|||
void CC2500::read_register_multi(uint8_t address, uint8_t data[], uint8_t length) |
|||
{ |
|||
// select chip
|
|||
CC2500_CS_OFF; |
|||
|
|||
spi->write(CC2500_READ_BURST | address); |
|||
|
|||
for (uint8_t i = 0; i < length; i++) { |
|||
data[i] = spi->read(); |
|||
} |
|||
|
|||
// deselect chip
|
|||
CC2500_CS_ON; |
|||
} |
|||
|
|||
uint8_t CC2500::read_register(uint8_t address) |
|||
{ |
|||
uint8_t result; |
|||
|
|||
// select chip
|
|||
CC2500_CS_OFF; |
|||
|
|||
spi->write(CC2500_READ_SINGLE | address); |
|||
result = spi->read(); |
|||
|
|||
// deselect chip
|
|||
CC2500_CS_ON; |
|||
|
|||
return (result); |
|||
} |
|||
|
|||
void CC2500::read_data(uint8_t *dpbuffer, uint8_t len) |
|||
{ |
|||
this->read_register_multi(CC2500_3F_RXFIFO, dpbuffer, len); |
|||
} |
|||
|
|||
void CC2500::strobe(uint8_t state) |
|||
{ |
|||
CC2500_CS_OFF; |
|||
spi->write(state); |
|||
CC2500_CS_ON; |
|||
} |
|||
|
|||
void CC2500::set_wireless_mode(enum wireless_mode mode) |
|||
{ |
|||
switch (mode) { |
|||
case wireless_tx: |
|||
this->write_register(CC2500_00_IOCFG2, 0x2F); |
|||
this->write_register(CC2500_02_IOCFG0, 0x2F | 0x40); |
|||
break; |
|||
|
|||
case wireless_rx: |
|||
this->write_register(CC2500_02_IOCFG0, 0x2F); |
|||
this->write_register(CC2500_00_IOCFG2, 0x2F | 0x40); |
|||
break; |
|||
|
|||
case wireless_off: |
|||
this->write_register(CC2500_02_IOCFG0, 0x2F); |
|||
this->write_register(CC2500_00_IOCFG2, 0x2F); |
|||
break; |
|||
} |
|||
} |
|||
|
|||
void CC2500::set_power(void) |
|||
{ |
|||
uint8_t power = CC2500_BIND_POWER; |
|||
|
|||
if (this->bind_done) { |
|||
#ifdef CC2500_ENABLE_LOW_POWER
|
|||
power = IS_POWER_FLAG_on ? CC2500_HIGH_POWER : CC2500_LOW_POWER; |
|||
#else
|
|||
power = CC2500_HIGH_POWER; |
|||
#endif
|
|||
} |
|||
|
|||
if (IS_RANGE_FLAG_on) { |
|||
power = CC2500_RANGE_POWER; |
|||
} |
|||
|
|||
if (this->prev_power != power) { |
|||
this->write_register(CC2500_3E_PATABLE, power); |
|||
this->prev_power = power; |
|||
} |
|||
} |
|||
uint8_t CC2500::reset() |
|||
{ |
|||
this->strobe(CC2500_SRES); |
|||
delay(1); //ms
|
|||
this->set_wireless_mode(wireless_off); |
|||
return this->read_register(CC2500_0E_FREQ1) == 0xC4;//check if reset
|
|||
} |
|||
|
|||
|
|||
void CC2500::resetChip(void) |
|||
{ |
|||
// Toggle chip select signal
|
|||
CC2500_CS_ON; |
|||
delayMicroseconds(30); |
|||
|
|||
CC2500_CS_OFF; |
|||
delayMicroseconds(30); |
|||
|
|||
CC2500_CS_ON; |
|||
delayMicroseconds(45); |
|||
|
|||
this->strobe(CC2500_SRES); |
|||
_delay_ms(100); |
|||
|
|||
this->prev_power = 0xfd; |
|||
} |
|||
|
|||
void CC2500::set_power_value(uint8_t power) |
|||
{ |
|||
const unsigned char patable[8] = { |
|||
0xC5, // -12dbm
|
|||
0x97, // -10dbm
|
|||
0x6E, // -8dbm
|
|||
0x7F, // -6dbm
|
|||
0xA9, // -4dbm
|
|||
0xBB, // -2dbm
|
|||
0xFE, // 0dbm
|
|||
0xFF // 1.5dbm
|
|||
}; |
|||
|
|||
if (power > 7) |
|||
power = 7; |
|||
|
|||
this->write_register(CC2500_3E_PATABLE, patable[power]); |
|||
} |
@ -1,85 +0,0 @@ |
|||
/* |
|||
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/>. |
|||
*/ |
|||
|
|||
#ifndef CC2500_H |
|||
#define CC2500_H |
|||
#include "Arduino.h" |
|||
#include "spi.h" |
|||
#include "iface_cc2500.h" |
|||
|
|||
|
|||
class CC2500 |
|||
{ |
|||
private: |
|||
SPI *spi; |
|||
bool bind_done; |
|||
uint8_t prev_power; |
|||
public: |
|||
//TODO IS_RANGE_FLAG_on |
|||
#define IS_RANGE_FLAG_on false |
|||
enum wireless_mode { |
|||
wireless_off, |
|||
wireless_tx, |
|||
wireless_rx, |
|||
}; |
|||
// CC2500 power output from the chip itself |
|||
// The numbers do not take into account any outside amplifier |
|||
enum CC2500_POWER { |
|||
CC2500_POWER_0 = 0x00, // -55dbm or less |
|||
CC2500_POWER_1 = 0x50, // -30dbm |
|||
CC2500_POWER_2 = 0x44, // -28dbm |
|||
CC2500_POWER_3 = 0xC0, // -26dbm |
|||
CC2500_POWER_4 = 0x84, // -24dbm |
|||
CC2500_POWER_5 = 0x81, // -22dbm |
|||
CC2500_POWER_6 = 0x46, // -20dbm |
|||
CC2500_POWER_7 = 0x93, // -18dbm |
|||
CC2500_POWER_8 = 0x55, // -16dbm |
|||
CC2500_POWER_9 = 0x8D, // -14dbm |
|||
CC2500_POWER_10 = 0xC6, // -12dbm |
|||
CC2500_POWER_11 = 0x97, // -10dbm |
|||
CC2500_POWER_12 = 0x6E, // -8dbm |
|||
CC2500_POWER_13 = 0x7F, // -6dbm |
|||
CC2500_POWER_14 = 0xA9, // -4dbm |
|||
CC2500_POWER_15 = 0xBB, // -2dbm |
|||
CC2500_POWER_16 = 0xFE, // 0dbm |
|||
CC2500_POWER_17 = 0xFF, // +1dbm |
|||
|
|||
CC2500_HIGH_POWER = CC2500_POWER_17, |
|||
CC2500_LOW_POWER = CC2500_POWER_13, |
|||
CC2500_RANGE_POWER = CC2500_POWER_1, |
|||
CC2500_BIND_POWER = CC2500_POWER_1, |
|||
}; |
|||
|
|||
|
|||
CC2500(SPI *spi); |
|||
void write_register(uint8_t address, uint8_t data); |
|||
void write_register_multi(uint8_t address, const uint8_t data[], uint8_t length); |
|||
void write_data(uint8_t *dpbuffer, uint8_t len); |
|||
|
|||
void read_register_multi(uint8_t address, uint8_t data[], uint8_t length); |
|||
uint8_t read_register(uint8_t address); |
|||
void read_data(uint8_t *dpbuffer, uint8_t len); |
|||
|
|||
void strobe(uint8_t state); |
|||
|
|||
void set_wireless_mode(enum wireless_mode mode); |
|||
void set_power(void); |
|||
|
|||
uint8_t reset(void); |
|||
void set_power_value(uint8_t power); |
|||
void resetChip(void); |
|||
}; |
|||
|
|||
#endif /* CC2500_H */ |
@ -1,73 +0,0 @@ |
|||
#ifndef CONFIG_H |
|||
#define CONFIG_H |
|||
|
|||
const uint8_t FRSKYD_cc2500_conf[] = { |
|||
/*02_IOCFG0*/ 0x06, |
|||
/*00_IOCFG2*/ 0x06, |
|||
/*17_MCSM1*/ 0x0c, |
|||
/*18_MCSM0*/ 0x18, |
|||
/*06_PKTLEN*/ 0x19, |
|||
/*07_PKTCTRL1*/ 0x04, |
|||
/*08_PKTCTRL0*/ 0x05, |
|||
/*3E_PATABLE*/ 0xff, |
|||
/*0B_FSCTRL1*/ 0x08, |
|||
/*0C_FSCTRL0*/ 0x00, |
|||
/*0D_FREQ2*/ 0x5c, |
|||
/*0E_FREQ1*/ 0x76, |
|||
/*0F_FREQ0*/ 0x27, |
|||
/*10_MDMCFG4*/ 0xAA, |
|||
/*11_MDMCFG3*/ 0x39, |
|||
/*12_MDMCFG2*/ 0x11, |
|||
/*13_MDMCFG1*/ 0x23, |
|||
/*14_MDMCFG0*/ 0x7a, |
|||
/*15_DEVIATN*/ 0x42 |
|||
}; |
|||
|
|||
const uint8_t FRSKY_common_end_cc2500_conf[][2] = { |
|||
{ CC2500_19_FOCCFG, 0x16 }, |
|||
{ CC2500_1A_BSCFG, 0x6c }, |
|||
{ CC2500_1B_AGCCTRL2, 0x43 }, |
|||
{ CC2500_1C_AGCCTRL1, 0x40 }, |
|||
{ CC2500_1D_AGCCTRL0, 0x91 }, |
|||
{ CC2500_21_FREND1, 0x56 }, |
|||
{ CC2500_22_FREND0, 0x10 }, |
|||
{ CC2500_23_FSCAL3, 0xa9 }, |
|||
{ CC2500_24_FSCAL2, 0x0A }, |
|||
{ CC2500_25_FSCAL1, 0x00 }, |
|||
{ CC2500_26_FSCAL0, 0x11 }, |
|||
{ CC2500_29_FSTEST, 0x59 }, |
|||
{ CC2500_2C_TEST2, 0x88 }, |
|||
{ CC2500_2D_TEST1, 0x31 }, |
|||
{ CC2500_2E_TEST0, 0x0B }, |
|||
{ CC2500_03_FIFOTHR, 0x07 }, |
|||
{ CC2500_09_ADDR, 0x00 } |
|||
}; |
|||
|
|||
const uint8_t FRSKY_common_startreg_cc2500_conf[] = { |
|||
CC2500_02_IOCFG0, |
|||
CC2500_00_IOCFG2, |
|||
CC2500_17_MCSM1, |
|||
CC2500_18_MCSM0, |
|||
CC2500_06_PKTLEN, |
|||
CC2500_07_PKTCTRL1, |
|||
CC2500_08_PKTCTRL0, |
|||
CC2500_3E_PATABLE, |
|||
CC2500_0B_FSCTRL1, |
|||
CC2500_0C_FSCTRL0, // replaced by option value |
|||
CC2500_0D_FREQ2, |
|||
CC2500_0E_FREQ1, |
|||
CC2500_0F_FREQ0, |
|||
CC2500_10_MDMCFG4, |
|||
CC2500_11_MDMCFG3, |
|||
CC2500_12_MDMCFG2, |
|||
CC2500_13_MDMCFG1, |
|||
CC2500_14_MDMCFG0, |
|||
CC2500_15_DEVIATN |
|||
}; |
|||
//AETR |
|||
#define AILERON 0 |
|||
#define ELEVATOR 1 |
|||
#define THROTTLE 2 |
|||
#define RUDDER 3 |
|||
|
|||
#endif |
@ -1,306 +0,0 @@ |
|||
/*
|
|||
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/>.
|
|||
*/ |
|||
|
|||
//#include "iface_cc2500.h"
|
|||
#include "frskyd.h"
|
|||
#include "config.h"
|
|||
#include "Arduino.h"
|
|||
|
|||
|
|||
Frsky_d::Frsky_d(CC2500 *cc2500) |
|||
{ |
|||
this->calibration = 0x89; |
|||
this->state = FRSKY_BIND; |
|||
this->cc2500 = cc2500; |
|||
this->packet_count = 0; |
|||
|
|||
// TODO real random randomSeed(analogRead(0));
|
|||
randomSeed(42); |
|||
|
|||
this->MProtocol_id_master = random(10); |
|||
this->MProtocol_id = this->MProtocol_id_master; |
|||
|
|||
this->init_channel(); |
|||
this->init_failsafe(); |
|||
|
|||
Serial.print(" multiprotocl id : "); |
|||
Serial.print(this->MProtocol_id); |
|||
Serial.print("\n"); |
|||
} |
|||
void Frsky_d::init(bool bind) |
|||
{ |
|||
this->init_cc2500(FRSKYD_cc2500_conf); |
|||
|
|||
cc2500->write_register(CC2500_09_ADDR, bind ? 0x03 : rx_tx_addr[3]); |
|||
cc2500->write_register(CC2500_07_PKTCTRL1, 0x05); |
|||
cc2500->strobe(CC2500_SIDLE); // Go to idle...
|
|||
//
|
|||
cc2500->write_register(CC2500_0A_CHANNR, 0x00); |
|||
cc2500->write_register(CC2500_23_FSCAL3, 0x89); |
|||
cc2500->strobe(CC2500_SFRX); |
|||
//#######END INIT########
|
|||
} |
|||
void Frsky_d::init_cc2500(const uint8_t *ptr) |
|||
{ |
|||
for (uint8_t i = 0; i < 19; i++) { |
|||
uint8_t reg = FRSKY_common_startreg_cc2500_conf[i]; |
|||
uint8_t val = ptr[i]; |
|||
|
|||
if (reg == CC2500_0C_FSCTRL0) |
|||
val = option; |
|||
|
|||
cc2500->write_register(reg, val); |
|||
} |
|||
|
|||
prev_option = option ; // Save option to monitor FSCTRL0 change
|
|||
|
|||
for (uint8_t i = 0; i < 17; i++) { |
|||
uint8_t reg = FRSKY_common_end_cc2500_conf[i][0]; |
|||
uint8_t val = FRSKY_common_end_cc2500_conf[i][1]; |
|||
cc2500->write_register(reg, val); |
|||
} |
|||
|
|||
cc2500->set_wireless_mode(CC2500::wireless_tx); |
|||
cc2500->set_power(); |
|||
cc2500->strobe(CC2500_SIDLE); // Go to idle...
|
|||
} |
|||
|
|||
void Frsky_d::build_bind_packet(void) |
|||
{ |
|||
//11 03 01 d7 2d 00 00 1e 3c 5b 78 00 00 00 00 00 00 01
|
|||
//11 03 01 19 3e 00 02 8e 2f bb 5c 00 00 00 00 00 00 01
|
|||
packet[0] = 0x11; |
|||
packet[1] = 0x03; |
|||
packet[2] = 0x01; |
|||
packet[3] = rx_tx_addr[3]; |
|||
packet[4] = rx_tx_addr[2]; |
|||
uint16_t idx = ((state - FRSKY_BIND) % 10) * 5; |
|||
packet[5] = idx; |
|||
packet[6] = hopping_frequency[idx++]; |
|||
packet[7] = hopping_frequency[idx++]; |
|||
packet[8] = hopping_frequency[idx++]; |
|||
packet[9] = hopping_frequency[idx++]; |
|||
packet[10] = hopping_frequency[idx++]; |
|||
packet[11] = 0x00; |
|||
packet[12] = 0x00; |
|||
packet[13] = 0x00; |
|||
packet[14] = 0x00; |
|||
packet[15] = 0x00; |
|||
packet[16] = 0x00; |
|||
packet[17] = 0x01; |
|||
} |
|||
|
|||
void Frsky_d::frsky2way_data_frame() |
|||
{ |
|||
//pachet[4] is telemetry user frame counter(hub)
|
|||
//11 d7 2d 22 00 01 c9 c9 ca ca 88 88 ca ca c9 ca 88 88
|
|||
//11 57 12 00 00 01 f2 f2 f2 f2 06 06 ca ca ca ca 18 18
|
|||
packet[0] = 0x11; //Length
|
|||
packet[1] = rx_tx_addr[3]; |
|||
packet[2] = rx_tx_addr[2]; |
|||
packet[3] = counter;//
|
|||
#if defined TELEMETRY
|
|||
packet[4] = telemetry_counter; |
|||
#else
|
|||
packet[4] = 0x00; |
|||
#endif
|
|||
|
|||
packet[5] = 0x01; |
|||
//
|
|||
packet[10] = 0; |
|||
packet[11] = 0; |
|||
packet[16] = 0; |
|||
packet[17] = 0; |
|||
|
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
uint16_t value; |
|||
value = convert_channel_frsky(i); |
|||
|
|||
if (i < 4) { |
|||
packet[6 + i] = value & 0xff; |
|||
packet[10 + (i >> 1)] |= ((value >> 8) & 0x0f) << (4 * (i & 0x01)); |
|||
} else { |
|||
packet[8 + i] = value & 0xff; |
|||
packet[16 + ((i - 4) >> 1)] |= ((value >> 8) & 0x0f) << (4 * ((i - 4) & 0x01)); |
|||
} |
|||
} |
|||
} |
|||
|
|||
uint16_t Frsky_d::init_frsky_2way(void) |
|||
{ |
|||
Serial.print("init hop"); |
|||
init_hop(); |
|||
packet_count = 0; |
|||
#if defined TELEMETRY
|
|||
init_frskyd_link_telemetry(); |
|||
#endif
|
|||
|
|||
if (IS_BIND_IN_PROGRESS) { |
|||
init(true); |
|||
state = FRSKY_BIND; |
|||
} else { |
|||
state = FRSKY_BIND_DONE; |
|||
} |
|||
|
|||
return 10000; |
|||
} |
|||
|
|||
uint16_t Frsky_d::read_frsky_2way(void) |
|||
{ |
|||
if (state < FRSKY_BIND_DONE) { |
|||
Serial.print("bind mode\n"); |
|||
build_bind_packet(); |
|||
cc2500->strobe(CC2500_SIDLE); |
|||
cc2500->write_register(CC2500_0A_CHANNR, 0x00); |
|||
cc2500->write_register(CC2500_23_FSCAL3, 0x89); |
|||
cc2500->strobe(CC2500_SFRX);//0x3A
|
|||
cc2500->write_data(packet, packet[0] + 1); |
|||
|
|||
if (IS_BIND_DONE) { |
|||
Serial.print("bind finished \n"); |
|||
state = FRSKY_BIND_DONE; |
|||
} else { |
|||
//state += 1;
|
|||
Serial.print("bind not done\n"); |
|||
Serial.print("state :"); |
|||
Serial.print(state); |
|||
Serial.print("\n"); |
|||
} |
|||
|
|||
return 9000; |
|||
} |
|||
|
|||
if (state == FRSKY_BIND_DONE) { |
|||
Serial.print("bind done \n"); |
|||
state = FRSKY_DATA2; |
|||
init(false); |
|||
counter = 0; |
|||
BIND_DONE; |
|||
} else if (state == FRSKY_DATA5) { |
|||
Serial.print("data 5 \n"); |
|||
cc2500->strobe(CC2500_SRX);//0x34 RX enable
|
|||
state = FRSKY_DATA1; |
|||
return 9200; |
|||
} |
|||
|
|||
counter = (counter + 1) % 188; |
|||
|
|||
if (state == FRSKY_DATA4) { |
|||
Serial.print("data 4 \n"); |
|||
//telemetry receive
|
|||
cc2500->set_wireless_mode(CC2500::wireless_rx); |
|||
cc2500->strobe(CC2500_SIDLE); |
|||
cc2500->write_register(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); |
|||
cc2500->write_register(CC2500_23_FSCAL3, 0x89); |
|||
state++; |
|||
return 1300; |
|||
} else { |
|||
if (state == FRSKY_DATA1) { |
|||
Serial.print("data 1 \n"); |
|||
len = cc2500->read_register(CC2500_3B_RXBYTES | CC2500_READ_BURST) & 0x7F; |
|||
|
|||
if (len && len <= (0x11 + 3)) { // 20bytes
|
|||
cc2500->read_data(pkt, len); //received telemetry packets
|
|||
#if defined(TELEMETRY)
|
|||
|
|||
if (pkt[len - 1] & 0x80) { |
|||
//with valid crc
|
|||
packet_count = 0; |
|||
frsky_check_telemetry(pkt, len); //check if valid telemetry packets and buffer them.
|
|||
} |
|||
|
|||
#endif
|
|||
} else { |
|||
packet_count++; |
|||
|
|||
// restart sequence on missed packet - might need count or timeout instead of one missed
|
|||
if (packet_count > 100) { |
|||
//~1sec
|
|||
packet_count = 0; |
|||
#if defined TELEMETRY
|
|||
telemetry_link = 0; //no link frames
|
|||
pkt[6] = 0; //no user frames.
|
|||
#endif
|
|||
} |
|||
} |
|||
|
|||
cc2500->set_wireless_mode(CC2500::wireless_tx); |
|||
cc2500->set_power(); // Set tx_power
|
|||
} |
|||
|
|||
cc2500->strobe(CC2500_SIDLE); |
|||
cc2500->write_register(CC2500_0A_CHANNR, hopping_frequency[counter % 47]); |
|||
|
|||
if (prev_option != option) { |
|||
cc2500->write_register(CC2500_0C_FSCTRL0, option); // Frequency offset hack
|
|||
prev_option = option ; |
|||
} |
|||
|
|||
cc2500->write_register(CC2500_23_FSCAL3, 0x89); |
|||
cc2500->strobe(CC2500_SFRX); |
|||
frsky2way_data_frame(); |
|||
cc2500->write_data(packet, packet[0] + 1); |
|||
state++; |
|||
} |
|||
|
|||
return state == FRSKY_DATA4 ? 7500 : 9000; |
|||
} |
|||
|
|||
uint16_t Frsky_d::convert_channel_frsky(uint8_t num) |
|||
{ |
|||
// Channel value for FrSky (PPM is multiplied by 1.5)
|
|||
uint16_t val = Channel_data[num]; |
|||
return ((val*15)>>4)+1290; |
|||
} |
|||
|
|||
void Frsky_d::init_hop(void) |
|||
{ |
|||
uint8_t val; |
|||
uint8_t channel = rx_tx_addr[0]&0x07; |
|||
uint8_t channel_spacing = rx_tx_addr[1]; |
|||
//Filter bad tables
|
|||
if(channel_spacing<0x02) |
|||
channel_spacing+=0x02; |
|||
if(channel_spacing>0xE9) |
|||
channel_spacing-=0xE7; |
|||
if(channel_spacing%0x2F==0) |
|||
channel_spacing++; |
|||
|
|||
hopping_frequency[0]=channel; |
|||
for(uint8_t i=1;i<50;i++) { |
|||
channel=(channel+channel_spacing) % 0xEB; |
|||
val=channel; |
|||
if((val==0x00) || (val==0x5A) || (val==0xDC)) |
|||
val++; |
|||
hopping_frequency[i]=i>46?0:val; |
|||
} |
|||
} |
|||
|
|||
void Frsky_d::init_channel(void) |
|||
{ |
|||
for(uint8_t i=0;i<NUM_CHN;i++) |
|||
Channel_data[i]=1024; |
|||
|
|||
Channel_data[THROTTLE]=204; |
|||
} |
|||
|
|||
void Frsky_d::init_failsafe() |
|||
{ |
|||
for(uint8_t i=0;i<NUM_CHN;i++) |
|||
failsafe_data[i]=1024; |
|||
|
|||
failsafe_data[THROTTLE]=204; |
|||
fail_save = true; |
|||
} |
@ -1,81 +0,0 @@ |
|||
#include <Arduino.h> |
|||
|
|||
#ifndef FRSKYD_H |
|||
#define FRSKYD_H |
|||
#include <cc2500.h> |
|||
|
|||
#define BIND_IN_PROGRESS protocol_flags &= ~_BV(7) |
|||
#define BIND_DONE protocol_flags |= _BV(7) |
|||
#define IS_BIND_DONE ( ( protocol_flags & _BV(7) ) !=0 ) |
|||
#define IS_BIND_IN_PROGRESS ( ( protocol_flags & _BV(7) ) ==0 ) |
|||
|
|||
class Frsky_d |
|||
{ |
|||
private: |
|||
uint8_t hopping_frequency[50]; |
|||
uint8_t calibration; |
|||
enum frsky_d_state { |
|||
FRSKY_BIND = 0, |
|||
FRSKY_BIND_DONE = 1000, |
|||
FRSKY_DATA1, |
|||
FRSKY_DATA2, |
|||
FRSKY_DATA3, |
|||
FRSKY_DATA4, |
|||
FRSKY_DATA5 |
|||
}; |
|||
int state; |
|||
|
|||
CC2500 * cc2500; |
|||
|
|||
uint16_t packet_count; |
|||
uint8_t packet[40]; |
|||
uint8_t len; |
|||
|
|||
uint8_t rx_tx_addr[5]; |
|||
uint8_t option; |
|||
uint8_t prev_option; |
|||
uint16_t counter; |
|||
|
|||
uint8_t pkt[29]; |
|||
|
|||
#define NUM_CHN 16 |
|||
// Servo data |
|||
uint8_t Channel_AUX; |
|||
|
|||
uint16_t Channel_data[NUM_CHN]; |
|||
uint16_t failsafe_data[NUM_CHN]; |
|||
|
|||
uint8_t protocol_flags=0,protocol_flags2=0; |
|||
|
|||
volatile uint32_t gWDT_entropy = 0; |
|||
uint32_t MProtocol_id_master; |
|||
uint32_t MProtocol_id; |
|||
|
|||
bool fail_save = false; |
|||
|
|||
public: |
|||
Frsky_d(CC2500 *cc2500); |
|||
void init(bool bind); |
|||
void build_bind_packet(void); |
|||
uint16_t init_frsky_2way(void); |
|||
|
|||
uint16_t read_frsky_2way(void); |
|||
void frsky2way_init(bool bind); |
|||
void frsky_init_hop(void); |
|||
|
|||
void init_cc2500(const uint8_t *ptr); |
|||
void frsky2way_data_frame(); |
|||
|
|||
uint16_t convert_channel_frsky(uint8_t num); |
|||
|
|||
void init_hop(void); |
|||
|
|||
void init_channel(void); |
|||
void init_failsafe(void); |
|||
|
|||
|
|||
}; |
|||
|
|||
|
|||
|
|||
#endif /*FRSKYD_H*/ |
@ -1,150 +0,0 @@ |
|||
/* |
|||
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/>. |
|||
*/ |
|||
|
|||
#ifndef _IFACE_CC2500_H_ |
|||
#define _IFACE_CC2500_H_ |
|||
|
|||
enum { |
|||
CC2500_00_IOCFG2 = 0x00, // GDO2 output pin configuration |
|||
CC2500_01_IOCFG1 = 0x01, // GDO1 output pin configuration |
|||
CC2500_02_IOCFG0 = 0x02, // GDO0 output pin configuration |
|||
CC2500_03_FIFOTHR = 0x03, // RX FIFO and TX FIFO thresholds |
|||
CC2500_04_SYNC1 = 0x04, // Sync word, high byte |
|||
CC2500_05_SYNC0 = 0x05, // Sync word, low byte |
|||
CC2500_06_PKTLEN = 0x06, // Packet length |
|||
CC2500_07_PKTCTRL1 = 0x07, // Packet automation control |
|||
CC2500_08_PKTCTRL0 = 0x08, // Packet automation control |
|||
CC2500_09_ADDR = 0x09, // Device address |
|||
CC2500_0A_CHANNR = 0x0A, // Channel number |
|||
CC2500_0B_FSCTRL1 = 0x0B, // Frequency synthesizer control |
|||
CC2500_0C_FSCTRL0 = 0x0C, // Frequency synthesizer control |
|||
CC2500_0D_FREQ2 = 0x0D, // Frequency control word, high byte |
|||
CC2500_0E_FREQ1 = 0x0E, // Frequency control word, middle byte |
|||
CC2500_0F_FREQ0 = 0x0F, // Frequency control word, low byte |
|||
CC2500_10_MDMCFG4 = 0x10, // Modem configuration |
|||
CC2500_11_MDMCFG3 = 0x11, // Modem configuration |
|||
CC2500_12_MDMCFG2 = 0x12, // Modem configuration |
|||
CC2500_13_MDMCFG1 = 0x13, // Modem configuration |
|||
CC2500_14_MDMCFG0 = 0x14, // Modem configuration |
|||
CC2500_15_DEVIATN = 0x15, // Modem deviation setting |
|||
CC2500_16_MCSM2 = 0x16, // Main Radio Cntrl State Machine config |
|||
CC2500_17_MCSM1 = 0x17, // Main Radio Cntrl State Machine config |
|||
CC2500_18_MCSM0 = 0x18, // Main Radio Cntrl State Machine config |
|||
CC2500_19_FOCCFG = 0x19, // Frequency Offset Compensation config |
|||
CC2500_1A_BSCFG = 0x1A, // Bit Synchronization configuration |
|||
CC2500_1B_AGCCTRL2 = 0x1B, // AGC control |
|||
CC2500_1C_AGCCTRL1 = 0x1C, // AGC control |
|||
CC2500_1D_AGCCTRL0 = 0x1D, // AGC control |
|||
CC2500_1E_WOREVT1 = 0x1E, // High byte Event 0 timeout |
|||
CC2500_1F_WOREVT0 = 0x1F, // Low byte Event 0 timeout |
|||
CC2500_20_WORCTRL = 0x20, // Wake On Radio control |
|||
CC2500_21_FREND1 = 0x21, // Front end RX configuration |
|||
CC2500_22_FREND0 = 0x22, // Front end TX configuration |
|||
CC2500_23_FSCAL3 = 0x23, // Frequency synthesizer calibration |
|||
CC2500_24_FSCAL2 = 0x24, // Frequency synthesizer calibration |
|||
CC2500_25_FSCAL1 = 0x25, // Frequency synthesizer calibration |
|||
CC2500_26_FSCAL0 = 0x26, // Frequency synthesizer calibration |
|||
CC2500_27_RCCTRL1 = 0x27, // RC oscillator configuration |
|||
CC2500_28_RCCTRL0 = 0x28, // RC oscillator configuration |
|||
CC2500_29_FSTEST = 0x29, // Frequency synthesizer cal control |
|||
CC2500_2A_PTEST = 0x2A, // Production test |
|||
CC2500_2B_AGCTEST = 0x2B, // AGC test |
|||
CC2500_2C_TEST2 = 0x2C, // Various test settings |
|||
CC2500_2D_TEST1 = 0x2D, // Various test settings |
|||
CC2500_2E_TEST0 = 0x2E, // Various test settings |
|||
|
|||
// Status registers |
|||
CC2500_30_PARTNUM = 0x30, // Part number |
|||
CC2500_31_VERSION = 0x31, // Current version number |
|||
CC2500_32_FREQEST = 0x32, // Frequency offset estimate |
|||
CC2500_33_LQI = 0x33, // Demodulator estimate for link quality |
|||
CC2500_34_RSSI = 0x34, // Received signal strength indication |
|||
CC2500_35_MARCSTATE = 0x35, // Control state machine state |
|||
CC2500_36_WORTIME1 = 0x36, // High byte of WOR timer |
|||
CC2500_37_WORTIME0 = 0x37, // Low byte of WOR timer |
|||
CC2500_38_PKTSTATUS = 0x38, // Current GDOx status and packet status |
|||
CC2500_39_VCO_VC_DAC = 0x39, // Current setting from PLL cal module |
|||
CC2500_3A_TXBYTES = 0x3A, // Underflow and # of bytes in TXFIFO |
|||
CC2500_3B_RXBYTES = 0x3B, // Overflow and # of bytes in RXFIFO |
|||
|
|||
// Multi byte memory locations |
|||
CC2500_3E_PATABLE = 0x3E, |
|||
CC2500_3F_TXFIFO = 0x3F, |
|||
CC2500_3F_RXFIFO = 0x3F, |
|||
}; |
|||
|
|||
// Definitions for burst/single access to registers |
|||
#define CC2500_WRITE_SINGLE 0x00 |
|||
#define CC2500_WRITE_BURST 0x40 |
|||
#define CC2500_READ_SINGLE 0x80 |
|||
#define CC2500_READ_BURST 0xC0 |
|||
|
|||
// Strobe commands |
|||
#define CC2500_SRES 0x30 // Reset chip. |
|||
#define CC2500_SFSTXON 0x31 // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1). |
|||
// If in RX/TX: Go to a wait state where only the synthesizer is |
|||
// running (for quick RX / TX turnaround). |
|||
#define CC2500_SXOFF 0x32 // Turn off crystal oscillator. |
|||
#define CC2500_SCAL 0x33 // Calibrate frequency synthesizer and turn it off |
|||
// (enables quick start). |
|||
#define CC2500_SRX 0x34 // Enable RX. Perform calibration first if coming from IDLE and |
|||
// MCSM0.FS_AUTOCAL=1. |
|||
#define CC2500_STX 0x35 // In IDLE state: Enable TX. Perform calibration first if |
|||
// MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled: |
|||
// Only go to TX if channel is clear. |
|||
#define CC2500_SIDLE 0x36 // Exit RX / TX, turn off frequency synthesizer and exit |
|||
// Wake-On-Radio mode if applicable. |
|||
#define CC2500_SAFC 0x37 // Perform AFC adjustment of the frequency synthesizer |
|||
#define CC2500_SWOR 0x38 // Start automatic RX polling sequence (Wake-on-Radio) |
|||
#define CC2500_SPWD 0x39 // Enter power down mode when CSn goes high. |
|||
#define CC2500_SFRX 0x3A // Flush the RX FIFO buffer. |
|||
#define CC2500_SFTX 0x3B // Flush the TX FIFO buffer. |
|||
#define CC2500_SWORRST 0x3C // Reset real time clock. |
|||
#define CC2500_SNOP 0x3D // No operation. May be used to pad strobe commands to two |
|||
// bytes for simpler software. |
|||
//---------------------------------------------------------------------------------- |
|||
// Chip Status Byte |
|||
//---------------------------------------------------------------------------------- |
|||
|
|||
// Bit fields in the chip status byte |
|||
#define CC2500_STATUS_CHIP_RDYn_BM 0x80 |
|||
#define CC2500_STATUS_STATE_BM 0x70 |
|||
#define CC2500_STATUS_FIFO_BYTES_AVAILABLE_BM 0x0F |
|||
|
|||
// Chip states |
|||
#define CC2500_STATE_IDLE 0x00 |
|||
#define CC2500_STATE_RX 0x10 |
|||
#define CC2500_STATE_TX 0x20 |
|||
#define CC2500_STATE_FSTXON 0x30 |
|||
#define CC2500_STATE_CALIBRATE 0x40 |
|||
#define CC2500_STATE_SETTLING 0x50 |
|||
#define CC2500_STATE_RX_OVERFLOW 0x60 |
|||
#define CC2500_STATE_TX_UNDERFLOW 0x70 |
|||
|
|||
//---------------------------------------------------------------------------------- |
|||
// Other register bit fields |
|||
//---------------------------------------------------------------------------------- |
|||
#define CC2500_LQI_CRC_OK_BM 0x80 |
|||
#define CC2500_LQI_EST_BM 0x7F |
|||
|
|||
//void CC2500_WriteReg(u8 addr, u8 data); |
|||
//u8 CC2500_ReadReg(u8 addr); |
|||
//void CC2500_Reset(); |
|||
//void CC2500_Strobe(u8 cmd); |
|||
//void CC2500_WriteData(u8 *packet, u8 length); |
|||
//void CC2500_ReadData(u8 *dpbuffer, int len); |
|||
//void CC2500_SetTxRxMode(enum TXRX_State); |
|||
|
|||
#endif |
@ -1,106 +0,0 @@ |
|||
#include "io_data.h"
|
|||
#include "pins.h"
|
|||
#include <Arduino.h>
|
|||
|
|||
IO_DATA::IO_DATA() |
|||
{ |
|||
} |
|||
void IO_DATA::adc_init(void) |
|||
{ |
|||
// AREF = AVcc
|
|||
ADMUX = (0 << REFS1) | (1 << REFS0); |
|||
Serial.print("ADMUX"); |
|||
Serial.print(ADMUX); |
|||
Serial.print(" ADCSRA"); |
|||
Serial.print(ADCSRA); |
|||
Serial.print("\n"); |
|||
|
|||
// ADC Enable
|
|||
ADCSRA |= _BV(ADEN); |
|||
// ADC prescaler of 128
|
|||
// 16000000/128 = 125000
|
|||
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); |
|||
} |
|||
|
|||
uint16_t IO_DATA::adc_read(uint8_t ch) |
|||
{ |
|||
// ‘ch’ between 0 and 7
|
|||
//
|
|||
if (ch >= 0x08) { |
|||
/* Set Mux5 */ |
|||
ADCSRB |= _BV(MUX5); |
|||
ch &= ~0x08; |
|||
} else { |
|||
/* Clear Mux5 */ |
|||
ADCSRB &= ~_BV(MUX5); |
|||
} |
|||
|
|||
ch = ch & 0b00000111; |
|||
Serial.print("ch"); |
|||
Serial.print(ch); |
|||
ADMUX |= ch; |
|||
|
|||
// start single convertion
|
|||
ADCSRA |= (1 << ADSC); |
|||
|
|||
// wait for conversion to complete
|
|||
delay(50); |
|||
|
|||
while (ADCSRA & (1 << ADSC)); // wait for conversion to complete
|
|||
|
|||
/* while(!(ADCSRA & (1<<ADIF))) { */ |
|||
/* /1* nothing *1/ */ |
|||
/* } */ |
|||
|
|||
// clear bit
|
|||
ADCSRA |= (1 << ADIF); |
|||
|
|||
return (ADC); |
|||
} |
|||
|
|||
void IO_DATA::init() |
|||
{ |
|||
#if 0
|
|||
adc_init(); |
|||
#endif
|
|||
BUTTON_R_INPUT; |
|||
BUTTON_L_INPUT; |
|||
ARM_INPUT; |
|||
FLIGHT_MODE_INPUT; |
|||
|
|||
/* inital read */ |
|||
update(); |
|||
} |
|||
void IO_DATA::update() |
|||
{ |
|||
#if 0
|
|||
/* read joysticks */ |
|||
r_x = adc_read(AD_R_X_JOY_PIN); |
|||
r_y = adc_read(AD_R_Y_JOY_PIN); |
|||
|
|||
|
|||
l_x = adc_read(AD_L_X_JOY_PIN); |
|||
l_y = adc_read(AD_L_Y_JOY_PIN); |
|||
|
|||
/* read akku power */ |
|||
akku_power = adc_read(AD_AKKUPOWER_PIN); |
|||
#else
|
|||
/* read joysticks */ |
|||
r_x = analogRead(AD_R_X_JOY_PIN); |
|||
r_y = analogRead(AD_R_Y_JOY_PIN); |
|||
|
|||
l_x = analogRead(AD_L_X_JOY_PIN); |
|||
l_y = analogRead(AD_L_Y_JOY_PIN); |
|||
|
|||
/* read akku power */ |
|||
akku_power = analogRead(AD_AKKUPOWER_PIN); |
|||
#endif
|
|||
|
|||
r_sw = BUTTON_R_IS_HIGH; |
|||
l_sw = BUTTON_L_IS_HIGH; |
|||
|
|||
/* read switches */ |
|||
arm_sw = ARM_IS_HIGH; |
|||
flight_mode_sw = FLIGHT_MODE_IS_HIGH; |
|||
|
|||
} |
@ -1,25 +0,0 @@ |
|||
#ifndef INPUT_HPP |
|||
#define INPUT_HPP |
|||
#include "Arduino.h" |
|||
|
|||
class IO_DATA |
|||
{ |
|||
private: |
|||
void adc_init(void); |
|||
uint16_t adc_read(uint8_t ch); |
|||
|
|||
public: |
|||
uint16_t r_x, r_y; |
|||
bool r_sw; |
|||
uint16_t l_x, l_y; |
|||
bool l_sw; |
|||
bool arm_sw; |
|||
bool flight_mode_sw; |
|||
uint16_t akku_power; |
|||
|
|||
IO_DATA(); |
|||
void init(); |
|||
void update(); |
|||
}; |
|||
|
|||
#endif /* INPUT_HPP */ |
@ -1,98 +0,0 @@ |
|||
/*
|
|||
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/>.
|
|||
*/ |
|||
#include <Arduino.h>
|
|||
|
|||
|
|||
#include "spi.h"
|
|||
#include "cc2500.h"
|
|||
#include "frskyd.h"
|
|||
#include "io_data.h"
|
|||
|
|||
SPI *spi = NULL; |
|||
IO_DATA *io_data = NULL; |
|||
CC2500 *cc2500 = NULL; |
|||
Frsky_d *frskyd = NULL; |
|||
|
|||
void setup() |
|||
{ |
|||
while (!Serial) { |
|||
delay(500); |
|||
} |
|||
|
|||
Serial.begin(115200); |
|||
|
|||
spi = new SPI(); |
|||
spi->init(); |
|||
|
|||
cc2500 = new CC2500(spi); |
|||
|
|||
frskyd = new Frsky_d(cc2500); |
|||
|
|||
io_data = new IO_DATA(); |
|||
io_data->init(); |
|||
|
|||
Serial.println("Remote ON!"); |
|||
|
|||
delay (500); |
|||
cc2500->reset(); |
|||
Serial.print(" init\n"); |
|||
frskyd->init(false); |
|||
|
|||
delay (500); |
|||
Serial.print(" init 2way\n"); |
|||
frskyd->init_frsky_2way(); |
|||
|
|||
} |
|||
|
|||
void loop() |
|||
{ |
|||
Serial.println("loop!"); |
|||
|
|||
io_data->update(); |
|||
|
|||
Serial.print(" akku= "); |
|||
Serial.print(io_data->akku_power); |
|||
Serial.print(" arm= "); |
|||
Serial.print(io_data->arm_sw); |
|||
Serial.print(" mode= "); |
|||
Serial.print(io_data->flight_mode_sw); |
|||
|
|||
Serial.print("l x= "); |
|||
Serial.print(io_data->r_x); |
|||
Serial.print(" y= "); |
|||
Serial.print(io_data->r_y); |
|||
Serial.print(" sw= "); |
|||
Serial.print(io_data->r_sw); |
|||
|
|||
Serial.print("r x= "); |
|||
Serial.print(io_data->l_x); |
|||
Serial.print(" y= "); |
|||
Serial.print(io_data->l_y); |
|||
Serial.print(" sw= "); |
|||
Serial.print(io_data->l_sw); |
|||
Serial.print("\n"); |
|||
|
|||
//TODO needed ? PE1_off;
|
|||
//TODO needed ? PE2_on;
|
|||
|
|||
Serial.print(" read 2 way\n"); |
|||
int rt = frskyd->read_frsky_2way(); |
|||
|
|||
Serial.print(" read :"); |
|||
Serial.print(rt); |
|||
Serial.print("\n"); |
|||
|
|||
delayMicroseconds(rt); |
|||
} |
@ -1,264 +0,0 @@ |
|||
/* |
|||
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/>. |
|||
*/ |
|||
|
|||
/** |
|||
* LEONARDO usb |
|||
* __Micro__ |
|||
* D1 -| |- RAW |
|||
* D0 -| |- GND |
|||
* GND -| |- RESET |
|||
* GND -| |- VCC |
|||
* D2 -| |- A3 |
|||
* D3 -| |- A2 |
|||
* D4/A6 -| |- A1 |
|||
* D5 -| |- A0 |
|||
* D6/A7 -| |- D15 |
|||
* D7 -| |- D14 |
|||
* D8/A8 -| |- D16 |
|||
* D9/A9 -| |- D10/A10 |
|||
* ''''''''' |
|||
*/ |
|||
//******************* |
|||
//*** Pinouts *** |
|||
//******************* |
|||
/* i2c clock */ |
|||
#define I2C_SLC_PIN 3 |
|||
#define I2C_SLC_PORT PORTD |
|||
#define I2C_SLC_IPR PIND |
|||
#define I2C_SLC_DDR DDRD |
|||
#define I2C_SLC_ON I2C_SLC_PORT |= _BV(I2C_SLC_PIN) |
|||
#define I2C_SLC_OFF I2C_SLC_PORT &= ~_BV(I2C_SLC_PIN) |
|||
#define I2C_SLC_OUTPUT I2C_SLC_DDR |= _BV(I2C_SLC_PIN) |
|||
#define I2C_SLC_INPUT I2C_SLC_DDR &= ~_BV(I2C_SLC_PIN) |
|||
#define I2C_SLC_IS_HIGH ((I2C_SLC_IPR & _BV(I2C_SLC_PIN)) != 0x00) |
|||
#define I2C_SLC_IS_LOW ((I2C_SLC_IPR & _BV(I2C_SLC_PIN)) == 0x00) |
|||
|
|||
/* i2c data */ |
|||
#define I2C_SDA_PIN 2 |
|||
#define I2C_SDA_PORT PORTD |
|||
#define I2C_SDA_IPR PIND |
|||
#define I2C_SDA_DDR DDRD |
|||
#define I2C_SDA_ON I2C_SDA_PORT |= _BV(I2C_SDA_PIN) |
|||
#define I2C_SDA_OFF I2C_SDA_PORT &= ~_BV(I2C_SDA_PIN) |
|||
#define I2C_SDA_OUTPUT I2C_SDA_DDR |= _BV(I2C_SDA_PIN) |
|||
#define I2C_SDA_INPUT I2C_SDA_DDR &= ~_BV(I2C_SDA_PIN) |
|||
#define I2C_SDA_IS_HIGH ((I2C_SDA_IPR & _BV(I2C_SDA_PIN)) != 0x00) |
|||
#define I2C_SDA_IS_LOW ((I2C_SDA_IPR & _BV(I2C_SDA_PIN)) == 0x00) |
|||
|
|||
/* switch flight mode */ |
|||
#define FLIGHT_MODE_PIN 0 |
|||
#define FLIGHT_MODE_PORT PORTD |
|||
#define FLIGHT_MODE_IPR PIND |
|||
#define FLIGHT_MODE_DDR DDRD |
|||
#define FLIGHT_MODE_ON FLIGHT_MODE_PORT |= _BV(FLIGHT_MODE_PIN) |
|||
#define FLIGHT_MODE_OFF FLIGHT_MODE_PORT &= ~_BV(FLIGHT_MODE_PIN) |
|||
#define FLIGHT_MODE_OUTPUT FLIGHT_MODE_DDR |= _BV(FLIGHT_MODE_PIN) |
|||
#define FLIGHT_MODE_INPUT FLIGHT_MODE_DDR &= ~_BV(FLIGHT_MODE_PIN) |
|||
#define FLIGHT_MODE_IS_HIGH ((FLIGHT_MODE_IPR & _BV(FLIGHT_MODE_PIN)) != 0x00) |
|||
#define FLIGHT_MODE_IS_LOW ((FLIGHT_MODE_IPR & _BV(FLIGHT_MODE_PIN)) == 0x00) |
|||
|
|||
/* switch arm */ |
|||
#define ARM_PIN 1 |
|||
#define ARM_PORT PORTD |
|||
#define ARM_IPR PIND |
|||
#define ARM_DDR DDRD |
|||
#define ARM_ON ARM_PORT |= _BV(ARM_PIN) |
|||
#define ARM_OFF ARM_PORT &= ~_BV(ARM_PIN) |
|||
#define ARM_OUTPUT ARM_DDR |= _BV(ARM_PIN) |
|||
#define ARM_INPUT ARM_DDR &= ~_BV(ARM_PIN) |
|||
#define ARM_IS_HIGH ((ARM_IPR & _BV(ARM_PIN)) != 0x00) |
|||
#define ARM_IS_LOW ((ARM_IPR & _BV(ARM_PIN)) == 0x00) |
|||
|
|||
/* power amplifier */ |
|||
#define POWER_AMP_PIN 5 |
|||
#define POWER_AMP_PORT PORTD |
|||
#define POWER_AMP_IPR PIND |
|||
#define POWER_AMP_DDR DDRD |
|||
#define POWER_AMP_ON POWER_AMP_PORT |= _BV(POWER_AMP_PIN) |
|||
#define POWER_AMP_OFF POWER_AMP_PORT &= ~_BV(POWER_AMP_PIN) |
|||
#define POWER_AMP_OUTPUT POWER_AMP_DDR |= _BV(POWER_AMP_PIN) |
|||
#define POWER_AMP_INPUT POWER_AMP_DDR &= ~_BV(POWER_AMP_PIN) |
|||
#define POWER_AMP_IS_HIGH ((POWER_AMP_IPR & _BV(POWER_AMP_PIN)) != 0x00) |
|||
#define POWER_AMP_IS_LOW ((POWER_AMP_IPR & _BV(POWER_AMP_PIN)) == 0x00) |
|||
|
|||
/* low noise amplifier */ |
|||
#define LOW_NOISE_AMP_PIN 5 |
|||
#define LOW_NOISE_AMP_PORT PORTD |
|||
#define LOW_NOISE_AMP_IPR PIND |
|||
#define LOW_NOISE_AMP_DDR DDRD |
|||
#define LOW_NOISE_AMP_ON LOW_NOISE_AMP_PORT |= _BV(LOW_NOISE_AMP_PIN) |
|||
#define LOW_NOISE_AMP_OFF LOW_NOISE_AMP_PORT &= ~_BV(LOW_NOISE_AMP_PIN) |
|||
#define LOW_NOISE_AMP_OUTPUT LOW_NOISE_AMP_DDR |= _BV(LOW_NOISE_AMP_PIN) |
|||
#define LOW_NOISE_AMP_INPUT LOW_NOISE_AMP_DDR &= ~_BV(LOW_NOISE_AMP_PIN) |
|||
#define LOW_NOISE_AMP_IS_HIGH ((LOW_NOISE_AMP_IPR & _BV(LOW_NOISE_AMP_PIN)) != 0x00) |
|||
#define LOW_NOISE_AMP_IS_LOW ((LOW_NOISE_AMP_IPR & _BV(LOW_NOISE_AMP_PIN)) == 0x00) |
|||
|
|||
/* buzzer */ |
|||
#define BUZZER_PIN 8 |
|||
#define BUZZER_PORT PORTD |
|||
#define BUZZER_IPR PIND |
|||
#define BUZZER_DDR DDRD |
|||
#define BUZZER_ON BUZZER_PORT |= _BV(BUZZER_PIN) |
|||
#define BUZZER_OFF BUZZER_PORT &= ~_BV(BUZZER_PIN) |
|||
#define BUZZER_OUTPUT BUZZER_DDR |= _BV(BUZZER_PIN) |
|||
#define BUZZER_INPUT BUZZER_DDR &= ~_BV(BUZZER_PIN) |
|||
#define BUZZER_IS_HIGH ((BUZZER_IPR & _BV(BUZZER_PIN)) != 0x00) |
|||
#define BUZZER_IS_LOW ((BUZZER_IPR & _BV(BUZZER_PIN)) == 0x00) |
|||
|
|||
/* chip select cc2500 */ |
|||
#define CC2500_CS_PIN 8 |
|||
#define CC2500_CS_PORT PORTD |
|||
#define CC2500_CS_IPR PIND |
|||
#define CC2500_CS_DDR DDRD |
|||
#define CC2500_CS_ON CC2500_CS_PORT |= _BV(CC2500_CS_PIN) |
|||
#define CC2500_CS_OFF CC2500_CS_PORT &= ~_BV(CC2500_CS_PIN) |
|||
#define CC2500_CS_OUTPUT CC2500_CS_DDR |= _BV(CC2500_CS_PIN) |
|||
#define CC2500_CS_INPUT CC2500_CS_DDR &= ~_BV(CC2500_CS_PIN) |
|||
#define CC2500_CS_IS_HIGH ((CC2500_CS_IPR & _BV(CC2500_CS_PIN)) != 0x00) |
|||
#define CC2500_CS_IS_LOW ((CC2500_CS_IPR & _BV(CC2500_CS_PIN)) == 0x00) |
|||
|
|||
/* Analog right Joystick X direction */ |
|||
#define AD_R_X_JOY_PIN 3 |
|||
#define AD_R_X_JOY_PORT PORTA |
|||
#define AD_R_X_JOY_IPR PORTA |
|||
#define AD_R_X_JOY_DDR DDRA |
|||
#define AD_R_X_JOY_ON AD_R_X_JOY_PORT |= _BV(AD_R_X_JOY_PIN) |
|||
#define AD_R_X_JOY_OFF AD_R_X_JOY_PORT &= ~_BV(AD_R_X_JOY_PIN) |
|||
#define AD_R_X_JOY_OUTPUT AD_R_X_JOY_DDR |= _BV(AD_R_X_JOY_PIN) |
|||
#define AD_R_X_JOY_INPUT AD_R_X_JOY_DDR &= ~_BV(AD_R_X_JOY_PIN) |
|||
#define AD_R_X_JOY_IS_HIGH ((AD_R_X_JOY_IPR & _BV(AD_R_X_JOY_PIN)) != 0x00) |
|||
#define AD_R_X_JOY_IS_LOW ((AD_R_X_JOY_IPR & _BV(AD_R_X_JOY_PIN)) == 0x00) |
|||
|
|||
/* Analog right Joystick y direction */ |
|||
#define AD_R_Y_JOY_PIN 2 |
|||
#define AD_R_Y_JOY_PORT PORTA |
|||
#define AD_R_Y_JOY_IPR PORTA |
|||
#define AD_R_Y_JOY_DDR DDRA |
|||
#define AD_R_Y_JOY_ON AD_R_Y_JOY_PORT |= _BV(AD_R_Y_JOY_PIN) |
|||
#define AD_R_Y_JOY_OFF AD_R_Y_JOY_PORT &= ~_BV(AD_R_Y_JOY_PIN) |
|||
#define AD_R_Y_JOY_OUTPUT AD_R_Y_JOY_DDR |= _BV(AD_R_Y_JOY_PIN) |
|||
#define AD_R_Y_JOY_INPUT AD_R_Y_JOY_DDR &= ~_BV(AD_R_Y_JOY_PIN) |
|||
#define AD_R_Y_JOY_IS_HIGH ((AD_R_Y_JOY_IPR & _BV(AD_R_Y_JOY_PIN)) != 0x00) |
|||
#define AD_R_Y_JOY_IS_LOW ((AD_R_Y_JOY_IPR & _BV(AD_R_Y_JOY_PIN)) == 0x00) |
|||
|
|||
/* right joystick middle button */ |
|||
#define BUTTON_R_PIN 8 |
|||
#define BUTTON_R_PORT PORTD |
|||
#define BUTTON_R_IPR PIND |
|||
#define BUTTON_R_DDR DDRD |
|||
#define BUTTON_R_ON BUTTON_R_PORT |= _BV(BUTTON_R_PIN) |
|||
#define BUTTON_R_OFF BUTTON_R_PORT &= ~_BV(BUTTON_R_PIN) |
|||
#define BUTTON_R_OUTPUT BUTTON_R_DDR |= _BV(BUTTON_R_PIN) |
|||
#define BUTTON_R_INPUT BUTTON_R_DDR &= ~_BV(BUTTON_R_PIN) |
|||
#define BUTTON_R_IS_HIGH ((BUTTON_R_IPR & _BV(BUTTON_R_PIN)) != 0x00) |
|||
#define BUTTON_R_IS_LOW ((BUTTON_R_IPR & _BV(BUTTON_R_PIN)) == 0x00) |
|||
|
|||
/* Analog left Joystick X direction */ |
|||
#define AD_L_X_JOY_PIN 1 |
|||
#define AD_L_X_JOY_PORT PORTA |
|||
#define AD_L_X_JOY_IPR PORTA |
|||
#define AD_L_X_JOY_DDR DDRA |
|||
#define AD_L_X_JOY_ON AD_L_X_JOY_PORT |= _BV(AD_L_X_JOY_PIN) |
|||
#define AD_L_X_JOY_OFF AD_L_X_JOY_PORT &= ~_BV(AD_L_X_JOY_PIN) |
|||
#define AD_L_X_JOY_OUTPUT AD_L_X_JOY_DDR |= _BV(AD_L_X_JOY_PIN) |
|||
#define AD_L_X_JOY_INPUT AD_L_X_JOY_DDR &= ~_BV(AD_L_X_JOY_PIN) |
|||
#define AD_L_X_JOY_IS_HIGH ((AD_L_X_JOY_IPR & _BV(AD_L_X_JOY_PIN)) != 0x00) |
|||
#define AD_L_X_JOY_IS_LOW ((AD_L_X_JOY_IPR & _BV(AD_L_X_JOY_PIN)) == 0x00) |
|||
|
|||
/* Analog left Joystick y direction */ |
|||
#define AD_L_Y_JOY_PIN 0 |
|||
#define AD_L_Y_JOY_PORT PORTA |
|||
#define AD_L_Y_JOY_IPR PORTA |
|||
#define AD_L_Y_JOY_DDR DDRA |
|||
#define AD_L_Y_JOY_ON AD_L_Y_JOY_PORT |= _BV(AD_L_Y_JOY_PIN) |
|||
#define AD_L_Y_JOY_OFF AD_L_Y_JOY_PORT &= ~_BV(AD_L_Y_JOY_PIN) |
|||
#define AD_L_Y_JOY_OUTPUT AD_L_Y_JOY_DDR |= _BV(AD_L_Y_JOY_PIN) |
|||
#define AD_L_Y_JOY_INPUT AD_L_Y_JOY_DDR &= ~_BV(AD_L_Y_JOY_PIN) |
|||
#define AD_L_Y_JOY_IS_HIGH ((AD_L_Y_JOY_IPR & _BV(AD_L_Y_JOY_PIN)) != 0x00) |
|||
#define AD_L_Y_JOY_IS_LOW ((AD_L_Y_JOY_IPR & _BV(AD_L_Y_JOY_PIN)) == 0x00) |
|||
|
|||
/* left joystick middle button */ |
|||
#define BUTTON_L_PIN 8 |
|||
#define BUTTON_L_PORT PORTD |
|||
#define BUTTON_L_IPR PIND |
|||
#define BUTTON_L_DDR DDRD |
|||
#define BUTTON_L_ON BUTTON_L_PORT |= _BV(BUTTON_L_PIN) |
|||
#define BUTTON_L_OFF BUTTON_L_PORT &= ~_BV(BUTTON_L_PIN) |
|||
#define BUTTON_L_OUTPUT BUTTON_L_DDR |= _BV(BUTTON_L_PIN) |
|||
#define BUTTON_L_INPUT BUTTON_L_DDR &= ~_BV(BUTTON_L_PIN) |
|||
#define BUTTON_L_IS_HIGH ((BUTTON_L_IPR & _BV(BUTTON_L_PIN)) != 0x00) |
|||
#define BUTTON_L_IS_LOW ((BUTTON_L_IPR & _BV(BUTTON_L_PIN)) == 0x00) |
|||
|
|||
/* Analog akku power read */ |
|||
#define AD_AKKUPOWER_PIN 10 |
|||
#define AD_AKKUPOWER_PORT PORTA |
|||
#define AD_AKKUPOWER_IPR PORTA |
|||
#define AD_AKKUPOWER_DDR DDRA |
|||
#define AD_AKKUPOWER_ON AD_AKKUPOWER_PORT |= _BV(AD_AKKUPOWER_PIN) |
|||
#define AD_AKKUPOWER_OFF AD_AKKUPOWER_PORT &= ~_BV(AD_AKKUPOWER_PIN) |
|||
#define AD_AKKUPOWER_OUTPUT AD_AKKUPOWER_PORT |= _BV(AD_AKKUPOWER_PIN) |
|||
#define AD_AKKUPOWER_INPUT AD_AKKUPOWER_PORT &= ~_BV(AD_AKKUPOWER_PIN) |
|||
#define AD_AKKUPOWER_IS_HIGH ((AD_AKKUPOWER_IPR & _BV(AD_AKKUPOWER_PIN)) != 0x00) |
|||
#define AD_AKKUPOWER_IS_LOW ((AD_AKKUPOWER_IPR & _BV(AD_AKKUPOWER_PIN)) == 0x00) |
|||
|
|||
/* SPI clock */ |
|||
#define SPI_SCLK_PIN 15 |
|||
#define SPI_SCLK_PORT PORTD |
|||
#define SPI_SCLK_IPR PIND |
|||
#define SPI_SCLK_DDR DDRD |
|||
#define SPI_SCLK_ON SPI_SCLK_PORT |= _BV(SPI_SCLK_PIN) |
|||
#define SPI_SCLK_OFF SPI_SCLK_PORT &= ~_BV(SPI_SCLK_PIN) |
|||
#define SPI_SCLK_OUTPUT SPI_SCLK_DDR |= _BV(SPI_SCLK_PIN) |
|||
#define SPI_SCLK_INPUT SPI_SCLK_DDR &= ~_BV(SPI_SCLK_PIN) |
|||
#define SPI_SCLK_IS_HIGH ((SPI_SCLK_IPR & _BV(SPI_SCLK_PIN)) != 0x00) |
|||
#define SPI_SCLK_IS_LOW ((SPI_SCLK_IPR & _BV(SPI_SCLK_PIN)) == 0x00) |
|||
|
|||
/* SPI master in slave out */ |
|||
#define SPI_MISO_PIN 14 |
|||
#define SPI_MISO_PORT PORTD |
|||
#define SPI_MISO_IPR PIND |
|||
#define SPI_MISO_DDR DDRD |
|||
#define SPI_MISO_ON SPI_MISO_PORT |= _BV(SPI_MISO_PIN) |
|||
#define SPI_MISO_OFF SPI_MISO_PORT &= ~_BV(SPI_MISO_PIN) |
|||
#define SPI_MISO_OUTPUT SPI_MISO_DDR |= _BV(SPI_MISO_PIN) |
|||
#define SPI_MISO_INPUT SPI_MISO_DDR &= ~_BV(SPI_MISO_PIN) |
|||
#define SPI_MISO_IS_HIGH ((SPI_MISO_IPR & _BV(SPI_MISO_PIN)) != 0x00) |
|||
#define SPI_MISO_IS_LOW ((SPI_MISO_IPR & _BV(SPI_MISO_PIN)) == 0x00) |
|||
|
|||
/* SPI master out slave in*/ |
|||
#define SPI_MOSI_PIN 14 |
|||
#define SPI_MOSI_PORT PORTD |
|||
#define SPI_MOSI_IPR PIND |
|||
#define SPI_MOSI_DDR DDRD |
|||
#define SPI_MOSI_ON SPI_MOSI_PORT |= _BV(SPI_MOSI_PIN) |
|||
#define SPI_MOSI_OFF SPI_MOSI_PORT &= ~_BV(SPI_MOSI_PIN) |
|||
#define SPI_MOSI_OUTPUT SPI_MOSI_DDR |= _BV(SPI_MOSI_PIN) |
|||
#define SPI_MOSI_INPUT SPI_MOSI_DDR &= ~_BV(SPI_MOSI_PIN) |
|||
#define SPI_MOSI_IS_HIGH ((SPI_MOSI_IPR & _BV(SPI_MOSI_PIN)) != 0x00) |
|||
#define SPI_MOSI_IS_LOW ((SPI_MOSI_IPR & _BV(SPI_MOSI_PIN) == 0x00) |
|||
|
|||
#define NOP __asm__("nop"); |
|||
|
|||
#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) |
@ -1,86 +0,0 @@ |
|||
/*
|
|||
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 **/ |
|||
/********************/ |
|||
#include "spi.h"
|
|||
#include "pins.h"
|
|||
#include "Arduino.h"
|
|||
|
|||
SPI::SPI() |
|||
{ |
|||
} |
|||
void SPI::init(void) |
|||
{ |
|||
SPI_SCLK_OUTPUT; |
|||
SPI_MOSI_OUTPUT; |
|||
SPI_MISO_INPUT; |
|||
|
|||
SPI_MOSI_ON; |
|||
SPI_SCLK_OFF; |
|||
|
|||
// wait for the components
|
|||
delay(100); |
|||
} |
|||
|
|||
void SPI::write(const uint8_t command) |
|||
{ |
|||
uint8_t tmp = command; |
|||
|
|||
//SCK start low
|
|||
SPI_SCLK_OFF; |
|||
SPI_MOSI_OFF; |
|||
|
|||
for (uint8_t i = 0; i < 8; ++i) { |
|||
// check if bit is set
|
|||
if (tmp & 0x80) { |
|||
SPI_MOSI_ON; |
|||
} else { |
|||
SPI_MOSI_OFF; |
|||
} |
|||
|
|||
// trigger clock
|
|||
SPI_SCLK_ON; |
|||
// go to next bit
|
|||
tmp = tmp << 1; |
|||
// reset clock
|
|||
SPI_SCLK_OFF; |
|||
} |
|||
|
|||
SPI_MOSI_ON; |
|||
} |
|||
|
|||
uint8_t SPI::read(void) |
|||
{ |
|||
uint8_t result = 0; |
|||
|
|||
for (uint8_t i = 0; i < 8; i++) { |
|||
|
|||
result = result << 1; |
|||
|
|||
if (SPI_MISO_IS_HIGH) { |
|||
result |= 0x01; |
|||
} |
|||
|
|||
// trigger clock
|
|||
SPI_SCLK_ON; |
|||
// give chip some time to react
|
|||
NOP; |
|||
// reset clock
|
|||
SPI_SCLK_OFF; |
|||
} |
|||
|
|||
return result; |
|||
} |
@ -1,29 +0,0 @@ |
|||
/* |
|||
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/>. |
|||
*/ |
|||
#ifndef SPI_H |
|||
#define SPI_H |
|||
#include <Arduino.h> |
|||
class SPI |
|||
{ |
|||
private: |
|||
|
|||
public: |
|||
SPI(); |
|||
void init(void); |
|||
void write(uint8_t command); |
|||
uint8_t read(void); |
|||
}; |
|||
|
|||
#endif |
Write
Preview
Loading…
Cancel
Save
Reference in new issue