Files
drivers/examples/mcp23017-multiple/main.go
T
Ayke van Laethem 16d2b71820 all: do not use machine.TWI_FREQ_* constants
These constants were always a bit weird:

  * they use an uncommon name (TWI instead of I2C)
  * they don't follow Go naming conventions (CamelCase)
  * the constants don't provide much value: their name is their value
    (100KHZ => 100e3).

Therefore, I propose we remove them and replace them with regular
numeric constants.
2021-02-06 11:21:37 +01:00

46 lines
1.2 KiB
Go

// This example demonstrates putting several mcp23017 devices together into
// a single virtual I/O array.
package main
import (
"machine"
"tinygo.org/x/drivers/mcp23017"
)
func main() {
err := machine.I2C0.Configure(machine.I2CConfig{
Frequency: 400e3,
})
if err != nil {
panic(err)
}
// Assume the devices are at addresses 0x20, 0x21
dev, err := mcp23017.NewI2CDevices(machine.I2C0, 0x20, 0x21)
if err != nil {
panic(err)
}
// Configure pin 0 for input and all the others for output.
if err := dev.SetModes([]mcp23017.PinMode{
mcp23017.Input | mcp23017.Pullup,
mcp23017.Output,
}); err != nil {
panic(err)
}
input := dev.Pin(0)
// Make a mask that represents all the output pins.
// Note that this leverages the driver behaviour which replicates the highest bit in
// the last slice element (1 in this case) to all other pins
outputMask := mcp23017.PinSlice{^mcp23017.Pins(1 << 0)} // All except pin 0
inputVal, err := input.Get()
if err != nil {
panic(err)
}
println("input value: ", inputVal)
// Set the values of all the output pins.
err = dev.SetPins(mcp23017.PinSlice{0b1011011_01101110, 0b11111101_11100110}, outputMask)
if err != nil {
panic(err)
}
}