Skip to content

Commit 20b0985

Browse files
jwetzellCopilot
andcommitted
add SPI driver for semtech sx128x chips
Co-authored-by: Copilot <copilot@github.com>
1 parent 2673cc1 commit 20b0985

3 files changed

Lines changed: 784 additions & 0 deletions

File tree

sx128x/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# SX128x Radio
2+
Radio from Semtech in the 2.4 GHz band. This driver uses SPI to communicate with the radio instead of the alternative UART interface.
3+
4+
## Supported Chips
5+
- [SX1280](https://www.semtech.com/products/wireless-rf/lora-connect/sx1280)
6+
- [SX1281](https://www.semtech.com/products/wireless-rf/lora-connect/sx1281)
7+

sx128x/registers.go

Lines changed: 244 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,244 @@
1+
package sx128x
2+
3+
const (
4+
// SX128X SPI commands
5+
CMD_NOP = uint8(0x00)
6+
7+
CMD_SET_UART_SPEED = uint8(0x9D)
8+
CMD_GET_STATUS = uint8(0xC0)
9+
10+
// Register Access Operations
11+
CMD_WRITE_REGISTER = uint8(0x18)
12+
CMD_READ_REGISTER = uint8(0x19)
13+
14+
// Data Buffer Operations
15+
CMD_WRITE_BUFFER = uint8(0x1A)
16+
CMD_READ_BUFFER = uint8(0x1B)
17+
18+
// Radio Operation Modes
19+
CMD_SET_SLEEP = uint8(0x84)
20+
CMD_SET_STANDBY = uint8(0x80)
21+
CMD_SET_FS = uint8(0xC1)
22+
CMD_SET_TX = uint8(0x83)
23+
CMD_SET_RX = uint8(0x82)
24+
CMD_SET_RX_DUTY_CYCLE = uint8(0x94)
25+
CMD_SET_LONG_PREAMBLE = uint8(0x9B)
26+
CMD_SET_CAD = uint8(0xC5)
27+
CMD_SET_TX_CONTINUOUS_WAVE = uint8(0xD1)
28+
CMD_SET_TX_CONTINUOUS_PREAMBLE = uint8(0xD2)
29+
CMD_SET_AUTO_TX = uint8(0x98)
30+
CMD_SET_AUTO_FS = uint8(0x9E)
31+
32+
// Radio Configuration
33+
CMD_SET_PACKET_TYPE = uint8(0x8A)
34+
CMD_GET_PACKET_TYPE = uint8(0x03)
35+
CMD_SET_RF_FREQUENCY = uint8(0x86)
36+
CMD_SET_TX_PARAMS = uint8(0x8E)
37+
CMD_SET_CAD_PARAMS = uint8(0x88)
38+
CMD_SET_BUFFER_BASE_ADDRESS = uint8(0x8F)
39+
CMD_SET_MODULATION_PARAMS = uint8(0x8B)
40+
CMD_SET_PACKET_PARAMS = uint8(0x8C)
41+
42+
// Communication Status Information
43+
CMD_GET_RX_BUFFER_STATUS = uint8(0x17)
44+
CMD_GET_PACKET_STATUS = uint8(0x1D)
45+
CMD_GET_RSSI_INST = uint8(0x1F)
46+
47+
// IRQ Handling
48+
CMD_SET_DIO_IRQ_PARAMS = uint8(0x8D)
49+
CMD_GET_IRQ_STATUS = uint8(0x15)
50+
CMD_CLEAR_IRQ_STATUS = uint8(0x97)
51+
52+
// Miscellaneous
53+
CMD_SET_REGULATOR_MODE = uint8(0x96)
54+
CMD_SET_SAVE_CONTEXT = uint8(0xD5)
55+
56+
// GetStatus
57+
CIRCUIT_MODE_MASK = uint8(0b11100000)
58+
CIRCUIT_MODE_STDBY_RC = uint8(0x2)
59+
CIRCUIT_MODE_STDBY_XOSC = uint8(0x3)
60+
CIRCUIT_MODE_FS = uint8(0x4)
61+
CIRCUIT_MODE_RX = uint8(0x5)
62+
CIRCUIT_MODE_TX = uint8(0x6)
63+
64+
COMMAND_STATUS_MASK = uint8(0b00011100)
65+
COMMAND_STATUS_SUCCESS = uint8(0x1)
66+
COMMAND_STATUS_DATA_AVAILABLE = uint8(0x2)
67+
COMMAND_STATUS_TIMEOUT = uint8(0x3)
68+
COMMAND_STATUS_PROCESSING_ERROR = uint8(0x4)
69+
COMMAND_STATUS_EXECUTION_ERROR = uint8(0x5)
70+
COMMAND_STATUS_TX_DONE = uint8(0x6)
71+
72+
// SleepConfig
73+
SLEEP_DATA_BUFFER_RETAIN = uint8(2)
74+
SLEEP_DATA_RAM_RETAIN = uint8(1)
75+
76+
// StandbyConfig
77+
STANDBY_RC = uint8(0)
78+
STANDBY_XOSC = uint8(1)
79+
80+
// PeriodBase
81+
PERIOD_BASE_15_625_US = uint8(0)
82+
PERIOD_BASE_62_5_US = uint8(1)
83+
PERIOD_BASE_1_MS = uint8(2)
84+
PERIOD_BASE_4_MS = uint8(3)
85+
86+
RX_CONTINUOUS_MODE = uint16(0xFFFF)
87+
88+
// LongPreamble
89+
LONG_PREAMBLE_ENABLE = uint8(1)
90+
LONG_PREAMBLE_DISABLE = uint8(0)
91+
92+
// AutoFs
93+
AUTO_FS_ENABLE = uint8(1)
94+
AUTO_FS_DISABLE = uint8(0)
95+
96+
// PacketType
97+
PACKET_TYPE_GFSK = uint8(0x00) // default
98+
PACKET_TYPE_LORA = uint8(0x01)
99+
PACKET_TYPE_RANGING = uint8(0x02)
100+
PACKET_TYPE_FLRC = uint8(0x03)
101+
PACKET_TYPE_BLE = uint8(0x04)
102+
103+
// RampTime
104+
RADIO_RAMP_02_US = uint8(0x00)
105+
RADIO_RAMP_04_US = uint8(0x20)
106+
RADIO_RAMP_06_US = uint8(0x40)
107+
RADIO_RAMP_08_US = uint8(0x60)
108+
RADIO_RAMP_10_US = uint8(0x80)
109+
RADIO_RAMP_12_US = uint8(0xA0)
110+
RADIO_RAMP_16_US = uint8(0xC0)
111+
RADIO_RAMP_20_US = uint8(0xE0)
112+
113+
// CadSymbolNum
114+
LORA_CAD_01_SYMBOL = uint8(0x00)
115+
LORA_CAD_02_SYMBOLS = uint8(0x20)
116+
LORA_CAD_04_SYMBOLS = uint8(0x40)
117+
LORA_CAD_08_SYMBOLS = uint8(0x60)
118+
LORA_CAD_16_SYMBOLS = uint8(0x80)
119+
120+
// SpreadingFactor
121+
LORA_SF_5 = uint8(0x50)
122+
LORA_SF_6 = uint8(0x60)
123+
LORA_SF_7 = uint8(0x70)
124+
LORA_SF_8 = uint8(0x80)
125+
LORA_SF_9 = uint8(0x90)
126+
LORA_SF_10 = uint8(0xA0)
127+
LORA_SF_11 = uint8(0xB0)
128+
LORA_SF_12 = uint8(0xC0)
129+
130+
// Bandwidth
131+
LORA_BW_1600 = uint8(0x0A)
132+
LORA_BW_800 = uint8(0x18)
133+
LORA_BW_400 = uint8(0x26)
134+
LORA_BW_200 = uint8(0x34)
135+
136+
// CodingRate
137+
LORA_CR_4_5 = uint8(0x01)
138+
LORA_CR_4_6 = uint8(0x02)
139+
LORA_CR_4_7 = uint8(0x03)
140+
LORA_CR_4_8 = uint8(0x04)
141+
LORA_CR_LI_4_5 = uint8(0x05)
142+
LORA_CR_LI_4_6 = uint8(0x06)
143+
LORA_CR_LI_4_8 = uint8(0x07)
144+
145+
// LoraPacketParams
146+
LORA_EXPLICIT_HEADER = uint8(0x00)
147+
LORA_IMPLICIT_HEADER = uint8(0x80)
148+
149+
LORA_CRC_ENABLE = uint8(0x20)
150+
LORA_CRC_DISABLE = uint8(0x00)
151+
152+
LORA_IQ_INVERTED = uint8(0x00)
153+
LORA_IQ_STD = uint8(0x40)
154+
155+
// RegulatorMode
156+
REGULATOR_LDO = uint8(0)
157+
REGULATOR_DC_DC = uint8(1)
158+
159+
// IRQ masks
160+
IRQ_ALL_MASK = uint16(0xFFFF)
161+
IRQ_NONE_MASK = uint16(0x0000)
162+
IRQ_TX_DONE_MASK = uint16(0b0000000000000001)
163+
IRQ_RX_DONE_MASK = uint16(0b0000000000000010)
164+
IRQ_SYNC_WORD_VALID_MASK = uint16(0b0000000000000100)
165+
IRQ_SYNC_WORD_ERROR_MASK = uint16(0b0000000000001000)
166+
IRQ_HEADER_VALID_MASK = uint16(0b0000000000010000)
167+
IRQ_HEADER_ERROR_MASK = uint16(0b0000000000100000)
168+
IRQ_CRC_ERROR_MASK = uint16(0b0000000001000000)
169+
IRQ_RANGING_SLAVE_RESPONSE_DONE_MASK = uint16(0b0000000010000000)
170+
IRQ_RANGING_SLAVE_RESPONSE_DISCARD_MASK = uint16(0b0000000100000000)
171+
IRQ_RANGING_MASTER_RESULT_VALID_MASK = uint16(0b0000001000000000)
172+
IRQ_RANGING_MASTER_TIMEOUT_MASK = uint16(0b0000010000000000)
173+
IRQ_RANGING_SLAVE_REQUEST_VALID_MASK = uint16(0b0000100000000000)
174+
IRQ_CAD_DONE_MASK = uint16(0b0001000000000000)
175+
IRQ_CAD_DETECTED_MASK = uint16(0b0010000000000000)
176+
IRQ_RX_TX_TIMEOUT_MASK = uint16(0b0100000000000000)
177+
IRQ_PREAMBLE_DETECTED_MASK = uint16(0b1000000000000000)
178+
IRQ_ADVANCED_RANGING_DONE_MASK = uint16(0b1000000000000000)
179+
180+
// SX128X register map
181+
REG_FIRMWARE_VERSIONS = uint16(0x153)
182+
REG_RX_GAIN = uint16(0x891)
183+
REG_MANUAL_GAIN_SETTING = uint16(0x895)
184+
REG_LNA_GAIN_VALUE = uint16(0x89E)
185+
REG_LNA_GAIN_CONTROL = uint16(0x89F)
186+
REG_SYNCH_PEAK_ATTENUATION = uint16(0x8C2)
187+
REG_PAYLOAD_LENGTH = uint16(0x901)
188+
REG_LORA_HEADER_MODE = uint16(0x903)
189+
REG_RANGING_REQUEST_ADDRESS_BYTE_3 = uint16(0x912)
190+
REG_RANGING_REQUEST_ADDRESS_BYTE_2 = uint16(0x913)
191+
REG_RANGING_REQUEST_ADDRESS_BYTE_1 = uint16(0x914)
192+
REG_RANGING_REQUEST_ADDRESS_BYTE_0 = uint16(0x915)
193+
REG_RANGING_DEVICE_ADDRESS_BYTE_3 = uint16(0x916)
194+
REG_RANGING_DEVICE_ADDRESS_BYTE_2 = uint16(0x917)
195+
REG_RANGING_DEVICE_ADDRESS_BYTE_1 = uint16(0x918)
196+
REG_RANGING_DEVICE_ADDRESS_BYTE_0 = uint16(0x919)
197+
REG_RANGING_FILTER_WINDOW_SIZE = uint16(0x91E)
198+
REG_RESET_RANGING_FILTER = uint16(0x923)
199+
REG_RANGING_RESULT_MUX = uint16(0x924)
200+
REG_SF_ADDITIONAL_CONFIGURATION = uint16(0x925)
201+
REG_RANGING_CALIBRATION_BYTE_2 = uint16(0x92B)
202+
REG_RANGING_CALIBRATION_BYTE_1 = uint16(0x92C)
203+
REG_RANGING_CALIBRATION_BYTE_0 = uint16(0x92D)
204+
REG_RANGING_ID_CHECK_LENGTH = uint16(0x931)
205+
REG_FREQUENCY_ERROR_CORRECTION = uint16(0x93C)
206+
REG_CAD_DETECT_PEAK = uint16(0x942)
207+
REG_LORA_SYNC_WORD_MSB = uint16(0x944)
208+
REG_LORA_SYNC_WORD_LSB = uint16(0x945)
209+
REG_HEADER_CRC = uint16(0x954)
210+
REG_CODING_RATE = uint16(0x950)
211+
REG_FEI_BYTE_2 = uint16(0x954)
212+
REG_FEI_BYTE_1 = uint16(0x955)
213+
REG_FEI_BYTE_0 = uint16(0x956)
214+
REG_RANGING_RESULT_BYTE_2 = uint16(0x961)
215+
REG_RANGING_RESULT_BYTE_1 = uint16(0x962)
216+
REG_RANGING_RESULT_BYTE_0 = uint16(0x963)
217+
REG_RANGING_RSSI = uint16(0x964)
218+
REG_FREEZE_RANGING_RESULT = uint16(0x97F)
219+
REG_PACKET_PREAMBLE_SETTINGS = uint16(0x9C1)
220+
REG_WHITENING_INITIAL_VALUE = uint16(0x9C5)
221+
REG_CRC_POLYNOMIAL_DEFINITION_MSB = uint16(0x9C6)
222+
REG_CRC_POLYNOMIAL_DEFINITION_LSB = uint16(0x9C7)
223+
REG_CRC_POLYNOMIAL_SEED_BYTE_2 = uint16(0x9C7)
224+
REG_CRC_POLYNOMIAL_SEED_BYTE_1 = uint16(0x9C8)
225+
REG_CRC_POLYNOMIAL_SEED_BYTE_0 = uint16(0x9C9)
226+
REG_CRC_MSB_INITIAL_VALUE = uint16(0x9C8)
227+
REG_CRC_LSB_INITIAL_VALUE = uint16(0x9C9)
228+
REG_SYNC_ADDRESS_CONTROL = uint16(0x9CD)
229+
REG_SYNC_ADDRESS_1_BYTE_4 = uint16(0x9CE)
230+
REG_SYNC_ADDRESS_1_BYTE_3 = uint16(0x9CF)
231+
REG_SYNC_ADDRESS_1_BYTE_2 = uint16(0x9D0)
232+
REG_SYNC_ADDRESS_1_BYTE_1 = uint16(0x9D1)
233+
REG_SYNC_ADDRESS_1_BYTE_0 = uint16(0x9D2)
234+
REG_SYNC_ADDRESS_2_BYTE_4 = uint16(0x9D3)
235+
REG_SYNC_ADDRESS_2_BYTE_3 = uint16(0x9D4)
236+
REG_SYNC_ADDRESS_2_BYTE_2 = uint16(0x9D5)
237+
REG_SYNC_ADDRESS_2_BYTE_1 = uint16(0x9D6)
238+
REG_SYNC_ADDRESS_2_BYTE_0 = uint16(0x9D7)
239+
REG_SYNC_ADDRESS_3_BYTE_4 = uint16(0x9D8)
240+
REG_SYNC_ADDRESS_3_BYTE_3 = uint16(0x9D9)
241+
REG_SYNC_ADDRESS_3_BYTE_2 = uint16(0x9DA)
242+
REG_SYNC_ADDRESS_3_BYTE_1 = uint16(0x9DB)
243+
REG_SYNC_ADDRESS_3_BYTE_0 = uint16(0x9DC)
244+
)

0 commit comments

Comments
 (0)