Skip to content

Commit 044bd8e

Browse files
soypatdeadprogram
authored andcommitted
rp2040: provide better errors for invalid pins on i2c and spi (#3443)
machine/rp2040: provide better errors for invalid pins on i2c and spi
1 parent ba7ece6 commit 044bd8e

File tree

2 files changed

+41
-2
lines changed

2 files changed

+41
-2
lines changed

src/machine/machine_rp2040_i2c.go

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ var (
5757
ErrInvalidTgtAddr = errors.New("invalid target i2c address not in 0..0x80 or is reserved")
5858
ErrI2CGeneric = errors.New("i2c error")
5959
ErrRP2040I2CDisable = errors.New("i2c rp2040 peripheral timeout in disable")
60+
errInvalidI2CSDA = errors.New("invalid I2C SDA pin")
61+
errInvalidI2CSCL = errors.New("invalid I2C SCL pin")
6062
)
6163

6264
// Tx performs a write and then a read transfer placing the result in
@@ -90,7 +92,7 @@ func (i2c *I2C) Tx(addr uint16, w, r []byte) error {
9092
// SCL: 3, 7, 11, 15, 19, 27
9193
func (i2c *I2C) Configure(config I2CConfig) error {
9294
const defaultBaud uint32 = 100_000 // 100kHz standard mode
93-
if config.SCL == 0 {
95+
if config.SCL == 0 && config.SDA == 0 {
9496
// If config pins are zero valued or clock pin is invalid then we set default values.
9597
switch i2c.Bus {
9698
case rp.I2C0:
@@ -101,6 +103,21 @@ func (i2c *I2C) Configure(config I2CConfig) error {
101103
config.SDA = I2C1_SDA_PIN
102104
}
103105
}
106+
var okSDA, okSCL bool
107+
switch i2c.Bus {
108+
case rp.I2C0:
109+
okSDA = config.SDA%4 == 0
110+
okSCL = (config.SCL+1)%4 == 0
111+
case rp.I2C1:
112+
okSDA = (config.SDA+2)%4 == 0
113+
okSCL = (config.SCL+3)%4 == 0
114+
}
115+
116+
if !okSDA {
117+
return errInvalidI2CSDA
118+
} else if !okSCL {
119+
return errInvalidI2CSCL
120+
}
104121
if config.Frequency == 0 {
105122
config.Frequency = defaultBaud
106123
}

src/machine/machine_rp2040_spi.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ var (
4040
ErrLSBNotSupported = errors.New("SPI LSB unsupported on PL022")
4141
ErrSPITimeout = errors.New("SPI timeout")
4242
ErrSPIBaud = errors.New("SPI baud too low or above 66.5Mhz")
43+
errSPIInvalidSDI = errors.New("invalid SPI SDI pin")
44+
errSPIInvalidSDO = errors.New("invalid SPI SDO pin")
45+
errSPIInvalidSCK = errors.New("invalid SPI SCK pin")
4346
)
4447

4548
type SPI struct {
@@ -162,7 +165,7 @@ func (spi SPI) GetBaudRate() uint32 {
162165
// No pin configuration is needed of SCK, SDO and SDI needed after calling Configure.
163166
func (spi SPI) Configure(config SPIConfig) error {
164167
const defaultBaud uint32 = 115200
165-
if config.SCK == 0 {
168+
if config.SCK == 0 && config.SDO == 0 && config.SDI == 0 {
166169
// set default pins if config zero valued or invalid clock pin supplied.
167170
switch spi.Bus {
168171
case rp.SPI0:
@@ -175,6 +178,25 @@ func (spi SPI) Configure(config SPIConfig) error {
175178
config.SDI = SPI1_SDI_PIN
176179
}
177180
}
181+
var okSDI, okSDO, okSCK bool
182+
switch spi.Bus {
183+
case rp.SPI0:
184+
okSDI = config.SDI == 0 || config.SDI == 4 || config.SDI == 17
185+
okSDO = config.SDO == 3 || config.SDO == 7 || config.SDO == 19
186+
okSCK = config.SCK == 2 || config.SCK == 6 || config.SCK == 18
187+
case rp.SPI1:
188+
okSDI = config.SDI == 8 || config.SDI == 12
189+
okSDO = config.SDO == 11 || config.SDO == 15
190+
okSDO = config.SCK == 10 || config.SCK == 14
191+
}
192+
193+
if !okSDI {
194+
return errSPIInvalidSDI
195+
} else if !okSDO {
196+
return errSPIInvalidSDO
197+
} else if !okSCK {
198+
return errSPIInvalidSCK
199+
}
178200
if config.DataBits < 4 || config.DataBits > 16 {
179201
config.DataBits = 8
180202
}

0 commit comments

Comments
 (0)