May 2021 Commit

Dependencies:   sx128x sx12xx_hal

Committer:
Wayne Roberts
Date:
Wed Jul 18 18:52:35 2018 -0700
Revision:
7:ccb3088ce5be
Parent:
6:59ba1113b3c6
Child:
8:efd5ceb87878
use sx12xx_hal

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wayne Roberts 7:ccb3088ce5be 1 //#include "user_platform.h"
Wayne Roberts 7:ccb3088ce5be 2 #include "radio.h"
Wayne Roberts 7:ccb3088ce5be 3
Wayne Roberts 7:ccb3088ce5be 4 #if defined(SX127x_H) || defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 5 #define BW_KHZ 500
Wayne Roberts 7:ccb3088ce5be 6 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 7 #define CF_HZ 910800000
Wayne Roberts 7:ccb3088ce5be 8 #if defined(SX126x_H)
Wayne Roberts 7:ccb3088ce5be 9 #define TX_DBM (Radio::chipType == CHIP_TYPE_SX1262 ? 20 : 14)
Wayne Roberts 7:ccb3088ce5be 10 #else
Wayne Roberts 7:ccb3088ce5be 11 #define TX_DBM 17
Wayne Roberts 7:ccb3088ce5be 12 #endif
Wayne Roberts 7:ccb3088ce5be 13 #elif defined(SX128x_H)
Wayne Roberts 7:ccb3088ce5be 14 #define BW_KHZ 200
Wayne Roberts 7:ccb3088ce5be 15 #define SPREADING_FACTOR 11
Wayne Roberts 7:ccb3088ce5be 16 #define CF_HZ 2487000000
Wayne Roberts 7:ccb3088ce5be 17
Wayne Roberts 7:ccb3088ce5be 18 #define TX_DBM 5
Wayne Roberts 7:ccb3088ce5be 19 #endif
Wayne Roberts 7:ccb3088ce5be 20
Wayne Roberts 7:ccb3088ce5be 21 #ifdef TARGET_DISCO_L072CZ_LRWAN1
Wayne Roberts 7:ccb3088ce5be 22 DigitalIn pinA(PB_12);
Wayne Roberts 7:ccb3088ce5be 23 DigitalIn pinB(PB_13);
Wayne Roberts 7:ccb3088ce5be 24 DigitalIn pinC(PB_14);
Wayne Roberts 7:ccb3088ce5be 25 DigitalIn pinD(PB_15);
Wayne Roberts 7:ccb3088ce5be 26 #elif defined(TARGET_FF_MORPHO)
Wayne Roberts 7:ccb3088ce5be 27 DigitalIn pinA(PC_3);
Wayne Roberts 7:ccb3088ce5be 28 DigitalIn pinB(PC_2);
Wayne Roberts 7:ccb3088ce5be 29 DigitalIn pinC(PC_6);
Wayne Roberts 7:ccb3088ce5be 30 DigitalIn pinD(PC_8);
Wayne Roberts 7:ccb3088ce5be 31 #endif
Wayne Roberts 7:ccb3088ce5be 32
Wayne Roberts 7:ccb3088ce5be 33 volatile struct _f_ {
Wayne Roberts 7:ccb3088ce5be 34 uint8_t enable_pin_A : 1;
Wayne Roberts 7:ccb3088ce5be 35 uint8_t enable_pin_B : 1;
Wayne Roberts 7:ccb3088ce5be 36 uint8_t enable_pin_C : 1;
Wayne Roberts 7:ccb3088ce5be 37 uint8_t enable_pin_D : 1;
Wayne Roberts 7:ccb3088ce5be 38 } flags;
dudmuck 0:cb38da4f4b04 39
dudmuck 0:cb38da4f4b04 40 Timer t;
dudmuck 3:d8b57eca8c45 41 #define CMD_PINA 0x02
dudmuck 3:d8b57eca8c45 42 #define CMD_PINB 0x03
dudmuck 3:d8b57eca8c45 43 #define CMD_PINC 0x06
dudmuck 3:d8b57eca8c45 44 #define CMD_PIND 0x08
dudmuck 0:cb38da4f4b04 45
Wayne Roberts 7:ccb3088ce5be 46 volatile bool tx_done;
Wayne Roberts 7:ccb3088ce5be 47
dudmuck 0:cb38da4f4b04 48 static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
dudmuck 0:cb38da4f4b04 49 {
dudmuck 0:cb38da4f4b04 50 // The CRC calculation follows CCITT
dudmuck 0:cb38da4f4b04 51 const uint16_t polynom = 0x1021;
dudmuck 0:cb38da4f4b04 52 // CRC initial value
dudmuck 0:cb38da4f4b04 53 uint16_t crc = 0x0000;
dudmuck 0:cb38da4f4b04 54
dudmuck 0:cb38da4f4b04 55 if( buffer == NULL )
dudmuck 0:cb38da4f4b04 56 {
dudmuck 0:cb38da4f4b04 57 return 0;
dudmuck 0:cb38da4f4b04 58 }
dudmuck 0:cb38da4f4b04 59
dudmuck 0:cb38da4f4b04 60 for( uint16_t i = 0; i < length; ++i )
dudmuck 0:cb38da4f4b04 61 {
dudmuck 0:cb38da4f4b04 62 crc ^= ( uint16_t ) buffer[i] << 8;
dudmuck 0:cb38da4f4b04 63 for( uint16_t j = 0; j < 8; ++j )
dudmuck 0:cb38da4f4b04 64 {
dudmuck 0:cb38da4f4b04 65 crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
dudmuck 0:cb38da4f4b04 66 }
dudmuck 0:cb38da4f4b04 67 }
dudmuck 0:cb38da4f4b04 68
dudmuck 0:cb38da4f4b04 69 return crc;
dudmuck 0:cb38da4f4b04 70 }
dudmuck 0:cb38da4f4b04 71
dudmuck 1:3199506bc2e5 72 void transmit(unsigned target, uint8_t cmd)
dudmuck 0:cb38da4f4b04 73 {
dudmuck 0:cb38da4f4b04 74 unsigned t_diff;
dudmuck 0:cb38da4f4b04 75 uint16_t crc;
dudmuck 0:cb38da4f4b04 76
Wayne Roberts 7:ccb3088ce5be 77 Radio::radio.tx_buf[0] = cmd;
dudmuck 0:cb38da4f4b04 78 t_diff = target - t.read_us();
Wayne Roberts 7:ccb3088ce5be 79 Radio::radio.tx_buf[1] = t_diff >> 24;
Wayne Roberts 7:ccb3088ce5be 80 Radio::radio.tx_buf[2] = t_diff >> 16;
Wayne Roberts 7:ccb3088ce5be 81 Radio::radio.tx_buf[3] = t_diff >> 8;
Wayne Roberts 7:ccb3088ce5be 82 Radio::radio.tx_buf[4] = t_diff & 0xff;
Wayne Roberts 7:ccb3088ce5be 83 crc = crc_ccitt(Radio::radio.tx_buf, 5);
Wayne Roberts 7:ccb3088ce5be 84 Radio::radio.tx_buf[5] = crc >> 8;
Wayne Roberts 7:ccb3088ce5be 85 Radio::radio.tx_buf[6] = crc & 0xff;
dudmuck 0:cb38da4f4b04 86
Wayne Roberts 7:ccb3088ce5be 87 Radio::Send(7, 0, 0, 0);
dudmuck 0:cb38da4f4b04 88
Wayne Roberts 7:ccb3088ce5be 89 for (tx_done = false; !tx_done; )
Wayne Roberts 7:ccb3088ce5be 90 Radio::service();
dudmuck 0:cb38da4f4b04 91
dudmuck 0:cb38da4f4b04 92 printf("t_diff:%u crc:%04x\r\n", t_diff, crc);
dudmuck 0:cb38da4f4b04 93 }
dudmuck 0:cb38da4f4b04 94
dudmuck 0:cb38da4f4b04 95 #define TARGET_LATENCY 2000000
dudmuck 1:3199506bc2e5 96 void send_alarm(uint8_t cmd)
dudmuck 0:cb38da4f4b04 97 {
dudmuck 0:cb38da4f4b04 98 int i;
dudmuck 0:cb38da4f4b04 99 unsigned target = t.read_us() + TARGET_LATENCY;
dudmuck 0:cb38da4f4b04 100 printf("send_alarm() %u\n", target);
dudmuck 0:cb38da4f4b04 101
dudmuck 1:3199506bc2e5 102 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 103 transmit(target, cmd);
dudmuck 0:cb38da4f4b04 104 wait(0.1);
dudmuck 0:cb38da4f4b04 105 }
dudmuck 0:cb38da4f4b04 106 }
dudmuck 1:3199506bc2e5 107
dudmuck 1:3199506bc2e5 108 void debounce(DigitalIn* pin, uint8_t cmd)
dudmuck 1:3199506bc2e5 109 {
dudmuck 1:3199506bc2e5 110 if (!pin->read()) {
dudmuck 1:3199506bc2e5 111 int i;
dudmuck 1:3199506bc2e5 112 for (i = 0; i < 5; i++) {
dudmuck 1:3199506bc2e5 113 wait(0.01);
dudmuck 1:3199506bc2e5 114 if (pin->read()) {
dudmuck 1:3199506bc2e5 115 printf("trans\r\n");
dudmuck 1:3199506bc2e5 116 break;
dudmuck 1:3199506bc2e5 117 }
dudmuck 1:3199506bc2e5 118 }
dudmuck 1:3199506bc2e5 119 if (i == 5)
dudmuck 1:3199506bc2e5 120 send_alarm(cmd);
dudmuck 1:3199506bc2e5 121
dudmuck 1:3199506bc2e5 122 while (!pin->read())
dudmuck 1:3199506bc2e5 123 ;
dudmuck 1:3199506bc2e5 124 }
dudmuck 1:3199506bc2e5 125 }
dudmuck 2:0b7620bda2c9 126
Wayne Roberts 7:ccb3088ce5be 127 void txDoneCB()
Wayne Roberts 7:ccb3088ce5be 128 {
Wayne Roberts 7:ccb3088ce5be 129 tx_done = true;
Wayne Roberts 7:ccb3088ce5be 130 }
Wayne Roberts 7:ccb3088ce5be 131
Wayne Roberts 7:ccb3088ce5be 132 void rxDoneCB(uint8_t size, float Rssi, float Snr)
dudmuck 4:19056d9707ef 133 {
dudmuck 4:19056d9707ef 134 }
dudmuck 4:19056d9707ef 135
Wayne Roberts 7:ccb3088ce5be 136 const RadioEvents_t rev = {
Wayne Roberts 7:ccb3088ce5be 137 /* Dio0_top_half */ NULL,
Wayne Roberts 7:ccb3088ce5be 138 /* TxDone_topHalf */ NULL,
Wayne Roberts 7:ccb3088ce5be 139 /* TxDone_botHalf */ txDoneCB,
Wayne Roberts 7:ccb3088ce5be 140 /* TxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 141 /* RxDone */ rxDoneCB,
Wayne Roberts 7:ccb3088ce5be 142 /* RxTimeout */ NULL,
Wayne Roberts 7:ccb3088ce5be 143 /* RxError */ NULL,
Wayne Roberts 7:ccb3088ce5be 144 /* FhssChangeChannel */NULL,
Wayne Roberts 7:ccb3088ce5be 145 /* CadDone */ NULL
Wayne Roberts 7:ccb3088ce5be 146 };
Wayne Roberts 7:ccb3088ce5be 147
dudmuck 0:cb38da4f4b04 148 int main()
dudmuck 0:cb38da4f4b04 149 {
dudmuck 0:cb38da4f4b04 150 printf("\r\nreset-tx\r\n");
dudmuck 1:3199506bc2e5 151
dudmuck 3:d8b57eca8c45 152 pinA.mode(PullUp);
dudmuck 3:d8b57eca8c45 153 pinB.mode(PullUp);
dudmuck 3:d8b57eca8c45 154 pinC.mode(PullUp);
dudmuck 3:d8b57eca8c45 155 pinD.mode(PullUp);
dudmuck 1:3199506bc2e5 156
Wayne Roberts 7:ccb3088ce5be 157 wait(0.05);
Wayne Roberts 7:ccb3088ce5be 158
Wayne Roberts 7:ccb3088ce5be 159 if (pinA.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 160 printf("pinA-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 161 flags.enable_pin_A = 0;
Wayne Roberts 7:ccb3088ce5be 162 } else
Wayne Roberts 7:ccb3088ce5be 163 flags.enable_pin_A = 1;
Wayne Roberts 7:ccb3088ce5be 164
Wayne Roberts 7:ccb3088ce5be 165 if (pinB.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 166 printf("pinB-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 167 flags.enable_pin_B = 0;
Wayne Roberts 7:ccb3088ce5be 168 } else
Wayne Roberts 7:ccb3088ce5be 169 flags.enable_pin_B = 1;
Wayne Roberts 7:ccb3088ce5be 170
Wayne Roberts 7:ccb3088ce5be 171 if (pinC.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 172 printf("pinC-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 173 flags.enable_pin_C = 0;
Wayne Roberts 7:ccb3088ce5be 174 } else
Wayne Roberts 7:ccb3088ce5be 175 flags.enable_pin_C = 1;
Wayne Roberts 7:ccb3088ce5be 176
Wayne Roberts 7:ccb3088ce5be 177 if (pinD.read() == 0) {
Wayne Roberts 7:ccb3088ce5be 178 printf("pinD-disabled\r\n");
Wayne Roberts 7:ccb3088ce5be 179 flags.enable_pin_D = 0;
Wayne Roberts 7:ccb3088ce5be 180 } else
Wayne Roberts 7:ccb3088ce5be 181 flags.enable_pin_D = 1;
Wayne Roberts 7:ccb3088ce5be 182
Wayne Roberts 7:ccb3088ce5be 183 t.start();
Wayne Roberts 7:ccb3088ce5be 184
Wayne Roberts 7:ccb3088ce5be 185 Radio::Init(&rev);
Wayne Roberts 7:ccb3088ce5be 186
Wayne Roberts 7:ccb3088ce5be 187 Radio::Standby();
Wayne Roberts 7:ccb3088ce5be 188 Radio::LoRaModemConfig(BW_KHZ, SPREADING_FACTOR, 1);
Wayne Roberts 7:ccb3088ce5be 189 Radio::LoRaPacketConfig(8, false, true, false); // preambleLen, fixLen, crcOn, invIQ
Wayne Roberts 7:ccb3088ce5be 190 Radio::SetChannel(CF_HZ);
Wayne Roberts 7:ccb3088ce5be 191
Wayne Roberts 7:ccb3088ce5be 192 Radio::set_tx_dbm(TX_DBM);
dudmuck 0:cb38da4f4b04 193
dudmuck 0:cb38da4f4b04 194 for (;;) {
Wayne Roberts 7:ccb3088ce5be 195 if (flags.enable_pin_A)
Wayne Roberts 7:ccb3088ce5be 196 debounce(&pinA, CMD_PINA);
Wayne Roberts 7:ccb3088ce5be 197
Wayne Roberts 7:ccb3088ce5be 198 if (flags.enable_pin_B)
Wayne Roberts 7:ccb3088ce5be 199 debounce(&pinB, CMD_PINB);
Wayne Roberts 7:ccb3088ce5be 200
Wayne Roberts 7:ccb3088ce5be 201 if (flags.enable_pin_C)
Wayne Roberts 7:ccb3088ce5be 202 debounce(&pinC, CMD_PINC);
Wayne Roberts 7:ccb3088ce5be 203
Wayne Roberts 7:ccb3088ce5be 204 if (flags.enable_pin_D)
Wayne Roberts 7:ccb3088ce5be 205 debounce(&pinD, CMD_PIND);
dudmuck 0:cb38da4f4b04 206 } // ..for (;;)
dudmuck 0:cb38da4f4b04 207 }