May 2021 test

Dependencies:   sx128x sx12xx_hal

main.cpp

Committer:
dudmuck
Date:
2018-01-26
Revision:
2:bf201940a9db
Parent:
1:6a3a48d657a9
Child:
3:f81d64ff0164

File content as of revision 2:bf201940a9db:

#include "sx127x_lora.h"
 
DigitalOut myled(LED1);
#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;        
        }
    }    
    
    DigitalOut pinA(PB_12);
    DigitalOut pinB(PB_13);
    DigitalOut pinC(PB_14);
    DigitalOut 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;
    }
    
    DigitalOut pinA(PC_3);
    DigitalOut pinB(PC_2);
    DigitalOut pinC(PC_6);
    DigitalOut pinD(PC_8);
#endif /* !TARGET_DISCO_L072CZ_LRWAN1 */

/**********************************************************************/
SX127x_lora lora(radio);

DigitalOut* pin; 
Timeout to;

#define PIN_ASSERT_us       500000

#define CMD_PINA       0x02
#define CMD_PINB       0x03
#define CMD_PINC       0x06
#define CMD_PIND       0x08

void alarm_pin_clr()
{
    pin->write(0);
}

void alarm_pin_set()
{
    pin->write(1);
    to.attach_us(&alarm_pin_clr, PIN_ASSERT_us);
}

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 get_alarm()
{
    uint16_t rx_crc, crc = crc_ccitt(radio.rx_buf, 5);
    rx_crc = radio.rx_buf[5];
    rx_crc <<= 8;
    rx_crc += radio.rx_buf[6];
    //printf("%u) crc rx:%04x, calc:%04x\r\n", lora.RegRxNbBytes, rx_crc, crc);
    if (crc == rx_crc) {
        uint8_t c = radio.rx_buf[0];
        //if (radio.rx_buf[0] == CMD_ALARM)
        if (c == CMD_PINA || c == CMD_PINB || c == CMD_PINC || c == CMD_PIND) {
            unsigned delay;
            delay = radio.rx_buf[1];
            delay <<= 8;
            delay += radio.rx_buf[2];
            delay <<= 8;
            delay += radio.rx_buf[3];
            delay <<= 8;
            delay += radio.rx_buf[4];
            switch (c) {
                case CMD_PINA: pin = &pinA; break;
                case CMD_PINB: pin = &pinB; break;
                case CMD_PINC: pin = &pinC; break;
                case CMD_PIND: pin = &pinD; break;
            }
            to.attach_us(&alarm_pin_set, delay);
            printf("delay:%u\r\n", delay);
        } else
            printf("cmd? %02x\r\n", radio.rx_buf[0]);
    } else
        printf("crc fail %04x, %04x\r\n", rx_crc, crc);
}
 
int main()
{   
    printf("\r\nreset-rx\r\n");
    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;
    } else {
        /* MAS shield board, only RFO TX */
        radio.RegPaConfig.bits.PaSelect = 0;
        printf("MAS\r\n");
    }
    rfsw.output();
#endif /* !TARGET_DISCO_L072CZ_LRWAN1 */
    radio.write_reg(REG_PACONFIG, radio.RegPaConfig.octet);
                
    lora.start_rx(RF_OPMODE_RECEIVER);
    
    for (;;) {     
        if (lora.service() == SERVICE_READ_FIFO) {
            /*int i;
            for (i = 0; i < lora.RegRxNbBytes; i++) {
                printf("%02x ", radio.rx_buf[i]);
            }
            printf("\r\n");*/
            get_alarm();
        }
    }
}