使用golang.org/x/exp/io/i2c读取AS3935寄存器时功能异常的疑问
AS3935模块与golang.org/x/exp/io/i2c的ReadReg参数疑问
我用golang.org/x/exp/io/i2c库处理AS3935模块,该模块拥有9个可读写寄存器,地址范围为0x00至0x08。调用ReadReg函数(官方描述为:ReadReg与Read类似,但从寄存器读取数据)时,无论指定哪个地址字节作为第一个参数,总是返回第一个寄存器的值;只有增大缓冲区后,才能在缓冲区的后续字段中看到后续寄存器的值。请问该寄存器参数的作用是什么?
辅助读写函数
type module struct { // 每次调用只读写一个字节,所以缓冲区大小设为1 BufferRead []uint8 BufferWrite []uint8 // ... 其他无关字段 } // 从offset指定的寄存器读取值 func (m *module) RegRead(offset uint8) (uint8, error) { err := m.Device.ReadReg(offset, m.BufferRead) if err != nil { return 0x00, err } return m.BufferRead[0], nil } // 将value写入offset指定的寄存器 func (m *module) RegWrite(offset, value uint8) error { m.BufferWrite[0] = value err := m.Device.WriteReg(offset, m.BufferWrite) if err != nil { return err } return nil }
解答
ReadReg的第一个参数(也就是你代码里的offset)是I2C读取操作的起始寄存器地址,作用是告诉AS3935模块:从这个地址开始,把寄存器的数据输出给主机。
你遇到的现象和AS3935的I2C协议特性直接相关:
- 该模块支持寄存器地址自动递增:当你发起一次读请求后,模块会从指定的起始地址开始输出数据,每输出一个字节,寄存器地址就自动加1,直到缓冲区被填满或者主机停止读取。
- 你当前的
BufferRead大小为1,理论上应该读到指定起始地址的寄存器值。如果实际结果总是返回第一个寄存器的值,大概率是以下问题导致:- 缓冲区复用未重置:比如
BufferRead没有在每次读取前清空,导致返回上一次的旧数据; - 硬件或配置异常:比如模块的I2C地址配置错误,或者模块未进入正常工作状态;
- 设备初始化问题:确认
m.Device是否正确绑定了AS3935的I2C地址并完成初始化。
- 缓冲区复用未重置:比如
当你增大缓冲区后能在后续位置看到对应寄存器的值,正好验证了地址自动递增的特性——模块从你指定的起始地址开始,连续填充数据到缓冲区中。
内容的提问来源于stack exchange,提问作者Krzysztofz01
相关产品推荐
相关产品推荐

