Go实现树莓派读取at24c02 eeprom读写数据

步骤

启用i2c

参考 Go实现树莓派读取bh1750光照强度

代码

package mainimport ("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{}//err error)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 = nilreturn 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) (err error) {var (//recvBytes  = make([]byte, 1)datLen   = len(bs)pageSize = 8 // 数据手册是 8byte, 树莓派可支持16字节/页addr     = startAddrstartIdx = 0endIdx   = pageSize - int(startAddr)%pageSize)if endIdx > datLen {endIdx = datLen}for {fmt.Println("Addr: ", addr, ", startIndex: ", startIdx, ", endIndex: ", endIdx, bs)if err = b.writePage(addr, bs[startIdx:endIdx]); nil != err {return}time.Sleep(time.Millisecond * 5)if endIdx >= datLen {break}addr += uint(pageSize)startIdx = endIdxendIdx += pageSizeif endIdx > datLen {endIdx = datLen}}return
}func (b *AT24C02Device) writePage(startAddr uint, bs []byte) error {var writeBytes = make([]byte, 1)writeBytes[0] = byte(startAddr)writeBytes = append(writeBytes, bs...)_, err := b.dev.Write(writeBytes)return err
}

测试

// 初始化硬件if _, err := host.Init(); err != nil {log.Fatal(err)}// 初始化I2Ci2cBus, 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}))

在这里插入图片描述

Note

  1. 写起始地址,数据手册是word,stm写的时候也是uint16, 而树莓派实际写地址是byte, 对于256够用, 但超过256的存储模块还没试过, 不知道怎么样的
  2. 数据手册有提过, 两次写的间隔Twr时间, 5ms, 所以两次写页时延时5ms, 否则会失败。。。
    在这里插入图片描述
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/689070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot+Vue项目-基于Java+MySQL的影院订票系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Linux——基础IO(1)

前言 铺垫:文件 1.之前我们讲过文件内容属性 磁盘中创建一个空文件也要占空间(就算内容为空,文件属性也占空间) 文件操作文件内容的操作文件属性的操作 有可能在操作文件的过程中既改变内容又改变属性 2.访问文件之前,都得先打开文件 修改文…

HTTP基础概念和HTTP缓存技术

什么是HTTP HTTP是超文本传输协议,主要分为三个部分:超文本、传输、协议。 超文本是指:文字、图片、视频的混合体。传输是指:点与点之间的信息通信。协议是指:通信时的行为规范或约定 HTTP常见字段 字段名 解释 例…

2024年人工智能数据报告

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

微火一文盘点:为何全域运营系统会成为创业新风口?

当前,微火全域运营已经成为创业的新风口,想要做微火全域运营服务商的创业者数量日益增多。据目前了解到的最新消息,微火全域运营系统的市场占有率已经超过了48%,并且还在持续不断地上涨中。 所谓微火全域运营系统,就是…

浅谈C++ overload(重载) override(覆盖) overwrite(重写)

目录 1. 名词辨析2 含义解析1 overload重载2 override覆盖3 overwrite重写 3 区别4 代码示例 1. 名词辨析 关于这3个名词的中文翻译: overload翻译为重载,基本是没有歧义的;override和overwrite的翻译,我在参考了cppreference中…

营业执照OCR识别接口如何对接

营业执照OCR识别接口也叫营业执照文字识别OCR接口,指的是传入营业执照图片,精准识别静态营业执照图像上的文字信息。那么营业执照OCR识别接口如何对接呢? 首先我们找到一家有做营业执照OCR识别接口的服务商,数脉API,然后注册账户…

【Conda】解决使用清华源创建虚拟环境不成功问题

文章目录 问题描述:清华源创建不成功解决步骤1 添加官方源步骤2 删除C:/user/你的用户名/的 .condarc 文件步骤3 再次创建 问题描述:清华源创建不成功 本地配置了清华源,但是在创建虚拟环境时不成功,报错如下。 图片若看不清&…

Linux系统编程——进程控制

目录 一,进程创建 1.1 fork回顾 1.2 写时拷贝 1.3 fork用处 1.4 fork调用失败原因 二,进程退出 2.1 进程退出场景 2.2 mainCRTStartup调用 2.3 进程退出码 2.3.1 main函数返回值 2.3.2 strerror ​编辑 2.3.3 命令的退出码 2.4 进程正常退…

队列的实现以及队列如何实现栈

一、队列的定义 队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 FIFO(First In First Out) 入队列:进行插入操作的一端称为 队尾 出队列:进行删除操作的一端称为 队头 …

静态分析-RIPS-源码解析记录-01

token流扫描重构部分,这一部分主要利用php的token解析api解析出来的token流,对其中的特定token进行删除、替换、对于特定的语法结构进行重构,保持php语法结构上的一致性 解析主要在lib/scanner.php中通过Tokenizer这个类来实现,也就是在main…

欢乐钓鱼大师辅助,2024年攻略大全!

在探索欢乐钓鱼大师的世界时,成功的关键在于全面考虑各种影响钓鱼效果的因素。以下是五大关键要素,掌握它们,你也能成为一名钓鱼高手! 一、黄金钓点:位置决定一切 选择正确的钓点至关重要。考虑湖泊、河流和小溪的水深…