diff options
author | David Barksdale <amatus@amat.us> | 2023-08-06 13:16:30 -0500 |
---|---|---|
committer | David Barksdale <amatus@amat.us> | 2023-08-06 13:16:30 -0500 |
commit | 2e584b8a27c7959b9f0ac1775db63dcc0aea1653 (patch) | |
tree | 11991d6c83fd087c60494d62d31943af383ddd69 /laser-tag software/radio.c | |
parent | 71a0463206a224c56225aeb74c16d112a9239cb0 (diff) |
Diffstat (limited to 'laser-tag software/radio.c')
-rw-r--r-- | laser-tag software/radio.c | 207 |
1 files changed, 0 insertions, 207 deletions
diff --git a/laser-tag software/radio.c b/laser-tag software/radio.c deleted file mode 100644 index c78ec76..0000000 --- a/laser-tag software/radio.c +++ /dev/null @@ -1,207 +0,0 @@ -#include "radio.h" -#include "fsl_debug_console.h" -#include "fsl_gpio_driver.h" -#include "fsl_spi_master_driver.h" -#include "RFM69registers.h" - -static const gpio_output_pin_user_config_t pinReset = { - .pinName = GPIO_MAKE_PIN(GPIOC_IDX, 8), - .config.outputLogic = 1, -}; - -static const gpio_input_pin_user_config_t pinDIO0 = { - .pinName = GPIO_MAKE_PIN(GPIOC_IDX, 9), -}; - -static const gpio_output_pin_user_config_t pinDIO2 = { - .pinName = GPIO_MAKE_PIN(GPIOC_IDX, 10), - .config.outputLogic = 0, -}; - -static const spi_master_user_config_t spiConfig = { - .bitsPerSec = 10000000, /* max is 10 MHz */ - .polarity = kSpiClockPolarity_ActiveHigh, - .phase = kSpiClockPhase_FirstEdge, - .direction = kSpiMsbFirst, - .bitCount = kSpi16BitMode, -}; - -static const struct { - uint8_t reg; - uint8_t val; -} config[] = { - { REG_OPMODE, RF_OPMODE_SEQUENCER_ON - | RF_OPMODE_LISTEN_OFF - | RF_OPMODE_STANDBY }, - { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET - | RF_DATAMODUL_MODULATIONTYPE_FSK - | RF_DATAMODUL_MODULATIONSHAPING_00 }, // no shaping - { REG_BITRATEMSB, RF_BITRATEMSB_55555 }, // 55,555 bps - { REG_BITRATELSB, RF_BITRATELSB_55555 }, - { REG_FDEVMSB, RF_FDEVMSB_50000 }, // default: 5KHz, - { REG_FDEVLSB, RF_FDEVLSB_50000 }, // (FDEV + BitRate / 2 <= 500KHz) - { REG_FRFMSB, RF_FRFMSB_915 }, - { REG_FRFMID, RF_FRFMID_915 }, - { REG_FRFLSB, RF_FRFLSB_915 }, - // looks like PA1 and PA2 are not implemented on RFM69W, - // hence the max output power is 13dBm - // +17dBm and +20dBm are possible on RFM69HW - // +13dBm formula: Pout = -18 + OutputPower (with PA0 or PA1**) - // +17dBm formula: Pout = -14 + OutputPower (with PA1 and PA2)** - // +20dBm formula: Pout = -11 + OutputPower (with PA1 and PA2)** and high - // power PA settings (section 3.3.7 in datasheet) - { REG_PALEVEL, RF_PALEVEL_PA0_OFF - | RF_PALEVEL_PA1_ON - | RF_PALEVEL_PA2_ON - | RF_PALEVEL_OUTPUTPOWER_11111 }, - { REG_TESTPA1, 0x5D }, - { REG_TESTPA2, 0x7C }, - { REG_OCP, RF_OCP_OFF }, // over current protection - // RXBW defaults are RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5 - // (RxBw: 10.4KHz) - //for BR-19200: RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_3 - // (BitRate < 2 * RxBw) - { REG_RXBW, RF_RXBW_DCCFREQ_010 - | RF_RXBW_MANT_16 - | RF_RXBW_EXP_2 }, - // DIO0 is the only IRQ we're using - { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, - // DIO5 ClkOut disable for power saving - { REG_DIOMAPPING2, RF_DIOMAPPING2_CLKOUT_OFF }, - // writing to this bit ensures that the FIFO & status flags are reset - { REG_IRQFLAGS2, RF_IRQFLAGS2_FIFOOVERRUN }, - // must be set to dBm = (-Sensitivity / 2), default is 0xE4 = 228 so -114dBm - { REG_RSSITHRESH, 220 }, - // default 3 preamble bytes 0xAAAAAA - //{ REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } - { REG_SYNCCONFIG, RF_SYNC_ON - | RF_SYNC_FIFOFILL_AUTO - | RF_SYNC_SIZE_2 - | RF_SYNC_TOL_0 }, - // attempt to make this compatible with sync1 byte of RFM12B lib - { REG_SYNCVALUE1, 0x2D }, - { REG_SYNCVALUE2, 0x01 }, // NETWORK ID (1 = users, 2 = uber) - { REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE - | RF_PACKET1_DCFREE_OFF - | RF_PACKET1_CRC_ON - | RF_PACKET1_CRCAUTOCLEAR_ON - | RF_PACKET1_ADRSFILTERING_OFF }, - // in variable length mode: the max frame size, not used in TX - { REG_PAYLOADLENGTH, 66 }, - // turned off because we're not using address filtering - //{ REG_NODEADRS, nodeID }, - { REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY - | RF_FIFOTHRESH_VALUE }, // TX on FIFO not empty - // RXRESTARTDELAY must match transmitter PA ramp-down time - // (bitrate dependent) - //for BR-19200: RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON - //| RF_PACKET2_AES_OFF - { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS - | RF_PACKET2_AUTORXRESTART_ON - | RF_PACKET2_AES_OFF }, - // run DAGC continuously in RX mode for Fading Margin Improvement, - // recommended default for AfcLowBetaOn=0 - { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 }, -}; - -static spi_master_state_t spiState; - -static void delay(uint32_t ms) -{ - for (; ms > 0; --ms) { - /* XXX This is really stupid */ - volatile int i; - for (i = 0; i < 306 * 12; ++i); - } -} - -static spi_status_t SPI_Transfer(const uint8_t *tx, uint8_t *rx, size_t count) -{ - spi_status_t rc; - - rc = SPI_DRV_MasterTransfer(0, NULL, tx, rx, count); - if (rc != kStatus_SPI_Success) { - return rc; - } - int i, timeout = count * 2; - for (i = 0; i < timeout; ++i) { - rc = SPI_DRV_MasterGetTransferStatus(0, NULL); - if (rc == kStatus_SPI_Success) { - return rc; - } - } - return rc; -} - -static uint8_t read_reg(uint8_t reg) -{ - uint8_t tx[2] = { 0, reg & 0x7f }; - uint8_t rx[2] = { 0, 0 }; - - SPI_Transfer(tx, rx, 2); - return rx[0]; -} - -static void write_reg(uint8_t reg, uint8_t val) -{ - uint8_t tx[2] = { val, reg | 0x80 }; - - SPI_Transfer(tx, NULL, 2); -} - -int radio_init() -{ - PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 4, kPortMuxAlt2); - PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 5, kPortMuxAlt2); - PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 6, kPortMuxAlt2); - PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 7, kPortMuxAlt2); - PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 8, kPortMuxAsGpio); - //PORT_HAL_SetMuxMode(g_portBase[GPIOC_IDX], 10, kPortMuxAsGpio); - GPIO_DRV_OutputPinInit(&pinReset); - //GPIO_DRV_OutputPinInit(&pinDIO2); - delay(1); - GPIO_DRV_WritePinOutput(pinReset.pinName, 0); - delay(5); - - /* Configure SPI0 */ - SPI_DRV_MasterInit(0, &spiState); - uint32_t calculatedBaudRate; - SPI_DRV_MasterConfigureBus(0, &spiConfig, &calculatedBaudRate); - debug_printf("radio baud rate %u Hz\r\n", calculatedBaudRate); - - /* Use REG_SYNCVALUE1 to test that the radio is there */ - write_reg(REG_SYNCVALUE1, 0x55); - uint8_t reg = read_reg(REG_SYNCVALUE1); - if (reg != 0x55) { - return -1; - } - - /* Setup a bunch of config registers */ - uint32_t i; - for (i = 0; i < sizeof config / sizeof *config; ++i) { - write_reg(config[i].reg, config[i].val); - } - return 0; -} - -void set_mode(uint8_t mode) -{ - uint8_t reg = read_reg(REG_OPMODE); - - write_reg(REG_OPMODE, (reg & 0xE3) | mode); -} - -void radio_test(void) -{ - //write_reg(REG_DATAMODUL, RF_DATAMODUL_DATAMODE_CONTINUOUSNOBSYNC); - set_mode(RF_OPMODE_TRANSMITTER); - /* - bool a = false; - while (true) { - GPIO_DRV_WritePinOutput(pinDIO2.pinName, a); - a = !a; - delay(100); - }*/ -} - -/* vim: set expandtab ts=4 sw=4: */ |