樹莓派3B讀寫EEPROM芯片AT24C256

AT24C256是一個Atmel公司的EEPROM存儲芯片,容量是256K個bit(也就是32K字節),I2C接口,而樹莓派正好有I2C接口,如下圖藍框中的4個IO口,
在這里插入圖片描述
把AT24C256和這4個口接在一起,這樣硬件就準備好了。

本文講述如何使用樹莓派3B來讀寫AT24C256,其它樹莓派版本也是類似的。有2種方法:

  1. 使用樹莓派CPU的I2C控制器來讀寫
  2. 使用AT24C256在Linux系統中映射的文件來讀寫

讀寫AT24C256

1. 使能I2C接口

在樹莓派系統終端下運行以下命令,

sudo raspi-config

然后彈出以下界面,按上下鍵來選擇“3 Interface Options”并回車,
在這里插入圖片描述
在新界面里選擇“I4 I2C”并回車,
在這里插入圖片描述
在新界面里按左右鍵來選擇“Yes”
在這里插入圖片描述
最后回到開始的界面,按左右鍵選擇Finish并回車,
在這里插入圖片描述
這樣I2C功能就開啟了。

2. 使用I2C控制器讀寫

這里使用i2c-tools來操作,樹莓派默認已經安裝了這個工具,如果沒有就使用下面命令進行安裝,

sudo apt install i2c-tools

i2c-tools提供了好幾個工具:

  • i2cdetect
  • i2cdump
  • i2cget
  • i2cset
  • i2c-stub-from-dump
  • i2ctransfer

先使用i2cdetect來探測有多少I2C控制器,如下,顯示有2個,
在這里插入圖片描述
同時在/dev/下也能看到這2個I2C控制器,連接上AT24C256后則會使用i2c-1
在這里插入圖片描述
i2cget,i2cset和i2ctransfer都是用來通過I2C控制器來讀寫eeprom,區別是:i2cget和i2cset適合那種地址是一個字節的eeprom芯片,如AT24C02這種,但是本文使用的是AT24C256,地址需要2個字節,所以只能使用i2ctransfer,同樣它也能讀一字節地址的eeprom,

i2ctransfer幫助信息如下,

在這里插入圖片描述

寫數據

使用下面命令進行寫,"0x50"是芯片的I2C地址, "0x00 0x05"是eeprom內部的地址,該地址可以存放數據,

i2ctransfer 1 w6@0x50 0x00 0x05 0x55 0x66 0x77 0x88

PS:該命令意思是從eeprom的0x0005位置開始存放4個字節,0x55 0x66 0x77 0x88,不過對于i2ctransfer來說,它只是傳輸6個字節

顯示如下,
在這里插入圖片描述

PS:如果想寫代碼來操作,可以參考i2c-tools的源碼

讀數據

寫完后再執行下面命令進行讀,注意這里先要寫2個字節,就是eeprom的內部地址0x0005,然后再讀4個字節,

i2ctransfer 1 w2@0x50 0x00 0x05 r4

顯示如下,可以看到讀取出來的數據和寫入的是一樣的,
在這里插入圖片描述

3. 使用EEPROM在Linux系統中映射的文件來讀寫(推薦)

這個也是推薦的方法,因為EEPROM映射成一個文件,這樣可以使用常規的open, read和write來讀寫EEPROM,但是需要注意的是:這個辦法和使用控制器的辦法同時只能使用一個,因為映射之后控制器會被占用,就不能直接用控制器去讀寫了。

先執行下面的命令加載AT24的模塊,這個模塊是AT24系列芯片的驅動,

sudo modprobe at24

加載完畢后,在/sys/class/i2c-adapter/i2c-1/下會出現new_device和delete_device,
在這里插入圖片描述
然后再運行sudo -i進入root模式,這點很重要,最后執行下面的命令,這樣可以把芯片型號和I2C地址傳給驅動,

echo "24c256 0x50" > /sys/class/i2c-adapter/i2c-1/new_device

實際操作如下,
在這里插入圖片描述
最后執行exit回到用戶模式。

此時在/sys/class/i2c-adapter/i2c-1/能看到新增的目錄1-0050,"1"表示是i2c-1,"0050"表示設備的i2c地址是0x50,
在這里插入圖片描述
cd進入1-0050目錄,可以看到有個文件eeprom,這個就是AT24C256映射的文件,
在這里插入圖片描述

