Files @ 02d3447dac18
Branch filter:

Location: windsonde/Libraries/Si446x/si446x.h

ethanzonca
Add docs, remove startup delays
#ifndef SI446X_H
#define SI446X_H

#include "stm32f0xx_hal.h"


// Hardware Options ///////////////////

// Timeout for blocking writes
#define SI446x_TIMEOUT 50

// Crystal/oscillator frequency
#define SI446x_VCXO_FREQ  26000000UL
#define SI446x_SPI SPI1

// GPIO assignments
#define SI446x_CS_PORT GPIOA
#define SI446x_CS_PIN GPIO_PIN_15

#define SI446x_GPIO_PORT GPIOA
#define SI446x_GPIO_PIN GPIO_PIN_10

#define SI446x_SHUTDOWN_PORT GPIOA
#define SI446x_SHUTDOWN_PIN GPIO_PIN_9

#define SI446x_MOSI_PORT GPIOB
#define SI446x_MOSI_PIN GPIO_PIN_5

#define SI446x_MISO_PORT GPIOB
#define SI446x_MISO_PIN GPIO_PIN_4

#define SI446x_SCK_PORT GPIOB
#define SI446x_SCK_PIN GPIO_PIN_3


#define SI446x_TCXO_EN_PORT GPIOA
#define SI446x_TCXO_EN_PIN GPIO_PIN_8


///////////////////////////////////////


// Registers /////////////////////////
#define SI446x_CMD_POWER_UP 0x02
#define SI446x_CMD_NOP 0x00
#define SI446x_CMD_PART_INFO 0x01
#define SI446x_CMD_FUNC_INFO 0x10
#define SI446x_CMD_SET_PROPERTY 0x11
#define SI446x_CMD_GET_PROPERTY 0x12
#define SI446x_CMD_GPIO_PIN_CFG 0x13
#define SI446x_CMD_GET_ADC_READING 0x14
#define SI446x_CMD_FIFO_INFO 0x15
#define SI446x_CMD_PACKET_INFO 0x16
#define SI446x_CMD_IRCAL 0x17
#define SI446x_CMD_PROTOCOL_CFG 0x18
#define SI446x_CMD_GET_INT_STATUS 0x20
#define SI446x_CMD_GET_PH_STATUS 0x21
#define SI446x_CMD_GET_MODEM_STATUS 0x22
#define SI446x_CMD_GET_CHIP_STATUS 0x23
#define SI446x_CMD_START_TX 0x31
#define SI446x_CMD_START_RX 0x32
#define SI446x_CMD_REQUEST_DEVICE_STATE 0x33
#define SI446x_CMD_CHANGE_STATE 0x34
#define SI446x_CMD_READ_CMD_BUFF 0x44
#define SI446x_CMD_FRR_A_READ 0x50
#define SI446x_CMD_FRR_B_READ 0x51
#define SI446x_CMD_FRR_C_READ 0x53
#define SI446x_CMD_FRR_D_READ 0x57
#define SI446x_CMD_WRITE_TX_FIFO 0x66
#define SI446x_CMD_READ_RX_FIFO 0x77
#define SI446x_CMD_RX_HOP 0x36

// GPIO pin configuration options
#define SI446x_GPIO_NOCHANGE 0
#define SI446x_GPIO_LOW 2
#define SI446x_GPIO_HIGH 3
#define SI446x_GPIO_INPUT 4
#define SI446x_GPIO_TXFIFO_LOW 35
#define SI446x_GPIO_TXENABLED 32

// GPIO pin definitions
#define SI446x_GPIO0 0
#define SI446x_GPIO1 1
#define SI446x_GPIO2 2
#define SI446x_GPIO3 3

// Property MOD_TYPE parameters
#define SI446x_MOD_TYPE_REGISTER_GROUP 0x20
#define SI446x_MOD_TYPE_REGISTER_PROP 0x00
#define SI446x_MOD_TYPE_CW    0
#define SI446x_MOD_TYPE_OOK   1
#define SI446x_MOD_TYPE_2FSK  2
#define SI446x_MOD_TYPE_2GFSK 3
#define SI446x_MOD_TYPE_4FSK  4
#define SI446x_MOD_TYPE_4GFSK 5

#define SI446x_MOD_TYPE_SOURCE_PACKETHANDLER (0<<3)
#define SI446x_MOD_TYPE_SOURCE_DIRECTMODE    (1<<3)
#define SI446x_MOD_TYPE_SOURCE_PSEUDORANDOM  (2<<3)

#define SI446x_MOD_TYPE_DIRECT_SYNCH (0<<7)
#define SI446x_MOD_TYPE_DIRECT_ASYNCH (1<<7)

#define SI446x_MOD_TYPE_DIRECT_SOURCE_GPIO0 (0<<5)
#define SI446x_MOD_TYPE_DIRECT_SOURCE_GPIO1 (1<<5)
#define SI446x_MOD_TYPE_DIRECT_SOURCE_GPIO2 (2<<5)
#define SI446x_MOD_TYPE_DIRECT_SOURCE_GPIO3 (3<<5)

// XO Tune
#define SI446x_XO_TUNE_REGISTER_GROUP 0x00
#define SI446x_XO_TUNE_REGISTER_PROP 0x00
#define SI446x_XO_TUNE_MAX 0x7F

// Modem bit mapping
#define SI446x_MODEM_MAP_GROUP 0x20
#define SI446x_MODEM_MAP_PROP 0x01

// Preamble
#define SI446x_PREAMBLE_TX_LENGTH_GROUP 0x10
#define SI446x_PREAMBLE_TX_LENGTH_PROP 0x00

// Sync
#define SI446x_SYNC_LENGTH_GROUP 0x11
#define SI446x_SYNC_LENGTH_PROP 0x00


// Power amp control DAC options
#define AD56XX_NORMAL_OPERATION 0b00000000
#define AD56XX_1K_TO_GROUND     0b01000000
#define AD56XX_100K_TO_GROUND   0b10000000
#define AD56XX_TRI_STATE        0b11000000



// Internal definitions
#define SI446x_CS SI446x_CS_PORT, SI446x_CS_PIN
#define SI446x_MOSI SI446x_MOSI_PORT, SI446x_MOSI_PIN
#define SI446x_MISO SI446x_MISO_PORT, SI446x_MISO_PIN
#define SI446x_SCK SI446x_SCK_PORT, SI446x_SCK_PIN
#define SI446x_GPIO SI446x_GPIO_PORT, SI446x_GPIO_PIN
#define SI446x_SHUTDOWN SI446x_SHUTDOWN_PORT , SI446x_SHUTDOWN_PIN


// Communication options
#define SI446x_IGNORE_ACK 0
#define SI446x_CHECK_ACK 1


// Helper macros
#define SI446x_SELECT HAL_GPIO_WritePin(SI446x_CS, GPIO_PIN_RESET)
#define SI446x_DESELECT HAL_GPIO_WritePin(SI446x_CS, GPIO_PIN_SET)

void si446x_init(void);

void si446x_reset(void);

void si446x_gpio(uint8_t gpio, uint8_t state, uint8_t doack);

void si446x_setdatarate(void);

void si446x_senddata(uint8_t* data, uint8_t len);
void si446x_sendcmd(uint8_t tx_len, uint8_t* data, uint8_t doack);


void si446x_setchannel(uint32_t frequency);

void si446x_cw_on(void);
void si446x_cw_off(void);
uint8_t si446x_tx_status(void);

SPI_HandleTypeDef* spi1_get(void);

void si446x_shutdown(void);
void si446x_wakeup(void);

#endif