mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-02 22:17:49 +00:00
62663c1832
* add SPI driver for semtech sx128x chips Co-authored-by: Copilot <copilot@github.com> * handle busy loop better * switch to time based busy timeout Co-authored-by: Copilot <copilot@github.com> * comment functions * start on using types for function inputs * use types where applicable and align with datasheet more Co-authored-by: Copilot <copilot@github.com> * work on exporting less constants * only export "actionable" errors * combine identical constants * add crude lora rx and tx examples * change from type aliases to local types --------- Co-authored-by: Copilot <copilot@github.com>
357 lines
12 KiB
Go
357 lines
12 KiB
Go
package sx128x
|
|
|
|
type SleepConfig uint8
|
|
type StandbyConfig uint8
|
|
type PeriodBase uint8
|
|
type PacketType uint8
|
|
type RadioRampTime uint8
|
|
type CadSymbolNum uint8
|
|
|
|
// GFSK Modulation Params
|
|
type GFSKBLEBitrateBandwidth uint8
|
|
type ModulationIndex uint8
|
|
type ModulationShaping uint8
|
|
|
|
// GFSK Packet Params
|
|
type GFSKPreambleLength uint8
|
|
type GFSKSyncWordLength uint8
|
|
type GFSKSyncWordMatch uint8
|
|
type GFSKHeaderType uint8
|
|
type GFSKCrcType uint8
|
|
|
|
// BLE Packet Params
|
|
type BLEConnectionState uint8
|
|
type BLECrcType uint8
|
|
type BLETestPayload uint8
|
|
|
|
// FLRC Modulation Params
|
|
type FLRCBitrateBandwidth uint8
|
|
type FLRCCodingRate uint8
|
|
|
|
// FLRC Packet Params
|
|
type FLRCPreambleLength uint8
|
|
type FLRCSyncWordLength uint8
|
|
type FLRCSyncWordMatch uint8
|
|
type FLRCHeaderType uint8
|
|
type FLRCCrcType uint8
|
|
|
|
// LoRa Modulation Params
|
|
type LoRaSpreadingFactor uint8
|
|
type LoRaBandwidth uint8
|
|
type LoRaCodingRate uint8
|
|
|
|
// LoRa Packet Params
|
|
type LoRaHeaderType uint8
|
|
type LoRaCrcType uint8
|
|
type LoRaIqType uint8
|
|
|
|
// Misc
|
|
type RegulatorMode uint8
|
|
type IRQMask = uint16
|
|
type CircuitMode uint8
|
|
type CommandStatus uint8
|
|
|
|
// Packet Status
|
|
type GFSKPacketInfo uint8
|
|
type BLEPacketInfo uint8
|
|
type FLRCPacketInfo uint8
|
|
|
|
const (
|
|
whiteningDisable = 0x00
|
|
whiteningEnable = 0x08
|
|
|
|
// Circuit Mode
|
|
circuitModeMask = uint8(0b11100000)
|
|
CIRCUIT_MODE_STDBY_RC = CircuitMode(0x2)
|
|
CIRCUIT_MODE_STDBY_XOSC = CircuitMode(0x3)
|
|
CIRCUIT_MODE_FS = CircuitMode(0x4)
|
|
CIRCUIT_MODE_RX = CircuitMode(0x5)
|
|
CIRCUIT_MODE_TX = CircuitMode(0x6)
|
|
|
|
// Command Status
|
|
commandStatusMask = uint8(0b00011100)
|
|
COMMAND_STATUS_SUCCESS = CommandStatus(0x1)
|
|
COMMAND_STATUS_DATA_AVAILABLE = CommandStatus(0x2)
|
|
COMMAND_STATUS_TIMEOUT = CommandStatus(0x3)
|
|
COMMAND_STATUS_PROCESSING_ERROR = CommandStatus(0x4)
|
|
COMMAND_STATUS_EXECUTION_ERROR = CommandStatus(0x5)
|
|
COMMAND_STATUS_TX_DONE = CommandStatus(0x6)
|
|
|
|
// SleepConfig
|
|
SLEEP_DATA_BUFFER_RETAIN = SleepConfig(2)
|
|
SLEEP_DATA_RAM_RETAIN = SleepConfig(1)
|
|
|
|
// StandbyConfig
|
|
STANDBY_RC = StandbyConfig(0)
|
|
STANDBY_XOSC = StandbyConfig(1)
|
|
|
|
// PeriodBase
|
|
PERIOD_BASE_15_625_US = PeriodBase(0)
|
|
PERIOD_BASE_62_5_US = PeriodBase(1)
|
|
PERIOD_BASE_1_MS = PeriodBase(2)
|
|
PERIOD_BASE_4_MS = PeriodBase(3)
|
|
|
|
// PacketType
|
|
PACKET_TYPE_GFSK = PacketType(0x00) // default
|
|
PACKET_TYPE_LORA = PacketType(0x01)
|
|
PACKET_TYPE_RANGING = PacketType(0x02)
|
|
PACKET_TYPE_FLRC = PacketType(0x03)
|
|
PACKET_TYPE_BLE = PacketType(0x04)
|
|
|
|
// RampTime
|
|
RADIO_RAMP_02_US = RadioRampTime(0x00)
|
|
RADIO_RAMP_04_US = RadioRampTime(0x20)
|
|
RADIO_RAMP_06_US = RadioRampTime(0x40)
|
|
RADIO_RAMP_08_US = RadioRampTime(0x60)
|
|
RADIO_RAMP_10_US = RadioRampTime(0x80)
|
|
RADIO_RAMP_12_US = RadioRampTime(0xA0)
|
|
RADIO_RAMP_16_US = RadioRampTime(0xC0)
|
|
RADIO_RAMP_20_US = RadioRampTime(0xE0)
|
|
|
|
// CadSymbolNum
|
|
LORA_CAD_01_SYMBOL = CadSymbolNum(0x00)
|
|
LORA_CAD_02_SYMBOLS = CadSymbolNum(0x20)
|
|
LORA_CAD_04_SYMBOLS = CadSymbolNum(0x40)
|
|
LORA_CAD_08_SYMBOLS = CadSymbolNum(0x60)
|
|
LORA_CAD_16_SYMBOLS = CadSymbolNum(0x80)
|
|
|
|
// GFSK Modulation Params
|
|
// Bitrate + Bandwidth - same for BLE
|
|
GFSK_BLE_BR_2_000_BW_2_4 = GFSKBLEBitrateBandwidth(0x04)
|
|
GFSK_BLE_BR_1_600_BW_2_4 = GFSKBLEBitrateBandwidth(0x28)
|
|
GFSK_BLE_BR_1_000_BW_2_4 = GFSKBLEBitrateBandwidth(0x4C)
|
|
GFSK_BLE_BR_1_000_BW_1_2 = GFSKBLEBitrateBandwidth(0x45)
|
|
GFSK_BLE_BR_0_800_BW_2_4 = GFSKBLEBitrateBandwidth(0x70)
|
|
GFSK_BLE_BR_0_800_BW_1_2 = GFSKBLEBitrateBandwidth(0x69)
|
|
GFSK_BLE_BR_0_500_BW_1_2 = GFSKBLEBitrateBandwidth(0x8D)
|
|
GFSK_BLE_BR_0_500_BW_0_6 = GFSKBLEBitrateBandwidth(0x86)
|
|
GFSK_BLE_BR_0_400_BW_1_2 = GFSKBLEBitrateBandwidth(0xB1)
|
|
GFSK_BLE_BR_0_400_BW_0_6 = GFSKBLEBitrateBandwidth(0xAA)
|
|
GFSK_BLE_BR_0_250_BW_0_6 = GFSKBLEBitrateBandwidth(0xCE)
|
|
GFSK_BLE_BR_0_250_BW_0_3 = GFSKBLEBitrateBandwidth(0xC7)
|
|
GFSK_BLE_BR_0_125_BW_0_3 = GFSKBLEBitrateBandwidth(0xEF)
|
|
|
|
// Modulation Index - same for BLE
|
|
MOD_IND_0_35 = ModulationIndex(0x00)
|
|
MOD_IND_0_5 = ModulationIndex(0x01)
|
|
MOD_IND_0_75 = ModulationIndex(0x02)
|
|
MOD_IND_1_00 = ModulationIndex(0x03)
|
|
MOD_IND_1_25 = ModulationIndex(0x04)
|
|
MOD_IND_1_50 = ModulationIndex(0x05)
|
|
MOD_IND_1_75 = ModulationIndex(0x06)
|
|
MOD_IND_2_00 = ModulationIndex(0x07)
|
|
MOD_IND_2_25 = ModulationIndex(0x08)
|
|
MOD_IND_2_50 = ModulationIndex(0x09)
|
|
MOD_IND_2_75 = ModulationIndex(0x0A)
|
|
MOD_IND_3_00 = ModulationIndex(0x0B)
|
|
MOD_IND_3_25 = ModulationIndex(0x0C)
|
|
MOD_IND_3_50 = ModulationIndex(0x0D)
|
|
MOD_IND_3_75 = ModulationIndex(0x0E)
|
|
MOD_IND_4_00 = ModulationIndex(0x0F)
|
|
|
|
// Modulation Shaping - same for BLE and FLRC
|
|
MOD_SHAPING_OFF = ModulationShaping(0x00)
|
|
MOD_SHAPING_1_0 = ModulationShaping(0x10)
|
|
MOD_SHAPING_0_5 = ModulationShaping(0x20)
|
|
|
|
// GFSK Packet Params
|
|
// Preamble Length
|
|
GFSK_PREAMBLE_LENGTH_04_BITS = GFSKPreambleLength(0x00)
|
|
GFSK_PREAMBLE_LENGTH_08_BITS = GFSKPreambleLength(0x10)
|
|
GFSK_PREAMBLE_LENGTH_12_BITS = GFSKPreambleLength(0x20)
|
|
GFSK_PREAMBLE_LENGTH_16_BITS = GFSKPreambleLength(0x30)
|
|
GFSK_PREAMBLE_LENGTH_20_BITS = GFSKPreambleLength(0x40)
|
|
GFSK_PREAMBLE_LENGTH_24_BITS = GFSKPreambleLength(0x50)
|
|
GFSK_PREAMBLE_LENGTH_28_BITS = GFSKPreambleLength(0x60)
|
|
GFSK_PREAMBLE_LENGTH_32_BITS = GFSKPreambleLength(0x70)
|
|
|
|
// Sync Word Length
|
|
GFSK_SYNC_WORD_LEN_1_B = GFSKSyncWordLength(0x00)
|
|
GFSK_SYNC_WORD_LEN_2_B = GFSKSyncWordLength(0x02)
|
|
GFSK_SYNC_WORD_LEN_3_B = GFSKSyncWordLength(0x04)
|
|
GFSK_SYNC_WORD_LEN_4_B = GFSKSyncWordLength(0x06)
|
|
GFSK_SYNC_WORD_LEN_5_B = GFSKSyncWordLength(0x08)
|
|
|
|
// Sync Word Match
|
|
GFSK_SYNCWORD_MATCH_OFF = GFSKSyncWordMatch(0x00)
|
|
GFSK_SYNCWORD_MATCH_1 = GFSKSyncWordMatch(0x10)
|
|
GFSK_SYNCWORD_MATCH_2 = GFSKSyncWordMatch(0x20)
|
|
GFSK_SYNCWORD_MATCH_1_2 = GFSKSyncWordMatch(0x30)
|
|
GFSK_SYNCWORD_MATCH_3 = GFSKSyncWordMatch(0x40)
|
|
GFSK_SYNCWORD_MATCH_1_3 = GFSKSyncWordMatch(0x50)
|
|
GFSK_SYNCWORD_MATCH_2_3 = GFSKSyncWordMatch(0x60)
|
|
GFSK_SYNCWORD_MATCH_1_2_3 = GFSKSyncWordMatch(0x70)
|
|
|
|
// GFSK Header Type
|
|
GFSK_HEADER_FIXED_LENGTH = GFSKHeaderType(0x00)
|
|
GFSK_HEADER_VARIABLE_LENGTH = GFSKHeaderType(0x20)
|
|
|
|
// GFSK CRC Type
|
|
GFSK_CRC_OFF = GFSKCrcType(0x00)
|
|
GFSK_CRC_1_BYTE = GFSKCrcType(0x10)
|
|
GFSK_CRC_2_BYTES = GFSKCrcType(0x20)
|
|
|
|
// BLE Packet Params
|
|
// Connection State
|
|
BLE_MASTER_SLAVE = BLEConnectionState(0x00)
|
|
BLE_ADVERTISER = BLEConnectionState(0x02)
|
|
BLE_TX_TEST_MODE = BLEConnectionState(0x04)
|
|
BLE_RX_TEST_MODE = BLEConnectionState(0x06)
|
|
BLE_RXTX_TEST_MODE = BLEConnectionState(0x08)
|
|
|
|
// CRC Type
|
|
BLE_CRC_OFF = BLECrcType(0x00)
|
|
BLE_CRC_3_BYTES = BLECrcType(0x10)
|
|
|
|
// BLE Test Payload
|
|
BLE_PAYLOAD_PRBS_9 = BLETestPayload(0x00)
|
|
BLE_PAYLOAD_EYELONG_1_0 = BLETestPayload(0x04)
|
|
BLE_PAYLOAD_EYESHORT_1_0 = BLETestPayload(0x08)
|
|
BLE_PAYLOAD_PRBS_15 = BLETestPayload(0x0C)
|
|
BLE_PAYLOAD_ALL_1 = BLETestPayload(0x10)
|
|
BLE_PAYLOAD_ALL_0 = BLETestPayload(0x14)
|
|
BLE_PAYLOAD_EYELONG_0_1 = BLETestPayload(0x18)
|
|
BLE_PAYLOAD_EYESHORT_0_1 = BLETestPayload(0x1C)
|
|
|
|
// FLRC Modulation Params
|
|
// Bitrate + Bandwidth
|
|
FLRC_BR_1_300_BW_1_2 = FLRCBitrateBandwidth(0x45)
|
|
FLRC_BR_1_000_BW_1_2 = FLRCBitrateBandwidth(0x69)
|
|
FLRC_BR_0_650_BW_0_6 = FLRCBitrateBandwidth(0x86)
|
|
FLRC_BR_0_520_BW_0_6 = FLRCBitrateBandwidth(0xAA)
|
|
FLRC_BR_0_325_BW_0_3 = FLRCBitrateBandwidth(0xC7)
|
|
FLRC_BR_0_260_BW_0_3 = FLRCBitrateBandwidth(0xEB)
|
|
|
|
// Coding Rate
|
|
FLRC_CR_1_2 = FLRCCodingRate(0x00) // 1/2
|
|
FLRC_CR_3_4 = FLRCCodingRate(0x02) // 3/4
|
|
FLRC_CR_1_0 = FLRCCodingRate(0x04) // 1
|
|
|
|
// FLRC Packet Params
|
|
// Preamble Length
|
|
FLRC_PREAMBLE_LENGTH_4_BITS = FLRCPreambleLength(0x00)
|
|
FLRC_PREAMBLE_LENGTH_8_BITS = FLRCPreambleLength(0x10)
|
|
FLRC_PREAMBLE_LENGTH_12_BITS = FLRCPreambleLength(0x20)
|
|
FLRC_PREAMBLE_LENGTH_16_BITS = FLRCPreambleLength(0x30)
|
|
FLRC_PREAMBLE_LENGTH_20_BITS = FLRCPreambleLength(0x40)
|
|
FLRC_PREAMBLE_LENGTH_24_BITS = FLRCPreambleLength(0x50)
|
|
FLRC_PREAMBLE_LENGTH_28_BITS = FLRCPreambleLength(0x60)
|
|
FLRC_PREAMBLE_LENGTH_32_BITS = FLRCPreambleLength(0x70)
|
|
|
|
// Sync Word Length
|
|
FLRC_SYNC_WORD_LEN_0 = FLRCSyncWordLength(0x00)
|
|
FLRC_SYNC_WORD_LEN_32_BITS = FLRCSyncWordLength(0x04)
|
|
|
|
// Sync Word Match
|
|
FLRC_SYNC_WORD_MATCH_DISABLE = FLRCSyncWordMatch(0x00) // Disable Sync Word
|
|
FLRC_SYNC_WORD_MATCH_1 = FLRCSyncWordMatch(0x10) // Sync Word 1
|
|
FLRC_SYNC_WORD_MATCH_2 = FLRCSyncWordMatch(0x20) // Sync Word 2
|
|
FLRC_SYNC_WORD_MATCH_1_2 = FLRCSyncWordMatch(0x30) // Sync Word 1 or Sync Word 2
|
|
FLRC_SYNC_WORD_MATCH_3 = FLRCSyncWordMatch(0x40) // Sync Word 3
|
|
FLRC_SYNC_WORD_MATCH_1_3 = FLRCSyncWordMatch(0x50) // Sync Word 1 or Sync Word 3
|
|
FLRC_SYNC_WORD_MATCH_2_3 = FLRCSyncWordMatch(0x60) // Sync Word 2 or Sync Word 3
|
|
FLRC_SYNC_WORD_MATCH_1_2_3 = FLRCSyncWordMatch(0x70) // Sync Word 1 or Sync Word 2 or Sync Word 3
|
|
|
|
// Header Type
|
|
FLRC_HEADER_FIXED_LENGTH = FLRCHeaderType(0x00)
|
|
FLRC_HEADER_VARIABLE_LENGTH = FLRCHeaderType(0x20)
|
|
|
|
// CRC Type
|
|
FLRC_CRC_OFF = FLRCCrcType(0x00)
|
|
FLRC_CRC_1_BYTE = FLRCCrcType(0x10)
|
|
FLRC_CRC_2_BYTES = FLRCCrcType(0x20)
|
|
FLRC_CRC_3_BYTES = FLRCCrcType(0x30)
|
|
|
|
// LoRa Modulation Params
|
|
|
|
// SpreadingFactor
|
|
LORA_SF_5 = LoRaSpreadingFactor(0x50)
|
|
LORA_SF_6 = LoRaSpreadingFactor(0x60)
|
|
LORA_SF_7 = LoRaSpreadingFactor(0x70)
|
|
LORA_SF_8 = LoRaSpreadingFactor(0x80)
|
|
LORA_SF_9 = LoRaSpreadingFactor(0x90)
|
|
LORA_SF_10 = LoRaSpreadingFactor(0xA0)
|
|
LORA_SF_11 = LoRaSpreadingFactor(0xB0)
|
|
LORA_SF_12 = LoRaSpreadingFactor(0xC0)
|
|
|
|
// Bandwidth
|
|
LORA_BW_1600 = LoRaBandwidth(0x0A)
|
|
LORA_BW_800 = LoRaBandwidth(0x18)
|
|
LORA_BW_400 = LoRaBandwidth(0x26)
|
|
LORA_BW_200 = LoRaBandwidth(0x34)
|
|
|
|
// CodingRate
|
|
LORA_CR_4_5 = LoRaCodingRate(0x01)
|
|
LORA_CR_4_6 = LoRaCodingRate(0x02)
|
|
LORA_CR_4_7 = LoRaCodingRate(0x03)
|
|
LORA_CR_4_8 = LoRaCodingRate(0x04)
|
|
LORA_CR_LI_4_5 = LoRaCodingRate(0x05)
|
|
LORA_CR_LI_4_6 = LoRaCodingRate(0x06)
|
|
LORA_CR_LI_4_8 = LoRaCodingRate(0x07)
|
|
|
|
// LoraPacketParams
|
|
// HeaderType
|
|
LORA_HEADER_EXPLICIT = LoRaHeaderType(0x00)
|
|
LORA_HEADER_IMPLICIT = LoRaHeaderType(0x80)
|
|
|
|
// CRC Type
|
|
LORA_CRC_ENABLE = LoRaCrcType(0x20)
|
|
LORA_CRC_DISABLE = LoRaCrcType(0x00)
|
|
|
|
// IQ Type
|
|
LORA_IQ_INVERTED = LoRaIqType(0x00)
|
|
LORA_IQ_STD = LoRaIqType(0x40)
|
|
|
|
// RegulatorMode
|
|
REGULATOR_LDO = RegulatorMode(0)
|
|
REGULATOR_DC_DC = RegulatorMode(1)
|
|
|
|
// IRQ masks
|
|
IRQ_ALL_MASK = IRQMask(0xFFFF)
|
|
IRQ_NONE_MASK = IRQMask(0x0000)
|
|
IRQ_TX_DONE_MASK = IRQMask(0b0000000000000001)
|
|
IRQ_RX_DONE_MASK = IRQMask(0b0000000000000010)
|
|
IRQ_SYNC_WORD_VALID_MASK = IRQMask(0b0000000000000100)
|
|
IRQ_SYNC_WORD_ERROR_MASK = IRQMask(0b0000000000001000)
|
|
IRQ_HEADER_VALID_MASK = IRQMask(0b0000000000010000)
|
|
IRQ_HEADER_ERROR_MASK = IRQMask(0b0000000000100000)
|
|
IRQ_CRC_ERROR_MASK = IRQMask(0b0000000001000000)
|
|
IRQ_RANGING_SLAVE_RESPONSE_DONE_MASK = IRQMask(0b0000000010000000)
|
|
IRQ_RANGING_SLAVE_RESPONSE_DISCARD_MASK = IRQMask(0b0000000100000000)
|
|
IRQ_RANGING_MASTER_RESULT_VALID_MASK = IRQMask(0b0000001000000000)
|
|
IRQ_RANGING_MASTER_TIMEOUT_MASK = IRQMask(0b0000010000000000)
|
|
IRQ_RANGING_SLAVE_REQUEST_VALID_MASK = IRQMask(0b0000100000000000)
|
|
IRQ_CAD_DONE_MASK = IRQMask(0b0001000000000000)
|
|
IRQ_CAD_DETECTED_MASK = IRQMask(0b0010000000000000)
|
|
IRQ_RX_TX_TIMEOUT_MASK = IRQMask(0b0100000000000000)
|
|
IRQ_PREAMBLE_DETECTED_MASK = IRQMask(0b1000000000000000)
|
|
IRQ_ADVANCED_RANGING_DONE_MASK = IRQMask(0b1000000000000000)
|
|
|
|
// GFSK Packet Info
|
|
GFSK_SYNC_ERROR = GFSKPacketInfo(0b1000000)
|
|
GFSK_LENGTH_ERROR = GFSKPacketInfo(0b0100000)
|
|
GFSK_CRC_ERROR = GFSKPacketInfo(0b0010000)
|
|
GFSK_ABORT_ERROR = GFSKPacketInfo(0b0001000)
|
|
GFSK_HEADER_RECEIVED = GFSKPacketInfo(0b0000100)
|
|
GFSK_PACKET_RECEIVED = GFSKPacketInfo(0b0000010)
|
|
GFSK_PACKET_CRTL_BUSY = GFSKPacketInfo(0b0000001)
|
|
|
|
// BLE Packet Info
|
|
BLE_SYNC_ERROR = BLEPacketInfo(0b1000000)
|
|
BLE_LENGTH_ERROR = BLEPacketInfo(0b0100000)
|
|
BLE_CRC_ERROR = BLEPacketInfo(0b0010000)
|
|
BLE_ABORT_ERROR = BLEPacketInfo(0b0001000)
|
|
BLE_HEADER_RECEIVED = BLEPacketInfo(0b0000100)
|
|
BLE_PACKET_RECEIVED = BLEPacketInfo(0b0000010)
|
|
BLE_PACKET_CRTL_BUSY = BLEPacketInfo(0b0000001)
|
|
|
|
// FLRC Packet Info
|
|
FLRC_SYNC_ERROR = FLRCPacketInfo(0b1000000)
|
|
FLRC_LENGTH_ERROR = FLRCPacketInfo(0b0100000)
|
|
FLRC_CRC_ERROR = FLRCPacketInfo(0b0010000)
|
|
FLRC_ABORT_ERROR = FLRCPacketInfo(0b0001000)
|
|
FLRC_HEADER_RECEIVED = FLRCPacketInfo(0b0000100)
|
|
FLRC_PACKET_RECEIVED = FLRCPacketInfo(0b0000010)
|
|
FLRC_PACKET_CRTL_BUSY = FLRCPacketInfo(0b0000001)
|
|
)
|