Traxxas TQ 1st gen: try 5
[DIY-Multiprotocol-TX-Module.git] / Multiprotocol / SX1276_SPI.ino
blob2938c44aa3860bf4579c6772496695ef5d01adc7
1 #ifdef SX1276_INSTALLED
2 #include "iface_sx1276.h"
4 bool SX1276_Mode_LoRa=false;
6 void SX1276_WriteReg(uint8_t address, uint8_t data)
8         SPI_CSN_off;
9         SPI_Write(address | 0x80); // MSB 1 = write
10         NOP();
11         SPI_Write(data);
12         SPI_CSN_on;
15 uint8_t SX1276_ReadReg(uint8_t address)
16
17         SPI_CSN_off;
18         SPI_Write(address & 0x7F);
19         uint8_t result = SPI_Read();
20         SPI_CSN_on;
21         return result;
24 void SX1276_WriteRegisterMulti(uint8_t address, const uint8_t* data, uint8_t length)
26         SPI_CSN_off;
27         SPI_Write(address | 0x80); // MSB 1 = write
29         for(uint8_t i = 0; i < length; i++)
30                 SPI_Write(data[i]);
32         SPI_CSN_on;
35 void SX1276_ReadRegisterMulti(uint8_t address, uint8_t* data, uint8_t length)
36
37         SPI_CSN_off;
38         SPI_Write(address & 0x7F);
40         for(uint8_t i = 0; i < length; i++)
41                 data[i]=SPI_Read();
43         SPI_CSN_on;
46 uint8_t SX1276_Reset()
48         //TODO when pin is not wired
49         #ifdef SX1276_RST_pin
50                 SX1276_RST_off;
51                 delayMicroseconds(200);
52                 SX1276_RST_on;
53         #endif
54     return 0;
57 bool SX1276_DetectChip() //to be called after reset, verfies the chip has been detected
59         #define SX1276_Detect_MaxAttempts 5
60         uint8_t i = 0;
61         bool chipFound = false;
62         while ((i < SX1276_Detect_MaxAttempts) && !chipFound)
63         {
64                 uint8_t ChipVersion = SX1276_ReadReg(SX1276_42_VERSION);
65                 if (ChipVersion == 0x12)
66                 {
67                         debugln("SX1276 reg version=%d", ChipVersion);
68                         chipFound = true;
69                 }
70                 else
71                 {
72                         debug("SX1276 not found! attempts: %d", i);
73                         debug(" of ");
74                         debugln("%d SX1276 reg version=%d", SX1276_Detect_MaxAttempts, ChipVersion);
75                         i++;
76                 }
77         }
78         if (!chipFound)
79         {
80                 debugln("SX1276 not detected!!!");
81                 return false;
82         }
83         else
84         {
85                 debugln("Found SX1276 Device!");
86                 return true;
87         }
90 void SX1276_SetTxRxMode(uint8_t mode)
92         #ifdef SX1276_TXEN_pin
93                 if(mode == TX_EN)
94                         SX1276_TXEN_on;
95                 else
96                         SX1276_RXEN_on;
97         #endif
100 void SX1276_SetFrequency(uint32_t frequency)
102         uint32_t f = frequency / 61;
103         uint8_t data[3];
104         data[0] = f >> 16;
105         data[1] = f >> 8;
106         data[2] = f;
107         
108         SX1276_WriteRegisterMulti(SX1276_06_FRFMSB, data, 3);
111 void SX1276_SetMode(bool lora, bool low_freq_mode, uint8_t mode)
113         uint8_t data = 0x00;
115         SX1276_Mode_LoRa=lora;
117         if(lora)
118         {
119                 data = data | (1 << 7);
120                 data = data & ~(1 << 6);
121         }
122         else
123         {
124                 data = data & ~(1 << 7);
125                 data = data | (1 << 6);
126         }
128         if(low_freq_mode)
129                 data = data | (1 << 3);
130         
131         data = data | mode;
133         SX1276_WriteReg(SX1276_01_OPMODE, data);
136 void SX1276_SetDetectOptimize(bool auto_if, uint8_t detect_optimize)
138         uint8_t data = SX1276_ReadReg(SX1276_31_DETECTOPTIMIZE);
139         data = (data & 0b01111000) | detect_optimize;
140         data = data | (auto_if << 7);
142         SX1276_WriteReg(SX1276_31_DETECTOPTIMIZE, data);
145 void SX1276_ConfigModem1(uint8_t bandwidth, uint8_t coding_rate, bool implicit_header_mode)
147         uint8_t data = 0x00;
148         data = data | (bandwidth << 4);
149         data = data | (coding_rate << 1);
150         data = data | implicit_header_mode;
152         SX1276_WriteReg(SX1276_1D_MODEMCONFIG1, data);
154         if (bandwidth == SX1276_MODEM_CONFIG1_BW_500KHZ) //datasheet errata reconmendation http://caxapa.ru/thumbs/972894/SX1276_77_8_ErrataNote_1.1_STD.pdf
155         {
156                 SX1276_WriteReg(SX1276_36_LORA_REGHIGHBWOPTIMIZE1, 0x02);
157                 SX1276_WriteReg(SX1276_3A_LORA_REGHIGHBWOPTIMIZE2, 0x64);
158         }
159         else
160                 SX1276_WriteReg(SX1276_36_LORA_REGHIGHBWOPTIMIZE1, 0x03);
163 void SX1276_ConfigModem2(uint8_t spreading_factor, bool tx_continuous_mode, bool rx_payload_crc_on)
165         uint8_t data = SX1276_ReadReg(SX1276_1E_MODEMCONFIG2);
166         data = data & 0b11; // preserve the last 2 bits
167         data = data | (spreading_factor << 4);
168         data = data | (tx_continuous_mode << 3);
169         data = data | (rx_payload_crc_on << 2);
171         SX1276_WriteReg(SX1276_1E_MODEMCONFIG2, data);
174 void SX1276_ConfigModem3(bool low_data_rate_optimize, bool agc_auto_on)
176         uint8_t data = SX1276_ReadReg(SX1276_26_MODEMCONFIG3);
177         data = data & 0b11; // preserve the last 2 bits
178         data = data | (low_data_rate_optimize << 3);
179         data = data | (agc_auto_on << 2);
180         
181         SX1276_WriteReg(SX1276_26_MODEMCONFIG3, data);
184 void SX1276_SetPreambleLength(uint16_t length)
186         uint8_t data[2];
187         data[0] = (length >> 8) & 0xFF; // high byte
188         data[1] = length & 0xFF; // low byte
189         
190         SX1276_WriteRegisterMulti(SX1276_20_PREAMBLEMSB, data, 2);
193 void SX1276_SetDetectionThreshold(uint8_t threshold)
195         SX1276_WriteReg(SX1276_37_DETECTIONTHRESHOLD, threshold);
198 void SX1276_SetLna(uint8_t gain, bool high_freq_lna_boost)
200         uint8_t data = SX1276_ReadReg(SX1276_0C_LNA);
201         data = data & 0b100; // preserve the third bit
202         data = data | (gain << 5);
203         
204         if(high_freq_lna_boost)
205                 data = data | 0b11;
206         
207         SX1276_WriteReg(SX1276_0C_LNA, data);
210 void SX1276_SetHopPeriod(uint8_t freq_hop_period)
212         SX1276_WriteReg(SX1276_24_HOPPERIOD, freq_hop_period);
215 void SX1276_SetPaDac(bool on)
217         uint8_t data = SX1276_ReadReg(SX1276_4D_PADAC);
218         data = data & 0b11111000; // preserve the upper 5 bits
220         if(on)
221                 data = data | 0x07;
222         else
223                 data = data | 0x04;
224         
225         SX1276_WriteReg(SX1276_4D_PADAC, data);
228 void SX1276_SetPaConfig(bool pa_boost_pin, uint8_t max_power, uint8_t output_power)
230         uint8_t data = 0x00;
231         data = data | (pa_boost_pin << 7);
232         data = data | (max_power << 4);
233         data = data | (output_power & 0x0F);
235         SX1276_WriteReg(SX1276_09_PACONFIG, data);
238 void SX1276_SetOcp(bool OcpOn, uint8_t OcpTrim)
240         SX1276_WriteReg(SX1276_0B_OCP, (OcpOn << 5) | OcpTrim);
243 void SX1276_WritePayloadToFifo(uint8_t* payload, uint8_t length)
245         SX1276_WriteReg(SX1276_22_PAYLOAD_LENGTH, length);
246         SX1276_WriteReg(SX1276_0E_FIFOTXBASEADDR, 0x00);
247         SX1276_WriteReg(SX1276_0D_FIFOADDRPTR, 0x00);
248         SX1276_WriteRegisterMulti(SX1276_00_FIFO, payload, length);
251 #endif