Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: SX127x sx12xx_hal
main.cpp
- Committer:
- dudmuck
- Date:
- 2018-01-26
- Revision:
- 3:d8b57eca8c45
- Parent:
- 2:0b7620bda2c9
- Child:
- 4:19056d9707ef
File content as of revision 3:d8b57eca8c45:
#include "sx127x_lora.h"
#ifdef TARGET_DISCO_L072CZ_LRWAN1
SPI spi(PA_7, PA_6, PB_3); // mosi, miso, sclk
// dio0, dio1, nss, spi, rst
SX127x radio(PB_4, PB_1, PA_15, spi, PC_0);
#define CRF1 PA_1
#define CRF2 PC_2
#define CRF3 PC_1
DigitalOut Vctl1(CRF1);
DigitalOut Vctl2(CRF2);
DigitalOut Vctl3(CRF3);
void rfsw_callback()
{
if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {
Vctl1 = 0;
if (radio.RegPaConfig.bits.PaSelect) {
Vctl2 = 0;
Vctl3 = 1;
} else {
Vctl2 = 1;
Vctl3 = 0;
}
} else {
if (radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER || radio.RegOpMode.bits.Mode == RF_OPMODE_RECEIVER_SINGLE)
Vctl1 = 1;
else
Vctl1 = 0;
Vctl2 = 0;
Vctl3 = 0;
}
}
DigitalIn pinA(PB_12);
DigitalIn pinB(PB_13);
DigitalIn pinC(PB_14);
DigitalIn pinD(PB_15);
#else
SPI spi(D11, D12, D13); // mosi, miso, sclk
// dio0, dio1, nss, spi, rst
SX127x radio( D2, D3, D10, spi, A0); // sx1276 arduino shield
DigitalInOut rfsw(A4); // for SX1276 arduino shield
void rfsw_callback()
{
if (radio.RegOpMode.bits.Mode == RF_OPMODE_TRANSMITTER) {
rfsw = 1;
} else {
rfsw = 0;
}
}
DigitalIn pinA(PC_3);
DigitalIn pinB(PC_2);
DigitalIn pinC(PC_6);
DigitalIn pinD(PC_8);
#endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
/**********************************************************************/
SX127x_lora lora(radio);
Timer t;
#define CMD_PINA 0x02
#define CMD_PINB 0x03
#define CMD_PINC 0x06
#define CMD_PIND 0x08
static uint16_t crc_ccitt( uint8_t *buffer, uint16_t length )
{
// The CRC calculation follows CCITT
const uint16_t polynom = 0x1021;
// CRC initial value
uint16_t crc = 0x0000;
if( buffer == NULL )
{
return 0;
}
for( uint16_t i = 0; i < length; ++i )
{
crc ^= ( uint16_t ) buffer[i] << 8;
for( uint16_t j = 0; j < 8; ++j )
{
crc = ( crc & 0x8000 ) ? ( crc << 1 ) ^ polynom : ( crc << 1 );
}
}
return crc;
}
void transmit(unsigned target, uint8_t cmd)
{
unsigned t_diff;
uint16_t crc;
radio.tx_buf[0] = cmd;
t_diff = target - t.read_us();
radio.tx_buf[1] = t_diff >> 24;
radio.tx_buf[2] = t_diff >> 16;
radio.tx_buf[3] = t_diff >> 8;
radio.tx_buf[4] = t_diff & 0xff;
crc = crc_ccitt(radio.tx_buf, 5);
radio.tx_buf[5] = crc >> 8;
radio.tx_buf[6] = crc & 0xff;
lora.start_tx(lora.RegPayloadLength); /* begin transmission */
while (lora.service() != SERVICE_TX_DONE) { /* wait for transmission to complete */
}
printf("t_diff:%u crc:%04x\r\n", t_diff, crc);
}
#define TARGET_LATENCY 2000000
void send_alarm(uint8_t cmd)
{
int i;
unsigned target = t.read_us() + TARGET_LATENCY;
printf("send_alarm() %u\n", target);
for (i = 0; i < 5; i++) {
transmit(target, cmd);
wait(0.1);
}
}
void debounce(DigitalIn* pin, uint8_t cmd)
{
if (!pin->read()) {
int i;
for (i = 0; i < 5; i++) {
wait(0.01);
if (pin->read()) {
printf("trans\r\n");
break;
}
}
if (i == 5)
send_alarm(cmd);
while (!pin->read())
;
}
}
void cmd_op(int dbm)
{
int i = dbm;
RegPdsTrim1_t pds_trim;
uint8_t adr;
if (radio.type == SX1276)
adr = REG_PDSTRIM1_SX1276;
else
adr = REG_PDSTRIM1_SX1272;
pds_trim.octet = radio.read_reg(adr);
if (radio.RegPaConfig.bits.PaSelect) {
/* PABOOST used: +2dbm to +17, or +20 */
if (i == 20) {
printf("+20dBm PADAC bias\r\n");
i -= 3;
pds_trim.bits.prog_txdac = 7;
radio.write_reg(adr, pds_trim.octet);
}
if (i > 1)
radio.RegPaConfig.bits.OutputPower = i - 2;
} else {
/* RFO used: -1 to +14dbm */
if (i < 15)
radio.RegPaConfig.bits.OutputPower = i + 1;
}
radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
if (radio.RegPaConfig.bits.PaSelect) {
printf("PA_BOOST ");
dbm = radio.RegPaConfig.bits.OutputPower + pds_trim.bits.prog_txdac - 2;
} else {
printf("RFO ");
dbm = radio.RegPaConfig.bits.OutputPower - 1;
}
printf("OutputPower:%ddBm\r\n", dbm);
}
int main()
{
printf("\r\nreset-tx\r\n");
t.start();
pinA.mode(PullUp);
pinB.mode(PullUp);
pinC.mode(PullUp);
pinD.mode(PullUp);
radio.rf_switch = rfsw_callback;
radio.set_frf_MHz(910.8);
lora.enable();
lora.setBw_KHz(500);
lora.setSf(11);
radio.RegPaConfig.octet = radio.read_reg(REG_PACONFIG);
#ifdef TARGET_DISCO_L072CZ_LRWAN1
radio.RegPaConfig.bits.PaSelect = 1;
#else
/* RFO or PABOOST choice:
* SX1276 shield: RFO if using 900MHz, or PA_BOOST if using 433MHz
*/
rfsw.input();
if (rfsw.read()) {
printf("LAS\r\n");
/* LAS HF=PA_BOOST LF=RFO */
if (radio.HF)
radio.RegPaConfig.bits.PaSelect = 1;
else
radio.RegPaConfig.bits.PaSelect = 0;
cmd_op(20);
} else {
/* MAS shield board, only RFO TX */
radio.RegPaConfig.bits.PaSelect = 0;
printf("MAS\r\n");
cmd_op(14);
}
rfsw.output();
#endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
/* constant payload length */
lora.RegPayloadLength = 7;
radio.write_reg(REG_LR_PAYLOADLENGTH, lora.RegPayloadLength);
for (;;) {
debounce(&pinA, CMD_PINA);
debounce(&pinB, CMD_PINB);
debounce(&pinC, CMD_PINC);
debounce(&pinD, CMD_PIND);
} // ..for (;;)
}