步骤
启用i2c
参考 Go实现树莓派读取bh1750光照强度
代码
package main
import (
"fmt"
"periph.io/x/conn/v3/i2c"
)
type AT24C02Device struct {
dev *i2c.Dev
}
func NewAT24C02Device(addr uint16, bus i2c.BusCloser) (*AT24C02Device, error) {
var (
dev = &AT24C02Device{}
)
dev.dev = &i2c.Dev{Addr: addr, Bus: bus}
return dev, nil
}
func (b *AT24C02Device) Init() error {
return nil
}
func (b *AT24C02Device) Destroy() error {
b.dev = nil
return nil
}
func (b *AT24C02Device) ReadAll() ([]byte, error) {
return b.read(0, 255)
}
func (b *AT24C02Device) Read(startAddr, size uint) ([]byte, error) {
return b.read(startAddr, (startAddr+size)-1)
}
func (b *AT24C02Device) read(startAddr, endAddr uint) ([]byte, error) {
var bs = []byte{byte(startAddr)}
var readBytes = make([]byte, endAddr-startAddr+1)
fmt.Println("size: ", endAddr-startAddr+1)
err := b.dev.Tx(bs, readBytes)
return readBytes, err
}
func (b *AT24C02Device) EarseAllTo(v byte) error {
var (
bs = make([]byte, 256)
)
for i := range bs {
bs[i] = v
}
return b.write(0, bs)
}
func (b *AT24C02Device) Write(startAddr uint, bs []byte) error {
return b.write(startAddr, bs)
}
func (b *AT24C02Device) write(startAddr uint, bs []byte) error {
var (
writeBytes = make([]byte, 1)
)
writeBytes[0] = byte(startAddr)
writeBytes = append(writeBytes, bs...)
fmt.Println("Cache: ", writeBytes)
_, err := b.dev.Write(writeBytes)
return err
}
测试
if _, err := host.Init(); err != nil {
log.Fatal(err)
}
i2cBus, err := i2creg.Open("")
if err != nil {
log.Fatalf("Failed to open I2C bus: %v", err)
}
defer i2cBus.Close()
at24c02, err := NewAT24C02Device(0x51, i2cBus)
if nil != err {
fmt.Println(err)
return
}
fmt.Println(at24c02.ReadAll())
fmt.Println(at24c02.Read(0x00, 1))
fmt.Println(at24c02.Write(0x13, []byte{0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07}))