10 changed files with 948 additions and 8 deletions
-
169remote/src/cc2500.cpp
-
84remote/src/cc2500.h
-
4remote/src/config.h
-
150remote/src/iface_cc2500.h
-
103remote/src/io_data.cpp
-
24remote/src/io_data.h
-
69remote/src/main.cpp
-
250remote/src/pins.h
-
75remote/src/spi.cpp
-
28remote/src/spi.h
@ -0,0 +1,169 @@ |
|||
#include "cc2500.h"
|
|||
#include "config.h"
|
|||
#include "pins.h"
|
|||
#include "Arduino.h"
|
|||
|
|||
CC2500::CC2500(SPI* spi) |
|||
{ |
|||
this->spi = spi; |
|||
this->bind_done = false; |
|||
} |
|||
|
|||
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); |
|||
} |
|||
|
|||
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]); |
|||
} |
@ -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/>. |
|||
*/ |
|||
|
|||
#ifndef 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 |
@ -0,0 +1,4 @@ |
|||
#ifndef CONFIG_H |
|||
#define CONFIG_H |
|||
|
|||
#endif |
@ -0,0 +1,150 @@ |
|||
/* |
|||
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 |
@ -0,0 +1,103 @@ |
|||
#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; |
|||
|
|||
} |
@ -0,0 +1,24 @@ |
|||
#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,19 +1,72 @@ |
|||
//#include <SPI.h>
|
|||
/*
|
|||
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 "io_data.h"
|
|||
|
|||
SPI* spi = NULL; |
|||
IO_DATA* io_data = NULL; |
|||
CC2500* cc2500 = NULL; |
|||
|
|||
void setup() { |
|||
/* while(Serial) { */ |
|||
/* delay(500); */ |
|||
/* } */ |
|||
while(!Serial) { |
|||
delay(500); |
|||
} |
|||
Serial.begin(115200); |
|||
Serial.println("Remote ON!"); |
|||
|
|||
//SPI.begin();
|
|||
//CC2500.init();
|
|||
spi = new SPI(); |
|||
spi->init(); |
|||
|
|||
cc2500 = new CC2500(spi); |
|||
|
|||
io_data = new IO_DATA(); |
|||
io_data->init(); |
|||
|
|||
Serial.println("Remote ON!"); |
|||
|
|||
} |
|||
|
|||
void loop() { |
|||
// put your main code here, to run repeatedly:
|
|||
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"); |
|||
|
|||
delay(500); |
|||
} |
@ -0,0 +1,250 @@ |
|||
/* |
|||
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"); |
@ -0,0 +1,75 @@ |
|||
/*
|
|||
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"
|
|||
SPI::SPI() |
|||
{ |
|||
} |
|||
void SPI::init(void) |
|||
{ |
|||
SPI_SCLK_OUTPUT; |
|||
SPI_MOSI_OUTPUT; |
|||
SPI_MISO_INPUT; |
|||
} |
|||
|
|||
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; |
|||
} |
@ -0,0 +1,28 @@ |
|||
/* |
|||
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