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);
|
|||
|
}
|