May 2021 Commit
Dependencies: sx128x sx12xx_hal
main.cpp@6:59ba1113b3c6, 2018-02-12 (annotated)
- Committer:
- Wayne Roberts
- Date:
- Mon Feb 12 17:23:14 2018 -0800
- Revision:
- 6:59ba1113b3c6
- Parent:
- 5:1652e04809fb
- Child:
- 7:ccb3088ce5be
MOTE_L152RC set pd2 high
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Wayne Roberts |
6:59ba1113b3c6 | 1 | #include "user_platform.h" |
dudmuck | 0:cb38da4f4b04 | 2 | |
dudmuck | 3:d8b57eca8c45 | 3 | SX127x_lora lora(radio); |
dudmuck | 0:cb38da4f4b04 | 4 | Timer t; |
dudmuck | 3:d8b57eca8c45 | 5 | #define CMD_PINA 0x02 |
dudmuck | 3:d8b57eca8c45 | 6 | #define CMD_PINB 0x03 |
dudmuck | 3:d8b57eca8c45 | 7 | #define CMD_PINC 0x06 |
dudmuck | 3:d8b57eca8c45 | 8 | #define CMD_PIND 0x08 |
dudmuck | 0:cb38da4f4b04 | 9 | |
dudmuck | 0:cb38da4f4b04 | 10 | static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length ) |
dudmuck | 0:cb38da4f4b04 | 11 | { |
dudmuck | 0:cb38da4f4b04 | 12 | // The CRC calculation follows CCITT |
dudmuck | 0:cb38da4f4b04 | 13 | const uint16_t polynom = 0x1021; |
dudmuck | 0:cb38da4f4b04 | 14 | // CRC initial value |
dudmuck | 0:cb38da4f4b04 | 15 | uint16_t crc = 0x0000; |
dudmuck | 0:cb38da4f4b04 | 16 | |
dudmuck | 0:cb38da4f4b04 | 17 | if( buffer == NULL ) |
dudmuck | 0:cb38da4f4b04 | 18 | { |
dudmuck | 0:cb38da4f4b04 | 19 | return 0; |
dudmuck | 0:cb38da4f4b04 | 20 | } |
dudmuck | 0:cb38da4f4b04 | 21 | |
dudmuck | 0:cb38da4f4b04 | 22 | for( uint16_t i = 0; i < length; ++i ) |
dudmuck | 0:cb38da4f4b04 | 23 | { |
dudmuck | 0:cb38da4f4b04 | 24 | crc ^= ( uint16_t ) buffer[i] << 8; |
dudmuck | 0:cb38da4f4b04 | 25 | for( uint16_t j = 0; j < 8; ++j ) |
dudmuck | 0:cb38da4f4b04 | 26 | { |
dudmuck | 0:cb38da4f4b04 | 27 | crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 ); |
dudmuck | 0:cb38da4f4b04 | 28 | } |
dudmuck | 0:cb38da4f4b04 | 29 | } |
dudmuck | 0:cb38da4f4b04 | 30 | |
dudmuck | 0:cb38da4f4b04 | 31 | return crc; |
dudmuck | 0:cb38da4f4b04 | 32 | } |
dudmuck | 0:cb38da4f4b04 | 33 | |
dudmuck | 1:3199506bc2e5 | 34 | void transmit(unsigned target, uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 35 | { |
dudmuck | 0:cb38da4f4b04 | 36 | unsigned t_diff; |
dudmuck | 0:cb38da4f4b04 | 37 | uint16_t crc; |
dudmuck | 0:cb38da4f4b04 | 38 | |
dudmuck | 1:3199506bc2e5 | 39 | radio.tx_buf[0] = cmd; |
dudmuck | 0:cb38da4f4b04 | 40 | t_diff = target - t.read_us(); |
dudmuck | 0:cb38da4f4b04 | 41 | radio.tx_buf[1] = t_diff >> 24; |
dudmuck | 0:cb38da4f4b04 | 42 | radio.tx_buf[2] = t_diff >> 16; |
dudmuck | 0:cb38da4f4b04 | 43 | radio.tx_buf[3] = t_diff >> 8; |
dudmuck | 0:cb38da4f4b04 | 44 | radio.tx_buf[4] = t_diff & 0xff; |
dudmuck | 0:cb38da4f4b04 | 45 | crc = crc_ccitt(radio.tx_buf, 5); |
dudmuck | 0:cb38da4f4b04 | 46 | radio.tx_buf[5] = crc >> 8; |
dudmuck | 0:cb38da4f4b04 | 47 | radio.tx_buf[6] = crc & 0xff; |
dudmuck | 0:cb38da4f4b04 | 48 | |
dudmuck | 0:cb38da4f4b04 | 49 | |
dudmuck | 0:cb38da4f4b04 | 50 | lora.start_tx(lora.RegPayloadLength); /* begin transmission */ |
dudmuck | 0:cb38da4f4b04 | 51 | |
dudmuck | 1:3199506bc2e5 | 52 | while (lora.service() != SERVICE_TX_DONE) { /* wait for transmission to complete */ |
dudmuck | 1:3199506bc2e5 | 53 | } |
dudmuck | 0:cb38da4f4b04 | 54 | |
dudmuck | 0:cb38da4f4b04 | 55 | printf("t_diff:%u crc:%04x\r\n", t_diff, crc); |
dudmuck | 0:cb38da4f4b04 | 56 | } |
dudmuck | 0:cb38da4f4b04 | 57 | |
dudmuck | 0:cb38da4f4b04 | 58 | #define TARGET_LATENCY 2000000 |
dudmuck | 1:3199506bc2e5 | 59 | void send_alarm(uint8_t cmd) |
dudmuck | 0:cb38da4f4b04 | 60 | { |
dudmuck | 0:cb38da4f4b04 | 61 | int i; |
dudmuck | 0:cb38da4f4b04 | 62 | unsigned target = t.read_us() + TARGET_LATENCY; |
dudmuck | 0:cb38da4f4b04 | 63 | printf("send_alarm() %u\n", target); |
dudmuck | 0:cb38da4f4b04 | 64 | |
dudmuck | 1:3199506bc2e5 | 65 | for (i = 0; i < 5; i++) { |
dudmuck | 1:3199506bc2e5 | 66 | transmit(target, cmd); |
dudmuck | 0:cb38da4f4b04 | 67 | wait(0.1); |
dudmuck | 0:cb38da4f4b04 | 68 | } |
dudmuck | 0:cb38da4f4b04 | 69 | } |
dudmuck | 1:3199506bc2e5 | 70 | |
dudmuck | 1:3199506bc2e5 | 71 | void debounce(DigitalIn* pin, uint8_t cmd) |
dudmuck | 1:3199506bc2e5 | 72 | { |
dudmuck | 1:3199506bc2e5 | 73 | if (!pin->read()) { |
dudmuck | 1:3199506bc2e5 | 74 | int i; |
dudmuck | 1:3199506bc2e5 | 75 | for (i = 0; i < 5; i++) { |
dudmuck | 1:3199506bc2e5 | 76 | wait(0.01); |
dudmuck | 1:3199506bc2e5 | 77 | if (pin->read()) { |
dudmuck | 1:3199506bc2e5 | 78 | printf("trans\r\n"); |
dudmuck | 1:3199506bc2e5 | 79 | break; |
dudmuck | 1:3199506bc2e5 | 80 | } |
dudmuck | 1:3199506bc2e5 | 81 | } |
dudmuck | 1:3199506bc2e5 | 82 | if (i == 5) |
dudmuck | 1:3199506bc2e5 | 83 | send_alarm(cmd); |
dudmuck | 1:3199506bc2e5 | 84 | |
dudmuck | 1:3199506bc2e5 | 85 | while (!pin->read()) |
dudmuck | 1:3199506bc2e5 | 86 | ; |
dudmuck | 1:3199506bc2e5 | 87 | } |
dudmuck | 1:3199506bc2e5 | 88 | } |
dudmuck | 2:0b7620bda2c9 | 89 | |
dudmuck | 4:19056d9707ef | 90 | void cmd_ocp(uint8_t ma) |
dudmuck | 4:19056d9707ef | 91 | { |
dudmuck | 4:19056d9707ef | 92 | if (ma < 130) |
dudmuck | 4:19056d9707ef | 93 | radio.RegOcp.bits.OcpTrim = (ma - 45) / 5; |
dudmuck | 4:19056d9707ef | 94 | else |
dudmuck | 4:19056d9707ef | 95 | radio.RegOcp.bits.OcpTrim = (ma + 30) / 10; |
dudmuck | 4:19056d9707ef | 96 | radio.write_reg(REG_OCP, radio.RegOcp.octet); |
dudmuck | 4:19056d9707ef | 97 | |
dudmuck | 4:19056d9707ef | 98 | radio.RegOcp.octet = radio.read_reg(REG_OCP); |
dudmuck | 4:19056d9707ef | 99 | if (radio.RegOcp.bits.OcpTrim < 16) |
dudmuck | 4:19056d9707ef | 100 | ma = 45 + (5 * radio.RegOcp.bits.OcpTrim); |
dudmuck | 4:19056d9707ef | 101 | else if (radio.RegOcp.bits.OcpTrim < 28) |
dudmuck | 4:19056d9707ef | 102 | ma = (10 * radio.RegOcp.bits.OcpTrim) - 30; |
dudmuck | 4:19056d9707ef | 103 | else |
dudmuck | 4:19056d9707ef | 104 | ma = 240; |
dudmuck | 4:19056d9707ef | 105 | printf("Ocp: %dmA\r\n", ma); |
dudmuck | 4:19056d9707ef | 106 | } |
dudmuck | 4:19056d9707ef | 107 | |
dudmuck | 0:cb38da4f4b04 | 108 | int main() |
dudmuck | 0:cb38da4f4b04 | 109 | { |
dudmuck | 0:cb38da4f4b04 | 110 | printf("\r\nreset-tx\r\n"); |
dudmuck | 0:cb38da4f4b04 | 111 | t.start(); |
dudmuck | 1:3199506bc2e5 | 112 | |
dudmuck | 3:d8b57eca8c45 | 113 | pinA.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 114 | pinB.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 115 | pinC.mode(PullUp); |
dudmuck | 3:d8b57eca8c45 | 116 | pinD.mode(PullUp); |
dudmuck | 1:3199506bc2e5 | 117 | |
dudmuck | 0:cb38da4f4b04 | 118 | radio.rf_switch = rfsw_callback; |
dudmuck | 0:cb38da4f4b04 | 119 | |
dudmuck | 0:cb38da4f4b04 | 120 | radio.set_frf_MHz(910.8); |
dudmuck | 0:cb38da4f4b04 | 121 | lora.enable(); |
dudmuck | 0:cb38da4f4b04 | 122 | lora.setBw_KHz(500); |
dudmuck | 0:cb38da4f4b04 | 123 | lora.setSf(11); |
dudmuck | 0:cb38da4f4b04 | 124 | |
Wayne Roberts |
5:1652e04809fb | 125 | board_init(); |
dudmuck | 0:cb38da4f4b04 | 126 | |
dudmuck | 0:cb38da4f4b04 | 127 | /* constant payload length */ |
dudmuck | 0:cb38da4f4b04 | 128 | lora.RegPayloadLength = 7; |
dudmuck | 0:cb38da4f4b04 | 129 | radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength); |
dudmuck | 4:19056d9707ef | 130 | |
dudmuck | 4:19056d9707ef | 131 | /* lora.RegModemConfig2.octet = radio.read_reg(REG_LR_MODEMCONFIG2); |
dudmuck | 4:19056d9707ef | 132 | lora.RegModemConfig2.sx1276bits.TxContinuousMode = 1; |
dudmuck | 4:19056d9707ef | 133 | radio.write_reg(REG_LR_MODEMCONFIG2, lora.RegModemConfig2.octet); |
dudmuck | 4:19056d9707ef | 134 | */ |
dudmuck | 0:cb38da4f4b04 | 135 | for (;;) { |
dudmuck | 3:d8b57eca8c45 | 136 | debounce(&pinA, CMD_PINA); |
dudmuck | 3:d8b57eca8c45 | 137 | debounce(&pinB, CMD_PINB); |
dudmuck | 3:d8b57eca8c45 | 138 | debounce(&pinC, CMD_PINC); |
dudmuck | 3:d8b57eca8c45 | 139 | debounce(&pinD, CMD_PIND); |
dudmuck | 0:cb38da4f4b04 | 140 | } // ..for (;;) |
dudmuck | 0:cb38da4f4b04 | 141 | } |