diff --git a/Libraries/Si446x/si446x.h b/Libraries/Si446x/si446x.h new file mode 100644 --- /dev/null +++ b/Libraries/Si446x/si446x.h @@ -0,0 +1,176 @@ +#ifndef SI446X_H +#define SI446X_H + +#include "stm32f0xx_hal.h" + + +// Hardware Options /////////////////// + +// Timeout for blocking writes +#define SI446x_TIMEOUT 10 + +// 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