
Calling errors.New in an error path causes a heap allocation at an already unfortunate moment. It is more efficient to create these error values in globals and return these constant globals. If these errors are not used (because the related code was optimized out), the globals will also be optimized out.
47 строки
1,7 КиБ
Go
47 строки
1,7 КиБ
Go
// +build avr nrf sam stm32,!stm32f4disco fe310
|
|
|
|
package machine
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
// TWI_FREQ is the I2C bus speed. Normally either 100 kHz, or 400 kHz for high-speed bus.
|
|
const (
|
|
TWI_FREQ_100KHZ = 100000
|
|
TWI_FREQ_400KHZ = 400000
|
|
)
|
|
|
|
var (
|
|
errI2CWriteTimeout = errors.New("I2C timeout during write")
|
|
errI2CReadTimeout = errors.New("I2C timeout during read")
|
|
errI2CBusReadyTimeout = errors.New("I2C timeout on bus ready")
|
|
errI2CSignalStartTimeout = errors.New("I2C timeout on signal start")
|
|
errI2CSignalReadTimeout = errors.New("I2C timeout on signal read")
|
|
errI2CSignalStopTimeout = errors.New("I2C timeout on signal stop")
|
|
errI2CAckExpected = errors.New("I2C error: expected ACK not NACK")
|
|
errI2CBusError = errors.New("I2C bus error")
|
|
)
|
|
|
|
// WriteRegister transmits first the register and then the data to the
|
|
// peripheral device.
|
|
//
|
|
// Many I2C-compatible devices are organized in terms of registers. This method
|
|
// is a shortcut to easily write to such registers. Also, it only works for
|
|
// devices with 7-bit addresses, which is the vast majority.
|
|
func (i2c I2C) WriteRegister(address uint8, register uint8, data []byte) error {
|
|
buf := make([]uint8, len(data)+1)
|
|
buf[0] = register
|
|
copy(buf[1:], data)
|
|
return i2c.Tx(uint16(address), buf, nil)
|
|
}
|
|
|
|
// ReadRegister transmits the register, restarts the connection as a read
|
|
// operation, and reads the response.
|
|
//
|
|
// Many I2C-compatible devices are organized in terms of registers. This method
|
|
// is a shortcut to easily read such registers. Also, it only works for devices
|
|
// with 7-bit addresses, which is the vast majority.
|
|
func (i2c I2C) ReadRegister(address uint8, register uint8, data []byte) error {
|
|
return i2c.Tx(uint16(address), []byte{register}, data)
|
|
}
|