rp2040: i2c baud rate handling improvements
Этот коммит содержится в:
родитель
d21ffc63b9
коммит
d1f1f267a3
1 изменённых файлов: 11 добавлений и 2 удалений
|
@ -96,6 +96,7 @@ func (i2c *I2C) Tx(addr uint16, w, r []byte) error {
|
|||
// SDA: 2, 6, 10, 14, 18, 26
|
||||
// SCL: 3, 7, 11, 15, 19, 27
|
||||
func (i2c *I2C) Configure(config I2CConfig) error {
|
||||
const defaultBaud uint32 = 100_000 // 100kHz standard mode
|
||||
if config.SCL == 0 {
|
||||
// If config pins are zero valued or clock pin is invalid then we set default values.
|
||||
switch i2c.Bus {
|
||||
|
@ -107,6 +108,9 @@ func (i2c *I2C) Configure(config I2CConfig) error {
|
|||
config.SDA = I2C1_SDA_PIN
|
||||
}
|
||||
}
|
||||
if config.Frequency == 0 {
|
||||
config.Frequency = defaultBaud
|
||||
}
|
||||
config.SDA.Configure(PinConfig{PinI2C})
|
||||
config.SCL.Configure(PinConfig{PinI2C})
|
||||
return i2c.init(config)
|
||||
|
@ -116,8 +120,13 @@ func (i2c *I2C) Configure(config I2CConfig) error {
|
|||
// enabling the I2C hardware if disabled beforehand.
|
||||
//go:inline
|
||||
func (i2c *I2C) SetBaudrate(br uint32) error {
|
||||
const freqin uint32 = 125 * MHz
|
||||
// Find smallest prescale value which puts o
|
||||
|
||||
if br == 0 {
|
||||
return ErrInvalidI2CBaudrate
|
||||
}
|
||||
|
||||
// I2C is synchronous design that runs from clk_sys
|
||||
freqin := CPUFrequency()
|
||||
|
||||
// TODO there are some subtleties to I2C timing which we are completely ignoring here
|
||||
period := (freqin + br/2) / br
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче