227 lines
6.7 KiB
C
227 lines
6.7 KiB
C
#include "../Inc/sx1278.h"
|
||
|
||
// Объект для работы с SX1278
|
||
SX1278_t sx1278;
|
||
|
||
|
||
// Функция инициализации SX1278
|
||
int SX1278_Init(uint8_t PinNss, uint8_t PinReset, uint8_t PinDIO0) {
|
||
|
||
|
||
sx1278.PinNSS = PinNss;
|
||
sx1278.PinReset = PinReset;
|
||
sx1278.PinDIO0 = PinDIO0;
|
||
|
||
// Инициализация WiringPi
|
||
if (wiringPiSetup() == -1) {
|
||
printf("Ошибка инициализации WiringPi\n");
|
||
return -1;
|
||
}
|
||
|
||
// Инициализация SPI
|
||
if (wiringPiSPISetup(0, 500000) == -1) {
|
||
printf("Ошибка инициализации SPI\n");
|
||
return -1;
|
||
}
|
||
|
||
/*SETUP GPIO Begin*/
|
||
|
||
// Инициализация GPIO
|
||
if (wiringPiSetupGpio() == -1) {
|
||
printf("Ошибка инициализации GPIO\n");
|
||
return -1;
|
||
}
|
||
pinMode(PinNss, OUTPUT);
|
||
pinMode(PinReset, OUTPUT);
|
||
pinMode(PinDIO0, INPUT);
|
||
|
||
/*SETUP GPIO End*/
|
||
|
||
SX1278_reset();
|
||
|
||
// Проверка связи с модулем (чтение и проверка регистра версии)
|
||
uint8_t version = SX1278_ReadRegister(REG_VERSION);
|
||
|
||
if (version != EXPECTED_VERSION) {
|
||
printf("Неверная версия модуля: 0x%x\n", version);
|
||
return -1;
|
||
}
|
||
|
||
return 0;
|
||
}
|
||
|
||
|
||
void SX1278_FIFO_SendData(uint8_t *data) {
|
||
uint8_t SendData[SX1278_PAYLOAD + 1] = {REG_FIFO | 0x80};
|
||
memcpy(&SendData[1], data, SX1278_PAYLOAD);
|
||
wiringPiSPIDataRW(0, SendData, SX1278_PAYLOAD + 1);
|
||
}
|
||
|
||
|
||
void SX1278_FIFO_ReadData(uint8_t *data) {
|
||
uint8_t buffer[SX1278_PAYLOAD + 1] = {REG_FIFO & 0x7F};
|
||
wiringPiSPIDataRW(0, buffer, SX1278_PAYLOAD + 1);
|
||
memcpy(data, &buffer[1], SX1278_PAYLOAD);
|
||
}
|
||
|
||
// Функция для записи в регистр
|
||
void SX1278_WriteRegister(uint8_t reg, uint8_t value) {
|
||
#ifdef DEBUG
|
||
uint8_t read_reg;
|
||
read_reg = SX1278_ReadRegister(reg);
|
||
printf("(WriteRegister) REG: 0x%02X OLD: 0x%02X", reg, read_reg);
|
||
#endif
|
||
|
||
|
||
uint8_t buffer[2] = { reg | 0x80, value };
|
||
wiringPiSPIDataRW(0, buffer, 2);
|
||
|
||
#ifdef DEBUG
|
||
read_reg = SX1278_ReadRegister(reg);
|
||
printf(" | NEW: 0x%02X\n", read_reg);
|
||
#endif
|
||
|
||
|
||
}
|
||
|
||
// Функция для чтения из регистра
|
||
uint8_t SX1278_ReadRegister(uint8_t reg) {
|
||
uint8_t buffer[2] = { reg & 0x7F, 0x00 };
|
||
wiringPiSPIDataRW(0, buffer, 2);
|
||
return buffer[1];
|
||
}
|
||
|
||
/* Аппаратная перезагрузка SX1278 */
|
||
void SX1278_reset(){
|
||
digitalWrite(sx1278.PinNSS, 1);
|
||
digitalWrite(sx1278.PinReset, 0);
|
||
delay(100);
|
||
digitalWrite(sx1278.PinReset, 1);
|
||
delay(100);
|
||
|
||
}
|
||
|
||
// Функция установки режима работы SX1278
|
||
void SX1278_SetMode(SX1278_Mode mode) {
|
||
uint16_t regValue = RF_OPMODE_LONGRANGEMODE_OFF | RF_OPMODE_MODULATIONTYPE_FSK;
|
||
|
||
switch (mode) {
|
||
case SX1278_MODE_SLEEP:
|
||
regValue |= RF_OPMODE_MODULATIONSHAPING_01 | RF_OPMODE_SLEEP;
|
||
break;
|
||
case SX1278_MODE_STANDBY:
|
||
regValue |= RF_OPMODE_MODULATIONSHAPING_01 | RF_OPMODE_STANDBY;
|
||
break;
|
||
case SX1278_MODE_RECEIVER:
|
||
regValue |= RF_OPMODE_MODULATIONSHAPING_01 | RF_OPMODE_RECEIVER;
|
||
break;
|
||
case SX1278_MODE_TRANSMITTER:
|
||
regValue |= RF_OPMODE_MODULATIONSHAPING_00 | RF_OPMODE_TRANSMITTER;
|
||
break;
|
||
default:
|
||
printf("Unknown mode!\n");
|
||
return;
|
||
}
|
||
|
||
SX1278_WriteRegister(REG_OPMODE, regValue);
|
||
}
|
||
|
||
|
||
/* Функция инициализации SX1278 */
|
||
void SX1278_load(){
|
||
|
||
/* Hardware init */
|
||
SX1278_reset();
|
||
|
||
/* FSK_Mode_sleep */
|
||
SX1278_SetMode(SX1278_MODE_SLEEP);
|
||
|
||
/* Bitrate with precision 19199.76 Kkbps */
|
||
SX1278_WriteRegister(REG_BITRATEMSB, 0x06);
|
||
SX1278_WriteRegister(REG_BITRATELSB, 0x82);
|
||
SX1278_WriteRegister(REG_BITRATEFRAC, 11);
|
||
|
||
/* Deviation */
|
||
SX1278_WriteRegister(REG_FDEVMSB, RF_FDEVMSB_45000_HZ);
|
||
SX1278_WriteRegister(REG_FDEVLSB, RF_FDEVLSB_45000_HZ);
|
||
|
||
/* Frequency */
|
||
SX1278_WriteRegister(REG_FRFMSB, RFLR_FRFMSB_434_MHZ);
|
||
SX1278_WriteRegister(REG_FRFMID, RFLR_FRFMID_434_MHZ);
|
||
SX1278_WriteRegister(REG_FRFLSB, RFLR_FRFLSB_434_MHZ);
|
||
|
||
/* Gain_LNA */
|
||
SX1278_WriteRegister(REG_LNA, RF_LNA_GAIN_G6|RF_LNA_BOOST_ON);
|
||
|
||
/* Intit reciver, Auto Freq on, LNA on, Preamble detect on */
|
||
SX1278_WriteRegister(REG_RXCONFIG, RF_RXCONFIG_RESTARTRXONCOLLISION_OFF |
|
||
RF_RXCONFIG_AFCAUTO_OFF |
|
||
RF_RXCONFIG_AGCAUTO_OFF |
|
||
RF_RXCONFIG_RXTRIGER_PREAMBLEDETECT);
|
||
|
||
/* Intit samplinng RSSI */
|
||
SX1278_WriteRegister(REG_RSSICONFIG, RF_RSSICONFIG_SMOOTHING_256);
|
||
|
||
/* Init power transmiter (revise) */
|
||
SX1278_WriteRegister(REG_PACONFIG,0xF0);
|
||
|
||
/* RampFSK 500micro + gaussian (Rise/Fall time of ramp up/down in FSK, Gaussian filter BT = 1.0) */
|
||
SX1278_WriteRegister(REG_PARAMP, RF_PARAMP_1000_US |RF_PARAMP_MODULATIONSHAPING_00);
|
||
|
||
/* Bandwidth */
|
||
SX1278_WriteRegister(REG_RXBW, RF_RXBW_MANT_20 | RF_RXBW_EXP_2);
|
||
|
||
/* INIT AFC */
|
||
SX1278_WriteRegister(REG_AFCFEI, RF_AFCFEI_AFCAUTOCLEAR_ON |
|
||
RF_AFCFEI_AFCCLEAR |
|
||
RF_AFCFEI_AGCSTART);
|
||
|
||
|
||
/* Preamle detect on, 3bytes, number mistakes */
|
||
SX1278_WriteRegister(REG_PREAMBLEDETECT, RF_PREAMBLEDETECT_DETECTOR_ON |
|
||
RF_PREAMBLEDETECT_DETECTORSIZE_3 |
|
||
RF_PREAMBLEDETECT_DETECTORTOL_30);
|
||
|
||
/* Init Sync Word */
|
||
SX1278_WriteRegister(REG_SYNCCONFIG, RF_SYNCCONFIG_AUTORESTARTRXMODE_WAITPLL_OFF |
|
||
RF_SYNCCONFIG_PREAMBLEPOLARITY_55 |
|
||
RF_SYNCCONFIG_SYNCSIZE_4 |
|
||
RF_SYNCCONFIG_SYNC_ON);
|
||
|
||
/* Init size preamble */
|
||
SX1278_WriteRegister(REG_PREAMBLEMSB, 0x00);
|
||
SX1278_WriteRegister(REG_PREAMBLELSB, 0x03);
|
||
|
||
/* Init sync word */
|
||
SX1278_WriteRegister(REG_SYNCVALUE1, 0x01);
|
||
SX1278_WriteRegister(REG_SYNCVALUE2, 0x01);
|
||
SX1278_WriteRegister(REG_SYNCVALUE3, 0x01);
|
||
SX1278_WriteRegister(REG_SYNCVALUE4, 0x01);
|
||
|
||
/* Fixed length packet,CRC on, */
|
||
SX1278_WriteRegister(REG_PACKETCONFIG1, RF_PACKETCONFIG1_PACKETFORMAT_FIXED |
|
||
RF_PACKETCONFIG1_DCFREE_OFF |
|
||
RF_PACKETCONFIG1_CRC_ON |
|
||
RF_PACKETCONFIG1_CRCAUTOCLEAR_ON |
|
||
RF_PACKETCONFIG1_ADDRSFILTERING_OFF |
|
||
RF_PACKETCONFIG1_CRCWHITENINGTYPE_CCITT);
|
||
|
||
/* Packet mode on */
|
||
SX1278_WriteRegister(REG_PACKETCONFIG2, RF_PACKETCONFIG2_DATAMODE_PACKET );
|
||
|
||
|
||
/* Transmit current overload current */
|
||
SX1278_WriteRegister(REG_OCP, RF_OCP_ON| RF_OCP_TRIM_200_MA );
|
||
|
||
/* Length payload */
|
||
SX1278_WriteRegister(REG_PAYLOADLENGTH, SX1278_PAYLOAD);
|
||
|
||
/* GPIO - DIO_0 - DIO5, config */
|
||
SX1278_WriteRegister(REG_DIOMAPPING1, 0x00);
|
||
SX1278_WriteRegister(REG_DIOMAPPING2, 0x00);
|
||
|
||
/* FIFO Interrupt */
|
||
SX1278_WriteRegister(REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTARTCONDITION_FIFOTHRESH | (SX1278_PAYLOAD-1));
|
||
SX1278_WriteRegister(REG_SEQCONFIG1, RF_SEQCONFIG1_FROMTX_TORX);
|
||
}
|