PS:如果想取消映射,可以執行下面命令進行操作,

sudo -i
echo "0x50" > /sys/class/i2c-adapter/i2c-1/delete_device

使用代碼進行讀寫

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdint.h>int main() {int fd; // 文件描述符char buffer[256]; // 用于讀寫的緩沖區off_t offset;// 以讀寫模式打開文件fd = open("/sys/class/i2c-adapter/i2c-1/1-0050/eeprom", O_RDWR, 0644);if (fd == -1) {perror("無法打開文件");exit(EXIT_FAILURE);}// 向文件寫入數據uint8_t wr_buf[4] = {0x11, 0x12, 0x55, 0x66};ssize_t bytes_written = write(fd, wr_buf, 4);if (bytes_written == -1) {perror("寫入文件時出錯");close(fd);exit(EXIT_FAILURE);}printf("成功寫入 %ld 字節\n", bytes_written);// 使用lseek改變文件讀寫位置到文件開頭offset = lseek(fd, 0, SEEK_SET);if (offset == -1) {perror("lseek失敗");close(fd);exit(EXIT_FAILURE);}// 從文件讀取數據到緩沖區ssize_t bytes_read = read(fd, buffer, 4);if (bytes_read == -1) {perror("讀取文件時出錯");} else {for (uint32_t i = 0; i < 4; ++i){printf("==> 0x%x\n", buffer[i]);}}// 關閉文件if (close(fd) == -1) {perror("關閉文件時出錯");exit(EXIT_FAILURE);}return 0;
}

代碼以0x0000位置為起始地址,寫入"0x11 0x12 0x55 0x66",編譯后運行程序并運行,
在這里插入圖片描述
可以看到讀寫都沒問題,同時也能發現映射后對eeprom的操作和讀寫一個普通文件沒有區別。

PS:如果想修改起始地址,可以使用lseek函數來設置位置。


總結

本文講述了2種方法來讀寫AT24C256,更推薦文件方式的辦法,這種更符合Linux“萬物皆文件”的思想。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/37122.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37122.shtml
英文地址,請注明出處:http://en.pswp.cn/web/37122.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django 頁面展示模型創建表的數據

1&#xff0c;添加視圖函數 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 獲取其他字段的值# 創建用戶實例…

【Python學習篇】Python實驗小練習——異常處理(十三)

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

【教程】5分鐘直接了解隨機森林模型

本文來自《老餅講解-BP神經網絡》https://www.bbbdata.com/ 目錄 一、什么是隨機森林模型1.1.隨機森林模型介紹1.2.為什么隨機森林要用多棵決策樹 二、怎么訓練一個隨機森林模型2.1.訓練一個隨機森林模型 隨機森林模型是機器學習中常用的模型之一&#xff0c;它是決策樹模型的一…

Node.js全棧指南:靜態資源服務器

上一章【認識 MIME 和 HTTP】。 我們認識和了解了 MIME 的概念和作用&#xff0c;也簡單地學習了通過瀏覽器控制臺查看請求和返回的用法。 通過對不同的 HTML、CSS、JS 文件進行判斷&#xff0c;設置不同的 MIME 值&#xff0c;得以讓我們的瀏覽器正正確地接收和顯示不同的文…

八爪魚現金流-031,寬帶到期記一筆負債

到期了&#xff0c;新弄的網絡&#xff0c;記錄一下負債包。 八爪魚現金流 八爪魚

英英詞典(匯編實驗)

功能要求&#xff1a; 1.單詞及其英文解釋的錄入、修改和刪除 (1 ) 錄入新單詞&#xff0c;把它插入到相應的位置(按詞典順序)&#xff0c;其后跟英文解釋、同義詞、反義詞&#xff1b;&#xff08;此功能要求在文件中完成&#xff0c;其它功能可以將單詞放在數據段中&#xf…

數據庫原理之數據庫基本概念

目錄 前言 基本概念 數據庫完整性 前言 今天我們來看看數據庫的基本概念&#xff0c;幫助大家對數據庫有一點點最基本的了解 基本概念 4個基本概念 數據data&#xff1a;描述事物的符號&#xff0c;數據庫中存儲的基本對象。 數據庫Database&#xff1a;長期存儲在計算機…

