47 строки
1,8 КиБ
Go
47 строки
1,8 КиБ
Go
// +build avr nrf sam stm32,!stm32f7x2,!stm32l5x2,!stm32l0,!stm32l4x2 fe310 k210
|
|
|
|
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)
|
|
}
|