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