Skip to content

Commit

Permalink
[*] перенесены объявления функций настройки отдельных параметров в фа…
Browse files Browse the repository at this point in the history
…йл sx127x.h

[*] исправлено значение версии устройства
[*] очистка флагов прерываний вызывается до вызова коллбэка
[*] исправлена настройка прерываний DIO
  • Loading branch information
morran committed Jun 3, 2019
1 parent 15130ff commit ca3d2f7
Show file tree
Hide file tree
Showing 6 changed files with 78 additions and 46 deletions.
16 changes: 16 additions & 0 deletions inc/sx127x.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,22 @@ uint8_t sx127x_get_version(sx127x_dev_t* dev);
uint8_t sx127x_set_sleep(sx127x_dev_t* dev);
uint8_t sx127x_set_standby(sx127x_dev_t* dev);

uint8_t sx127x_set_power(sx127x_dev_t* dev, uint8_t power);

uint8_t sx127x_set_spreading_factor(sx127x_dev_t* dev, spreading_factor_t spreading_factor);

uint8_t sx127x_set_band_width(sx127x_dev_t* dev, band_width_t band_width);

uint8_t sx127x_set_coding_rate(sx127x_dev_t* dev, coding_rate_t coding_rate);

uint8_t sx127x_set_payload_crc_on(sx127x_dev_t* dev, bool crc_on);

uint8_t sx127x_set_preamble_length(sx127x_dev_t* dev, uint16_t preamble_length);

uint8_t sx127x_set_frequency(sx127x_dev_t* dev, uint32_t frequency);

uint8_t sx127x_set_sync_word(sx127x_dev_t* dev, uint8_t sync_word);

uint8_t sx127x_transmit(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size, uint32_t delay);
uint8_t sx127x_transmit_it(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size);

Expand Down
16 changes: 0 additions & 16 deletions inc/sx127x_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,6 @@ uint8_t sx127x_set_modulation_mode(sx127x_dev_t* dev, modulation_t modulation);

uint8_t sx127x_set_pa_select(sx127x_dev_t* dev, pa_select_t pa_select);

uint8_t sx127x_set_power(sx127x_dev_t* dev, uint8_t power);

uint8_t sx127x_set_spreading_factor(sx127x_dev_t* dev, spreading_factor_t spreading_factor);

uint8_t sx127x_set_band_width(sx127x_dev_t* dev, band_width_t band_width);

uint8_t sx127x_set_coding_rate(sx127x_dev_t* dev, coding_rate_t coding_rate);

uint8_t sx127x_set_payload_crc_on(sx127x_dev_t* dev, bool crc_on);

uint8_t sx127x_set_preamble_length(sx127x_dev_t* dev, uint16_t preamble_length);

uint8_t sx127x_set_frequency(sx127x_dev_t* dev, uint32_t frequency);

uint8_t sx127x_set_sync_word(sx127x_dev_t* dev, uint8_t sync_word);

uint8_t sx127x_get_fifo_pointer(sx127x_dev_t* dev);
uint8_t sx127x_get_fifo_tx_pointer(sx127x_dev_t* dev);
uint8_t sx127x_get_fifo_rx_pointer(sx127x_dev_t* dev);
Expand Down
3 changes: 1 addition & 2 deletions inc/sx127x_registers.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,6 @@
#define DIO_MODE_2 2
#define DIO_MODE_DISABLE 3

// #define VERSION 0x12
#define VERSION 0xFF
#define VERSION 0x12

#endif /* SX127X_REGISTERS_H */
73 changes: 45 additions & 28 deletions src/sx127x.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,27 @@ uint8_t sx127x_reset(sx127x_dev_t* dev)

