May 2021 Commit

Dependencies:   sx128x 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 (;;)
}