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

步骤

启用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{}
		//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 = 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) (err error) {
	var (
		//recvBytes  = make([]byte, 1)

		datLen   = len(bs)
		pageSize = 8 // 数据手册是 8byte, 树莓派可支持16字节/页

		addr     = startAddr
		startIdx = 0
		endIdx   = 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 = endIdx
		endIdx += pageSize
		if 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)
	}
	// 初始化I2C
	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}))

在这里插入图片描述

Note

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wordpress主题 7B2 PRO主题5.4.2免授权直接安装

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 WordPress 资讯、资源、社交、商城、圈子、导航等多功能商用主题:B2 PRO 其设计风格专业且时尚,功能十分强大,包括多栏布局、自定义页面、强大的主…

03c++重载运算符

1、深入理解new和delete原理 #include<iostream> using namespace std;/* new 和 delete 1、malloc和new的区别 new 内存开辟构造函数 2、free和 delete的区别 delete 内存回收析构函数 开辟失败malloc返nullptr ,new抛出bad_alloc异常new->operator new delete -&…

AppBuilder低代码体验:构建雅思大作文组件

AppBuilder低代码体验&#xff1a;构建雅思大作文组件 ​ 在4月14日&#xff0c;AppBuilder赢来了一次大更新&#xff0c;具体更新内容见&#xff1a;AppBuilder 2024.04.14发版上线公告 。本次更新最大的亮点就是**新增了工作流&#xff0c;低代码制作组件。**具体包括&#x…

JavaEE初阶-多线程4

文章目录 一、单例模式1.1 饿汉模式1.2 懒汉模式 二、阻塞队列1.1 生产者消费者模型1.1.1 现实生活举例1.1.2 生产者消费模型的两个优势1.1.2.1 解耦合1.1.2.2 削峰填谷 1.2 阻塞队列代码1.2.1 使用java标准库的阻塞队列实现生产者消费者模型1.2.2 实现自己的阻塞队列 一、单例…

【Go语言初探】(一)、Linux开发环境建立

一、操作系统选择 选择在Windows 11主机上运行的CentOS 7 Linux 虚拟机&#xff0c;虚拟化平台为VMWare Workstation. 二、安装Go语言环境 访问Go语言官网&#xff0c;选择Linux版本下载&#xff1a; 解压&#xff1a; tar -xvf go1.22.3.linux-amd64.tar.gz检验安装结果&…

uniapp + vue3 使用axios

场景 uniapp自带的uni.request不太好用&#xff0c;也有可能是自己用axios用的太熟悉了&#xff0c;所以还是用axios趁手点&#xff0c;所以尝试在uniapp中使用axios。 操作 因为uniapp项目没有package.json&#xff0c;所以先在项目根目录下执行 npm init, 执行完毕后直接…

算法设计与分析 例题解答 解空间与搜索

1.请画出用回溯法解n3的0-1背包问题的解空间树和当三个物品的重量为{20, 15, 10}&#xff0c;价值为{20, 30, 25}&#xff0c;背包容量为25时搜索空间树。 答&#xff1a; 解空间树&#xff1a; 搜索空间树&#xff1a; 2. 考虑用分支限界解0-1背包问题 给定n种物品和一背包…

线路和绕组中的波过程(三)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第三篇笔记。上一篇传送门。 冲击电晕对线路上波过程的影响 实际中的导线存在电阻&#xff0c;而且还有对地电导&#xff0c;会消耗一部分能量。但是因为雷击所涉及的传输距离很短&#xff0c;所以几乎可以忽略这…

JS代码随想录(一):数组

代码随想录 一、数组理论基础 二、LeetCode 704. 二分查找 三、LeetCode 27. 移除元素 四、LeetCode 977.有序数组的平方 五、LeetCode 209.长度最小的子数组 六、LeetCode 59.螺旋矩阵II 七、数组总结 一、数组理论基础 数组是存放在连续内存空间上的相同类型数据的集合。 数组…