山東大學多核并行2024年回憶版

2024.6.13回憶版 矩陣向量乘不可整除代碼 集合通信與點對點通信的區別 塊劃分、循環劃分、循環塊劃分&#xff08;14個向量&#xff0c;4個進程&#xff09; 按行訪問還是按列訪問快 SISD系統問題 循環依賴問題 問題&#xff1a;為什么不能對這個循環并行化&#xff0…

Python邏輯控制語句 之 綜合案例

需求&#xff1a; 1. 提示?戶輸?登錄系統的?戶名和密碼 2. 校驗?戶名和密碼是否正確(正確的?戶名:admin、密碼:123456) 3. 如果?戶名和密碼都正確&#xff0c;打印“登錄成功!”&#xff0c;并結束程序 4. 如果?戶名或密碼錯誤&#xff0c;打印“?戶名或密碼錯誤!”…

Django 對模型創建的兩表插入數據

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存儲密碼first_name …

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組]

代碼隨想錄算法訓練營第一天 [300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組] **一、300.最長遞增子序列 ** 鏈接: 代碼隨想錄. 思路&#xff1a;dp[i] 以nums[i]為結尾的遞增子序列最大長度&#xff0c;下標為i的數&#xff0c;需要和下標為0開始一直到下標為…

DM 的斷點續傳測試

作者&#xff1a; 大魚海棠 原文來源&#xff1a; https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三種數據遷移同步方式&#xff08;task-mode&#xff09;&#xff0c;在all同步模式下&#xff0c;因一些特殊情況&#xff0c;需要變更上游MySQL的數…

LDO產品的基礎知識解析

低壓降穩壓器 (LDO)是一種用于調節較高電壓輸入產生的輸出電壓的簡單方法。在大多數情況下&#xff0c;低壓降穩壓器都易于設計和使用。然而&#xff0c;如今的現代應用都包括各種各樣的模擬和數字系統&#xff0c;而有些系統和工作條件將決定哪種LDO最適合相關電路&#xff0c…

鄧普頓的五大投資原則

在《逆向投資 鄧普頓的長贏投資法》的推薦序《“逆向投資大神”鄧普頓五大投資原則》中&#xff0c;劉建位總結了鄧普頓的五大投資原則&#xff0c;分別是“以逆向投資為中心”“以價值投資為選股根本”“以分散投資為組合穩定器”“以全球投資來擴大機會池”“以極度悲觀點投資…

rust單元測試順序執行

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 存在的問題 有時候&#xff0c;不同單元測試之間可能會競爭相同的資源&#xff0c;比如讀寫相同的文件。在這種情況下&#xff0c;如果…

springboot的特點是什么?

Spring Boot是一個基于Spring框架的開源項目&#xff0c;它旨在簡化Spring應用的初始搭建和開發過程。以下是Spring Boot的一些主要特點&#xff1a; 快速開發&#xff1a; Spring Boot提供了許多默認配置&#xff0c;使得開發者可以更快地開始開發應用程序&#xff0c;而無需…

秋招突擊——6/28、6.29——復習{數位DP——度的數量}——新作{}

文章目錄 引言復習數位DP——度的數量個人實現參考實現 總結 引言 頭一次產生了那么強烈的動搖&#xff0c;對于未來沒有任何的感覺的&#xff0c;不知道將會往哪里走&#xff0c;不知道怎么辦。可能還是因為實習吧&#xff0c;再加上最近復習也沒有什么進展&#xff0c;并不知…

Vmware Windows虛擬機卡死了

每次遇到這個問題我都想罵娘&#xff01;&#xff01;&#xff01;&#xff01; 這一次是怎么解決的呢&#xff1f; 解決&#xff1a;我給虛擬機連上網就好了&#xff01; 重啟&#xff0c;開關機&#xff0c;一點用都沒有。

前端 JS 經典:箭頭函數的意義

箭頭函數是為了消除函數的二義性。 1. 二義性 函數的二義性指函數有不同的兩種用法&#xff0c;就造成了二義性&#xff0c;函數的兩種用法&#xff1a;1. 指令序列。2. 構造器 1.1 指令序列 就是調用函數&#xff0c;相當于將函數內部的代碼再從頭執行一次。 1.2 構造器 …