void sx127x_dio_0_callback(sx127x_dev_t* dev)
{
uint8_t irq = sx127x_get_irq_flags(dev);
volatile uint8_t irq = sx127x_get_irq_flags(dev);

switch (dev->settings.mode) {
case MODE_TX:
if (!(irq & FlagTxDone))
break;

sx127x_clear_irq_flags(dev, FlagTxDone);

dev->callbacks->tx_done();

sx127x_clear_irq_flags(dev, FlagTxDone);
break;
case MODE_RXCONTINUOUS:
case MODE_RXSINGLE: {
if (irq & FlagPayloadCrcError) {
sx127x_clear_irq_flags(dev, FlagRxTimeout);

dev->callbacks->rx_timeout();
break;
}

if (!(irq & FlagRxDone))
break;

Expand All @@ -70,9 +78,10 @@ void sx127x_dio_0_callback(sx127x_dev_t* dev)

sx127x_read_fifo(dev, buffer, size);

sx127x_clear_irq_flags(dev, FlagRxDone);

dev->callbacks->rx_done(buffer, size);

sx127x_clear_irq_flags(dev, FlagRxDone);
} break;
default:
break;
Expand All @@ -81,15 +90,16 @@ void sx127x_dio_0_callback(sx127x_dev_t* dev)

void sx127x_dio_1_callback(sx127x_dev_t* dev)
{

if (dev->settings.mode != MODE_RXSINGLE)
return;

if (!(sx127x_get_irq_flags(dev) & FlagRxTimeout))
return;

dev->callbacks->rx_timeout();

sx127x_clear_irq_flags(dev, FlagRxTimeout);

dev->callbacks->rx_timeout();
}

void sx127x_dio_2_callback(sx127x_dev_t* dev)
Expand All @@ -98,6 +108,7 @@ void sx127x_dio_2_callback(sx127x_dev_t* dev)

void sx127x_dio_3_callback(sx127x_dev_t* dev)
{

if (!(dev->settings.mode == MODE_RXSINGLE || dev->settings.mode == MODE_RXCONTINUOUS))
return;

Expand Down Expand Up @@ -185,24 +196,28 @@ uint8_t sx127x_get_version(sx127x_dev_t* dev)
uint8_t sx127x_set_sleep(sx127x_dev_t* dev)
{
uint8_t reg = sx127x_read_register(dev->spi, RegOpMode);

sx127x_write_register(dev->spi, RegOpMode, (reg & 0xF8) | MODE_SLEEP);

dev->settings.mode = MODE_SLEEP;

return 0;
}

uint8_t sx127x_set_standby(sx127x_dev_t* dev)
{
uint8_t reg = sx127x_read_register(dev->spi, RegOpMode);

sx127x_write_register(dev->spi, RegOpMode, (reg & 0xF8) | MODE_STDBY);

dev->settings.mode = MODE_STDBY;

return 0;
}

uint8_t sx127x_transmit(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size, uint32_t delay)
{
uint16_t dio_mapping = sx127x_get_dio_config(dev);

if (sx127x_set_dio_config(dev, dio_mapping | (DIO_MODE_DISABLE << DIO_0_MAPPING)) != 0) // Отключение DIO0
if (sx127x_set_dio_config(dev, (DIO_MODE_DISABLE << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Отключение DIO
return -1;

if (sx127x_clear_irq_flags(dev, FlagTxDone) != 0) // На всякий случай очистра прерывания TxDone
Expand Down Expand Up @@ -232,9 +247,7 @@ uint8_t sx127x_transmit(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size, uint32

uint8_t sx127x_transmit_it(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size)
{
uint16_t dio_mapping = sx127x_get_dio_config(dev);

if (sx127x_set_dio_config(dev, dio_mapping & (DIO_MODE_0 << DIO_0_MAPPING)) != 0) // Включение DIO0
if (sx127x_set_dio_config(dev, (DIO_MODE_1 << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Включение DIO0
return -1;

if (sx127x_clear_irq_flags(dev, FlagTxDone) != 0) // На всякий случай очистра прерывания TxDone
Expand All @@ -257,17 +270,18 @@ uint8_t sx127x_transmit_it(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size)

uint8_t sx127x_receive_single(sx127x_dev_t* dev, uint8_t* buffer, uint8_t* size)
{
uint16_t dio_mapping = sx127x_get_dio_config(dev);

if (sx127x_set_dio_config(dev, dio_mapping | (DIO_MODE_DISABLE << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING)) != 0) // Отключение DIO0, DIO1 и DIO3
if (sx127x_set_dio_config(dev, (DIO_MODE_DISABLE << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Отключение DIO
return -1;

if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерывания TxDone
if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерываний
return -1;

if (sx127x_set_irq_flags_mask(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // Включение прерывания по окончании отправки
return -1;

if (sx127x_set_standby(dev) != 0) // FIFO не доступен в режиме SLEEP
return -1;

if (sx127x_set_fifo_rx_pointer(dev, 0) != 0)
return -1;

Expand Down Expand Up @@ -304,18 +318,19 @@ uint8_t sx127x_receive_single(sx127x_dev_t* dev, uint8_t* buffer, uint8_t* size)

uint8_t sx127x_receive_single_it(sx127x_dev_t* dev)
{
uint16_t dio_mapping = sx127x_get_dio_config(dev);

if (sx127x_set_dio_config(dev, dio_mapping & (DIO_MODE_0 << DIO_0_MAPPING) & (DIO_MODE_0 << DIO_1_MAPPING) & (DIO_MODE_0 << DIO_3_MAPPING)) != 0) // Включение DIO0, DIO1 и DIO3
if (sx127x_set_dio_config(dev, (DIO_MODE_0 << DIO_0_MAPPING) | (DIO_MODE_0 << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_2 << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Включение DIO0, DIO1 и DIO3
return -1;

if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерывания TxDone
if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерываний
return -1;

if (sx127x_set_irq_flags_mask(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // Включение прерывания по окончании отправки
return -1;

if (sx127x_set_fifo_rx_pointer(dev, 0) != 0)
if (sx127x_set_standby(dev) != 0) // FIFO не доступен в режиме SLEEP
return -1;

if (sx127x_set_fifo_rx_pointer(dev, 1) != 0)
return -1;

if (sx127x_set_rx_single(dev) != 0)
Expand All @@ -328,16 +343,17 @@ uint8_t sx127x_receive_continuous(sx127x_dev_t* dev, uint8_t* buffer, uint8_t* s
{
if (dev->settings.mode != MODE_RXCONTINUOUS) {

uint16_t dio_mapping = sx127x_get_dio_config(dev);
if (sx127x_set_dio_config(dev, (DIO_MODE_DISABLE << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Отключение DIO

if (sx127x_set_dio_config(dev, dio_mapping | (DIO_MODE_DISABLE << DIO_0_MAPPING) | (DIO_MODE_DISABLE << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_3_MAPPING)) != 0) // Отключение DIO0, DIO1 и DIO3

if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерывания TxDone
if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерываний
return -1;

if (sx127x_set_irq_flags_mask(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // Включение прерывания по окончании отправки
return -1;

if (sx127x_set_standby(dev) != 0) // FIFO не доступен в режиме SLEEP
return -1;

if (sx127x_set_fifo_rx_pointer(dev, 0) != 0)
return -1;

Expand Down Expand Up @@ -375,17 +391,18 @@ uint8_t sx127x_receive_continuous(sx127x_dev_t* dev, uint8_t* buffer, uint8_t* s

uint8_t sx127x_receive_continuous_it(sx127x_dev_t* dev)
{
uint16_t dio_mapping = sx127x_get_dio_config(dev);

if (sx127x_set_dio_config(dev, dio_mapping & (DIO_MODE_0 << DIO_0_MAPPING) & (DIO_MODE_0 << DIO_1_MAPPING) & (DIO_MODE_0 << DIO_3_MAPPING)) != 0) // Включение DIO0, DIO1 и DIO3
if (sx127x_set_dio_config(dev, (DIO_MODE_0 << DIO_0_MAPPING) | (DIO_MODE_0 << DIO_1_MAPPING) | (DIO_MODE_DISABLE << DIO_2_MAPPING) | (DIO_MODE_2 << DIO_3_MAPPING) | (DIO_MODE_DISABLE << DIO_4_MAPPING) | (DIO_MODE_DISABLE << DIO_5_MAPPING)) != 0) // Включение DIO0, DIO1 и DIO3
return -1;

if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерывания TxDone
if (sx127x_clear_irq_flags(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // На всякий случай очистра прерываний
return -1;

if (sx127x_set_irq_flags_mask(dev, FlagPayloadCrcError | FlagRxDone | FlagRxTimeout) != 0) // Включение прерывания по окончании отправки
return -1;

if (sx127x_set_standby(dev) != 0) // FIFO не доступен в режиме SLEEP
return -1;

if (sx127x_set_fifo_rx_pointer(dev, 0) != 0)
return -1;

Expand Down
3 changes: 3 additions & 0 deletions src/sx127x_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,16 @@
void sx127x_write_register(spi_t* dev, uint8_t reg, uint8_t val)
{
uint8_t buffer[] = { reg | 0x80, val };

dev->transmit(buffer, 2);
}

uint8_t sx127x_read_register(spi_t* dev, uint8_t reg)
{
uint8_t result = 0xFF;

dev->transmit_receive(&reg, 1, &result, 1);

return result;
}

Expand Down
13 changes: 13 additions & 0 deletions src/sx127x_private.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,24 +69,33 @@ uint8_t sx127x_read_fifo(sx127x_dev_t* dev, uint8_t* buffer, uint8_t size)
uint8_t sx127x_set_tx(sx127x_dev_t* dev)
{
uint8_t reg = sx127x_read_register(dev->spi, RegOpMode);

sx127x_write_register(dev->spi, RegOpMode, (reg & 0xF8) | MODE_TX);

dev->settings.mode = MODE_TX;

return 0;
}

uint8_t sx127x_set_rx_single(sx127x_dev_t* dev)
{
uint8_t reg = sx127x_read_register(dev->spi, RegOpMode);

sx127x_write_register(dev->spi, RegOpMode, (reg & 0xF8) | MODE_RXSINGLE);

dev->settings.mode = MODE_RXSINGLE;

return 0;
}

uint8_t sx127x_set_rx_continuos(sx127x_dev_t* dev)
{
uint8_t reg = sx127x_read_register(dev->spi, RegOpMode);

sx127x_write_register(dev->spi, RegOpMode, (reg & 0xF8) | MODE_RXCONTINUOUS);

dev->settings.mode = MODE_RXCONTINUOUS;

return 0;
}

Expand Down Expand Up @@ -197,6 +206,7 @@ uint8_t sx127x_set_frequency(sx127x_dev_t* dev, uint32_t frequency)
sx127x_write_register(dev->spi, RegOpMode, sx127x_read_register(dev->spi, RegOpMode) & ~(1 << 3));

uint8_t reg[3];

if (sx127x_frequency_to_reg(frequency, reg) != 0)
return -1;

Expand Down Expand Up @@ -252,7 +262,9 @@ uint8_t sx127x_get_irq_flags_mask(sx127x_dev_t* dev)
uint16_t sx127x_get_dio_config(sx127x_dev_t* dev)
{
uint8_t buffer[2];

sx127x_read_burst(dev->spi, RegDioMapping1, buffer, 2);

return (((uint16_t)(buffer[0]) << 8) | ((uint16_t)(buffer[1]) & 0xff)) & 0xfff0; // regdiomapping1 & regdiomapping2[4:7]
}

Expand Down Expand Up @@ -374,5 +386,6 @@ uint8_t sx127x_frequency_to_reg(uint32_t frequency, uint8_t* reg)
uint32_t sx127x_reg_to_frequency(uint8_t* reg)
{
uint32_t reg_value = (((uint32_t)reg[0]) << 16) | (((uint32_t)reg[1]) << 8) | ((uint32_t)reg[2]);

return (uint32_t)((float)reg_value * F_STEP);
}

0 comments on commit ca3d2f7

Please sign in to comment.