你真的会用 ChatGPT 吗?来看看这 4 个模式,让你的 AI 技能更上一层楼!(上)

一年半已经过去&#xff0c;ChatGPT 虽然风靡一时&#xff0c;但真正发挥其超过 30% 效能的人却寥寥无几。许多资深用户依然沿用传统的人机交互方式&#xff0c;认为只需要事无巨细地编写指令&#xff0c;让 AI 服从即可。大多数人并不了解这些生成式 AI 的某些不为人之的特性&…

第四百九十八回

文章目录 1. 概念介绍2. 使用方法2.1 固定样式2.2 自定义样式 3. 示例代码4. 内容总结 我们在上一章回中介绍了"GetMaterialApp组件"相关的内容&#xff0c;本章回中将介绍使用get显示SnackBar.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在介…

python自动化办公的代码

以下是一个简单的Python自动化办公代码示例&#xff0c;用于实现一些基本的自动化任务&#xff0c;例如打开文件、读取数据、写入数据和保存文件等。 python import os # 打开文件 def open_file(filename): try: file open(filename, r) data file.read() file.close() ret…

如果你的Google ads账号被暂停了怎么办?

Google Ads账号暂停可能会导致您的企业收入损失。但实际上&#xff0c;除了一些特殊情况外&#xff0c;Google Ads帐户暂停几乎不是永久性的。如果您的帐户已被暂停&#xff0c;有多种方法可以恢复该帐户。 废话不多说&#xff0c;下面为大家分享&#xff01; 一、谷歌广告帐户…

用于视频识别的快慢网络

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 摘要Abstract文献阅读&#xff1a;用于视频识别的快慢网络1、文献摘要2、提出方法2.1、SlowFast模型2.2、SlowFast 提出思想 3、相关方法3.1、时空间卷积3.2、基于光…

安卓开发--按键跳转页面

安卓开发--按键跳转页面 前言1. 按键页面跳转1.1 新建布局文件1.2 衔接布局文件&#xff0c;新建Java class类文件1.3 衔接布局文件&#xff0c;修改AndroidManifest.xml文件1.4 调用布局文件1.5 最终效果 前面已经介绍了一个空白按键工程的建立以及响应方式&#xff0c;可以参…

机器学习算法应用——神经网络回归任务、神经网络分类任务

神经网络回归任务&#xff08;4-3&#xff09; 神经网络回归任务&#xff0c;通常指的是使用神经网络模型进行回归分析。回归分析是一种统计学方法&#xff0c;用于研究一个或多个自变量&#xff08;预测变量&#xff09;与一个因变量&#xff08;响应变量&#xff09;之间的关…

python实现动态时钟功能

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 一.前言 时钟,也被称为钟表,是一种用于测量、记录时间的仪器。时钟通常由时针、分针、秒针等计时仪器组成,是现代社会不可或缺的一种计时工具。它的发明和使用极大地改变了人类的生活方式和时间观念。 时钟的类型有很多,…

汇昌联信科技:做拼多多网店要押金吗?

做拼多多网店要押金吗?”这个问题&#xff0c;其实与拼多多的平台规则有关。在开店之前&#xff0c;商家需要详细了解平台的各项规定和费用构成&#xff0c;这样才能做好充足的准备。 一、明确回答问题 做拼多多网店&#xff0c;不需要支付押金。拼多多的入驻门槛相对较低&…

Threejs Shader动态修改Merge合并几何体中单个Mesh的颜色

目录 Merge合并 现象 思路 实现 为单个geometry添加映射 通过id检索Merge后的Geometry映射属性&#xff0c;获取顶点坐标 onBeforeCompile修改编译前材质的着色代码 编译前材质的顶点着色代码 编译前材质的片元着色代码 着色器代码 注意 效果 Merge合并 mergeBuf…

Vue路由拆分

1.在src下建立router&#xff0c;在router中建立文件index 2.将main.js中部分内容复制 App <template> <div><a href"#/friend">朋友</a><br><a href"#/info">信息</a><br><a href"#/music&quo…