日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

RA MCU眾測寶典 | I2C讀取EEPROM

RA生態(tài)工作室 ? 2026-01-13 18:05 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

RA MCU眾測寶典IIC專題繼續(xù)深耕!上一期我們用【RA-Eco-RA2E1】開發(fā)板實現(xiàn)了IIC通信OLED顯示。這次我們把目光轉向實用的存儲場景——基于【RA-Eco-RA4M2】開發(fā)板,用I2C協(xié)議讀取EEPROM數(shù)據(jù)。


瑞薩嵌入式小百科將帶著大家從I2C總線原理、EEPROM(AT24C02)特性,到FSP中I2C的引腳配置、參數(shù)設置,再到字節(jié)寫、頁寫、順序讀等核心操作的代碼實現(xiàn),一起解鎖“掉電不丟失”的存儲通信技能,看看I2C如何高效實現(xiàn)外設數(shù)據(jù)交互。

開啟寶典


開發(fā)環(huán)境

IDE:MKD 5.38a

Renesas RA Smart Configurator:v5.1.0

開發(fā)板:RA-Eco-RA4M2

MCU:R7FA4M2AD3CFP


01

I2C工作原理

1.1

I2C串行總線概述

I2C總線是PHLIPS公司推出的一種雙線式半雙工串行總線,是具備多主機系統(tǒng)所需的總線裁決和高低速器件同步功能的高性能串行總線。用于連接微控器及外圍設備。I2C總線只有兩根雙向信號線。一根是數(shù)據(jù)線SDA,另一根是時鐘線SCL。


物理層

它只使用兩條總線線路:一條雙向串行數(shù)據(jù)線(SDA),一條串行時鐘線(SCL)。見圖1。

每個連接到總線的設備都有一個獨立的地址,主機可以利用這個地址進行不同設備之間的訪問。

多主機同時使用總線時,為了防止數(shù)據(jù)沖突,會利用仲裁方式決定由哪個設備占用總線。

具有三種傳輸模式:標準模式的傳輸速率為100 Kbit/s,快速模式為400 Kbit/s,高速模式下可達3.4 Mbit/s,但目前大多I2C設備尚不支持高速模式。

片上的濾波器可以濾去總線數(shù)據(jù)線上的毛刺波以保證數(shù)據(jù)完整。

連接到相同總線的IC數(shù)量受到總線的最大電容400 pF限制


6285f9ce-f067-11f0-8ce9-92fbcf53809c.png


I2C總線通過上拉電阻接正電源。當總線空閑時,兩根線均為高電平。連到總線上的任一器件輸出的低電平,都將使總線的信號變低,即各器件的SDA及SCL都是線“與”關系。


每個接到I2C總線上的器件都有唯一的地址。主機與其它器件間的數(shù)據(jù)傳送可以是由主機發(fā)送數(shù)據(jù)到其它器件,這時主機即為發(fā)送器。由總線上接收數(shù)據(jù)的器件則為接收器。


在多主機系統(tǒng)中,可能同時有幾個主機企圖啟動總線傳送數(shù)據(jù)。為了避免混亂,I2C總線要通過總線仲裁,以決定由哪一臺主機控制總線。


協(xié)議層

I2C的協(xié)議包括起始和停止條件、數(shù)據(jù)有效性、響應、仲裁、時鐘同步和地址廣播等環(huán)節(jié),由于我們使用的是RA4M2集成的硬件I2C接口,并不需要用軟件去模擬SDA和SCL線的時序。


62921c86-f067-11f0-8ce9-92fbcf53809c.png


S:傳輸開始信號,此時連接到I2C總線上的所有從機都會接收到這個信號。

SLAVE_ADDRESS:從機地址,此地址可以使7位或者10位,當主機廣播的地址與某個設備相同地址時,這個設備就被選中了。

:傳輸方向選擇位,1為讀,0為寫。

:應答或非應答信號。

P:停止傳輸信號。


這兩幅圖表示的是主機和從機通信時SDA線的數(shù)據(jù)包序列。


其中S表示由主機的I2C接口產生的傳輸起始信號(S),這時連接到I2C總線上的所有從機都會接收到這個信號。


起始信號產生后,所有從機就開始等待主機緊接下來廣播的從機地址信號(SLAVE_ADDRESS),在I2C總線上,每個設備的地址都是唯一的。當主機廣播的地址與某個設備地址相同時,這個設備就被選中了,沒被選中的設備將會忽略之后的數(shù)據(jù)信號。根據(jù)I2C協(xié)議,這個從機地址可以是7位或10位。


在地址位之后,是傳輸方向的選擇位,該位為0時,表示后面的數(shù)據(jù)傳輸方向是由主機傳輸至從機。該位為1時,則相反。


從機接收到匹配的地址后,主機或從機會返回一個應答(A)或非應答信號,只有接收到應答信號后,主機才能繼續(xù)發(fā)送或接收數(shù)據(jù)。


若配置的方向傳輸位為寫數(shù)據(jù),廣播完地址,接收到應答信號后,主機開始正式向從機傳輸數(shù)據(jù)(DATA),數(shù)據(jù)包的大小為8位。主機每發(fā)送完一個數(shù)據(jù),都要等待從機的應答信號(A),重復這個過程,可以向從機傳輸N個數(shù)據(jù),這個N沒有大小限制。當數(shù)據(jù)傳輸結束時,主機向從機發(fā)送一個停止傳輸信號(P),表示不再傳輸數(shù)據(jù)。


若配置的方向傳輸位為讀數(shù)據(jù),廣播完地址,接收到應答信號后,從機開始向主機返回數(shù)據(jù)(DATA),數(shù)據(jù)包大小也為8位。從機每發(fā)送完一個數(shù)據(jù),都會等待主機的應答信號(A),重復這個過程,可以返回N個數(shù)據(jù),這個N也沒有大小限制。當主機希望停止接收數(shù)據(jù)時,就向從機返回一個非應答信號,則從機自動停止數(shù)據(jù)傳輸。


02

RA4M2的I2C架構及特性

瑞薩RA4M2有兩個I2C通道,I2C模塊符合變更提供NXPI2C總線接口功能。


2.1

I2C接口特性

RA4M2的芯片均有多達兩個的I2C總線接口。

能夠工作于多主模式或從模式,分別為主接收器、主發(fā)送器、從接收器及從發(fā)送器。

支持標準模式100 Kbit/s和快速模式400 Kbit/s,不支持高速模式。

支持7位或10位尋址。

內置了硬件CRC發(fā)生器/校驗器。

I2C的接收和發(fā)送都可以使用DMA操作。

支持系統(tǒng)管理總線(SMBus)2.0版。


2.2

I2C架構

I2C的所有硬件架構就是根據(jù)SCL線和SDA線展開的(其中SMBALERT線用于SMBus)。


SCL線的時序即為I2C協(xié)議中的時鐘信號,它由I2C 接口根據(jù)時鐘控制寄存器(CCR)控制,控制的參數(shù)主要為時鐘頻率。而SDA線的信號則通過一系列數(shù)據(jù)控制架構,在將要發(fā)送的數(shù)據(jù)的基礎上,根據(jù)協(xié)議添加各種起始信號、應答信號、地址信號,實現(xiàn)以I2C協(xié)議的方式發(fā)送出去。讀取數(shù)據(jù)時則從SDA線上的信號中取出接收到的數(shù)據(jù)值。發(fā)送和接收的數(shù)據(jù)都被保存在數(shù)據(jù)寄存器上。


62a0662e-f067-11f0-8ce9-92fbcf53809c.png

Figure2?1 I2C架構圖


03

I2C總線的數(shù)據(jù)傳送

3.1

數(shù)據(jù)位的有效性規(guī)定

I2C總線進行數(shù)據(jù)傳送時,時鐘信號為高電平期間,數(shù)據(jù)線上的數(shù)據(jù)必須保持穩(wěn)定,只有在時鐘線上的信號為低電平期間,數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。


62ae1c74-f067-11f0-8ce9-92fbcf53809c.png


3.2

起始和終止信號

SCL線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號


62ba4b34-f067-11f0-8ce9-92fbcf53809c.png


起始和終止信號都是由主機發(fā)出的,在起始信號產生后,總線就處于被占用的狀態(tài);在終止信號產生后,總線就處于空閑狀態(tài)。連接到I2C總線上的器件,若具有I2C總線的硬件接口,則很容易檢測到起始和終止信號。每當發(fā)送器件傳輸完一個字節(jié)的數(shù)據(jù)后,后面必須緊跟一個校驗位,這個校驗位是接收端通過控制SDA(數(shù)據(jù)線)來實現(xiàn)的,以提醒發(fā)送端數(shù)據(jù)我這邊已經接收完成,數(shù)據(jù)傳送可以繼續(xù)進行。


3.3

數(shù)據(jù)傳送格式

字節(jié)傳送與應答

每一個字節(jié)必須保證是8位長度。數(shù)據(jù)傳送時,先傳送最高位(MSB),每一個被傳送的字節(jié)后面都必須跟隨一位應答位(即一幀共有9位)。


62c88406-f067-11f0-8ce9-92fbcf53809c.png


由于某種原因從機不對主機尋址信號應答時(如從機正在進行實時性的處理工作而無法接收總線上的數(shù)據(jù)),它必須將數(shù)據(jù)線置于高電平,而由主機產生一個終止信號以結束總線的數(shù)據(jù)傳送。


如果從機對主機進行了應答,但在數(shù)據(jù)傳送一段時間后無法繼續(xù)接收更多的數(shù)據(jù)時,從機可以通過對無法接收的第一個數(shù)據(jù)字節(jié)的“非應答”通知主機,主機則應發(fā)出終止信號以結束數(shù)據(jù)的繼續(xù)傳送。


當主機接收數(shù)據(jù)時,它收到最后一個數(shù)據(jù)字節(jié)后,必須向從機發(fā)出一個結束傳送的信號。這個信號是由對從機的“非應答”來實現(xiàn)的。然后,從機釋放SDA線,以允許主機產生終止信號。


總線的尋址

I2C總線協(xié)議有明確的規(guī)定:采用7位的尋址字節(jié)(尋址字節(jié)是起始信號后的第一個字節(jié))。


62d4c3d8-f067-11f0-8ce9-92fbcf53809c.png


3.4

尋址字節(jié)的位定義

D7~D1位組成從機的地址。D0位是數(shù)據(jù)傳送方向位,為“0”時表示主機向從機寫數(shù)據(jù),為“1”時表示主機由從機讀數(shù)據(jù)。


主機發(fā)送地址時,總線上的每個從機都將這7位地址碼與自己的地址進行比較,如果相同,則認為自己正被主機尋址,根據(jù)R/T位將自己確定為發(fā)送器或接收器。


從機的地址由固定部分和可編程部分組成。在一個系統(tǒng)中可能希望接入多個相同的從機,從機地址中可編程部分決定了可接入總線該類器件的最大數(shù)目。如一個從機的7位尋址位有4位是固定位,3位是可編程位,這時僅能尋址8個同樣的器件,即可以有8個同樣的器件接入到該I2C總線系統(tǒng)中。


數(shù)據(jù)幀格式

I2C總線上傳送的數(shù)據(jù)信號是廣義的,既包括地址信號,又包括真正的數(shù)據(jù)信號。


在起始信號后必須傳送一個從機的地址(7位),第8位是數(shù)據(jù)的傳送方向位(R/T),用“0”表示主機發(fā)送數(shù)據(jù)(T),“1”表示主機接收數(shù)據(jù)(R)。每次數(shù)據(jù)傳送總是由主機產生的終止信號結束。但是,若主機希望繼續(xù)占用總線進行新的數(shù)據(jù)傳送,則可以不產生終止信號,馬上再次發(fā)出起始信號對另一從機進行尋址。


在總線的一次數(shù)據(jù)傳送過程中,可以有以下幾種組合方式:


A)主機向從機發(fā)送數(shù)據(jù),數(shù)據(jù)傳送方向在整個過程中不變;


62e1d0dc-f067-11f0-8ce9-92fbcf53809c.png


注:

有陰影部分表示數(shù)據(jù)由主機向從機傳送,無陰影部分則表示數(shù)據(jù)由從機向主機傳送。A表示應答,A表示非應答(高電平)。S表示起始信號,P表示終止信號。


B)主機在第一個字節(jié)后,立即從從機讀數(shù)據(jù)。


62ed6b90-f067-11f0-8ce9-92fbcf53809c.png


C)在傳送過程中,當需要改變傳送方向時,起始信號和從機地址都被重復產生一次,但兩次讀/寫方向位正好反相。


62fa68c2-f067-11f0-8ce9-92fbcf53809c.png


4

EEPROM存儲器原理

EEPROM是一種掉電后數(shù)據(jù)不丟失的存儲器,常用來存儲一些配置信息,以便系統(tǒng)重新上電的時候加載。EEPROM芯片最常用的通訊方式就是I2C協(xié)議,本文將要講解EEPROM的讀寫操作。


4.1

AT24Cxx概述

AT24C01/02/04/08/16是一個1K/2K/4K/8K/16K位串行CMOS,EEPROM內部含有128/256/512/1024/2048個8位字節(jié)CATALYST公司的先進CMOS技術實質上減少了器件的功耗,AT24C01/02有一個8字節(jié)頁寫緩沖器AT24C04/08/16有一個16字節(jié)頁寫緩沖器,該器件通過I2C總線接口進行操作有一個專門的寫保護功能。AT24C01/02每頁有8個字節(jié),分別為16/32頁;AT24C04/08/16每頁有16個字節(jié),分別為32/64/128頁。



工作特點

與400KHz I2C總線兼容

1.8到6.0伏工作電壓范圍

低功耗CMOS技術

寫保護功能當WP為高電平時進入寫保護狀態(tài)

頁寫緩沖器

自定時擦寫周期

100萬次編程/擦除周期

可保存數(shù)據(jù)100年

8腳DIP SOIC或TSSOP封裝

溫度范圍商業(yè)級和工業(yè)級


AT24Cxx的引腳定義如下:


6306ea5c-f067-11f0-8ce9-92fbcf53809c.png


Note

For use of 5-lead SOT23,the software A2,A1, and A0 bits in the device address word must be set to zero toproperly communicate.


Table?引腳說明

6315bfbe-f067-11f0-8ce9-92fbcf53809c.png


4.2

AT24Cxx總線時序

AT24Cxx的I2C總線時序如下:


632392a6-f067-11f0-8ce9-92fbcf53809c.png


其讀寫周期的的電壓范圍如下:


6332b100-f067-11f0-8ce9-92fbcf53809c.png


寫周期時間是指從一個寫時序的有效停止信號到內部編程/擦除周期結束的這一段時間。在寫周期期間,總線接口電路禁能,SDA保持為高電平,器件不響應外部操作。


4.3

AT24Cxx器件尋址

主器件通過發(fā)送一個起始信號啟動發(fā)送過程,然后發(fā)送它所要尋址的從器件的地址。8位從器件地址的高4位固定為(1010)。接下來的3位(A2、A1、A0)為器件的地址位,用來定義哪個器件以及器件的哪個部分被主器件訪問,上述8個AT24C01/02,4個AT24C04,2個AT24C08,1個AT24C16可單獨被系統(tǒng)尋址。從器件8位地址的最低位,作為讀寫控制位?!?”表示對從器件進行讀操作,“0”表示對從器件進行寫操作。在主器件發(fā)送起始信號和從器件地址字節(jié)后,AT24C01/02/04/08/16監(jiān)視總線并當其地址與發(fā)送的從地址相符時響應一個應答信號(通過SDA線)。AT24C01/02/04/08/16再根據(jù)讀寫控制位(R/W)的狀態(tài)進行讀或寫操作。


6341382e-f067-11f0-8ce9-92fbcf53809c.png


字節(jié)寫

在字節(jié)寫模式下,主器件發(fā)送起始命令和從器件地址信息(R/W)位置發(fā)給從器件,在從器件產生應答信號后,主器件發(fā)送AT24Cxx的字節(jié)地址,主器件在收到從器件的另一個應答信號后,再發(fā)送數(shù)據(jù)到被尋址的存儲單元。AT24Cxx再次應答,并在主器件產生停止信號后開始內部數(shù)據(jù)的擦寫,在內部擦寫過程中,AT24Cxx不再應答主器件的任何請求。


6353d330-f067-11f0-8ce9-92fbcf53809c.png


頁寫

用頁寫,AT24C01/02可一次寫入8個字節(jié)數(shù)據(jù),AT24C04/08/16可以一次寫入16個字節(jié)的數(shù)據(jù)。__頁寫操作的啟動和字節(jié)寫一樣,不同在于傳送了一字節(jié)數(shù)據(jù)后并不產生停止信號。__主器件被允許發(fā)送P(AT24C01:P=7;AT24C02/04/08/16:P=15)個額外的字節(jié)。每發(fā)送一個字節(jié)數(shù)據(jù)后AT24Cxx產生一個應答位并將字節(jié)地址低位加1,高位保持不變。


如果在發(fā)送停止信號之前主器件發(fā)送超過P+1個字節(jié),地址計數(shù)器將自動翻轉,先前寫入的數(shù)據(jù)被覆蓋。


接收到P+1字節(jié)數(shù)據(jù)和主器件發(fā)送的停止信號后,AT24Cxx啟動內部寫周期將數(shù)據(jù)寫到數(shù)據(jù)區(qū)。所有接收的數(shù)據(jù)在一個寫周期內寫入AT24Cxx。


636272c8-f067-11f0-8ce9-92fbcf53809c.png


讀字節(jié)

讀操作允許主器件對寄存器的任意字節(jié)進行讀操作,主器件首先通過發(fā)送起始信號、從器件地址和它想讀取的字節(jié)數(shù)據(jù)的地址執(zhí)行一個寫操作。在AT24Cxx應答之后,主器件重新發(fā)送起始信號和從器件地址,此時R/W位置1,AT24Cxx響應并發(fā)送應答信號,然后輸出所要求的一個8位字節(jié)數(shù)據(jù),主器件不發(fā)送應答信號但產生一個停止信號。


637045d8-f067-11f0-8ce9-92fbcf53809c.png


順序讀

在AT24Cxx發(fā)送完一個8位字節(jié)數(shù)據(jù)后,主器件產生一個應答信號來響應,告知AT24Cxx主器件要求更多的數(shù)據(jù),對應每個主機產生的應答信號AT24Cxx將發(fā)送一個8位數(shù)據(jù)字節(jié)。當主器件不發(fā)送應答信號而發(fā)送停止位時結束此操作。


從AT24Cxx輸出的數(shù)據(jù)按順序由N到N+1輸出。讀操作時地址計數(shù)器在AT24Cxx整個地址內增加,這樣整個寄存器區(qū)域可在一個讀操作內全部讀出,當讀取的字節(jié)超過E(對于24WC01,E=127;對24C02,E=255;對24C04,E=511;對24C08,E=1023;對24C16,E=2047)計數(shù)器將翻轉到零并繼續(xù)輸出數(shù)據(jù)字節(jié)。


637c8e92-f067-11f0-8ce9-92fbcf53809c.png


典型應用

ATC02的典型電路如下:

63890fb4-f067-11f0-8ce9-92fbcf53809c.png


根據(jù)AT24C02的芯片資料,我們會發(fā)現(xiàn)AT24C02有三個地址A0,A1,A2。同時,我們會在資料的Device Address介紹發(fā)現(xiàn)I2C器件一共有七位地址碼,還有一位是讀/寫(R/W)操作位,而在AT24C02的前四位已經固定為1010。R/W為1則為讀操作,為0則為寫操作。R/W位我們要設置為0(寫操作)。


規(guī)則為:

1010(A0)(A1)(A2)(R/W)


1

例子1:

那么對應的A0,A1,A2都是接的VCC,所以為A0=1,A1=1,A2=1;可以知道AT24C02的從設備寫地址為10101110(0xae),讀設備地址為10101111(0xaf)。

2

例子2:

那么對應的A0,A1,A2都是接的GND,所以為A0=0,A1=0,A2=0;可以知道AT24C02的從設備寫地址為10100000(0xa0),讀設備地址為10100001(0xa1)。


05

硬件設計

本文是使用I2C協(xié)議對EEPROM進行讀寫操作,具體的硬件連接如下。


63adad1a-f067-11f0-8ce9-92fbcf53809c.png


按照我們此處的連接,A0/A1/A2均為0,所以EEPROM的7位設備地址是:1010 000b,即 0x50。


06

I2C讀寫EEPROM

6.1

RA Smart Configurator配置I2C

打開RA Smart Configurator,根據(jù)硬件連接,I2C使用的是I2C3,因此在配置界面里面依次打開“Pins->Peripherals->Connectivity:SCI>SCI3”配置SCI模塊,選擇開發(fā)板所用的I2C引腳,這里SCL和SDA分別接的是P408和P409引腳。


63bbfcf8-f067-11f0-8ce9-92fbcf53809c.png


接下來就是添加I2C的stack。


63c71444-f067-11f0-8ce9-92fbcf53809c.png


接下來需要配置I2C的參數(shù)。


63d3bece-f067-11f0-8ce9-92fbcf53809c.png


這里可以設置I2C的參數(shù),我這里設置I2C的變量名、通道以及從機地址,I2C的編號和Channel編號是一一對應的,因此需要設置為3,回調函數(shù)依據(jù)C語言命名規(guī)范任意編譯一個就行。


值得注意的是,這里的從機地址是7位,代碼中自動左移了。然后讓軟件自動生成配置代碼即可。


6.2

基于I2C的EEPROM讀寫實現(xiàn)

R_SCI_I2C_Open()函數(shù)為執(zhí)行IIC初始化,開啟配置如下所示。

左右滑動查看完整內容

/* Initialize the I2C module */err = R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);/* Handle any errors. This function should be defined by the user. */assert(FSP_SUCCESS == err);


R_SCI_I2C_Write()函數(shù)是向IIC設備中寫入數(shù)據(jù),寫入格式如下所示。

左右滑動查看完整內容

err = R_SCI_I2C_Write(&g_i2c_device_ctrl_1, &g_i2c_tx_buffer[0], I2C_BUFFER_SIZE_BYTES,false);assert(FSP_SUCCESS == err);


R_SCI_I2C_Read()函數(shù)是向IIC設備中寫入數(shù)據(jù),寫入格式如下所示。

左右滑動查看完整內容

err = R_SCI_I2C_Read(&g_i2c_device_ctrl_1, &g_i2c_rx_buffer[0], I2C_BUFFER_SIZE_BYTES,false);assert(FSP_SUCCESS == err);


sci_i2c_master_callback()回調函數(shù)用于數(shù)據(jù)是否發(fā)送完畢,可以查看是否獲取到I2C_MASTER_EVENT_TX_COMPLETE字段。

左右滑動查看完整內容

i2c_master_event_ti2c_event = I2C_MASTER_EVENT_ABORTED;voidsci_i2c_master_callback(i2c_master_callback_args_t*p_args){ i2c_event = I2C_MASTER_EVENT_ABORTED; if(NULL!= p_args) { /* capture callback event for validating the i2c transfer event*/ i2c_event = p_args->event; }}


主要配置I2C模式、低電平占空比、I2C尋址模式以及通信速率,最后使能I2C設備。


初始化完成后就是對AT24C02的讀寫操作,嚴格按照相應的時序操作就行。


6.2.1字節(jié)寫

在字節(jié)寫模式下,向AT24C02中寫數(shù)據(jù)時序如下:


63e332be-f067-11f0-8ce9-92fbcf53809c.png




操作時序如下:

MCU先發(fā)送一個開始信號(START)啟動總線

接著跟上首字節(jié),發(fā)送器件寫操作地址(DEVICE ADDRESS)+寫數(shù)據(jù)(0xA0)

等待應答信號(ACK)

發(fā)送數(shù)據(jù)的存儲地址。24C02一共有256個字節(jié)的存儲空間,地址從0x00~0xFF,想把數(shù)據(jù)存儲在哪個位置,此刻寫的就是哪個地址。

發(fā)送要存儲的數(shù)據(jù),在寫數(shù)據(jù)的過程中,AT24C02會回應一個“應答位0”,則表明寫AT24C02數(shù)據(jù)成功,如果沒有回應答位,說明寫入不成功。

發(fā)送結束信號(STOP)停止總線。


代碼很簡單,跟著時序來就行。

左右滑動查看完整內容

/** *@brief 以單字節(jié)的方式到 I2C EEPROM 中 *@param address: 寫地址 *@param byte: 寫的數(shù)據(jù) *@retval None */voidBSP_I2C_EE_ByteWrite(unsignedchar address, unsignedchar byte){ unsignedchar send_buffer[2] = {}; send_buffer[0] = address; send_buffer[1] = byte; R_SCI_I2C_Write(&g_i2c3_ctrl, &send_buffer[0],2,false);//每當寫完數(shù)據(jù) false 總線拉高
while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms) { R_BSP_SoftwareDelay(1U,BSP_DELAY_UNITS_MILLISECONDS); timeout_ms--; } timeout_ms =500;}


6.2.2頁寫

用頁寫,AT24C01可一次寫入8個字節(jié)數(shù)據(jù),AT24C02/04/08/16可以一次寫入16個字節(jié)的數(shù)據(jù)。__頁寫操作的啟動和字節(jié)寫一樣,不同在于傳送了一字節(jié)數(shù)據(jù)后并不產生停止信號。__每發(fā)送一個字節(jié)數(shù)據(jù)后AT24Cxx產生一個應答位并將字節(jié)地址低位加1,高位保持不變。


如果在發(fā)送停止信號之前主器件發(fā)送超過P+1個字節(jié),地址計數(shù)器將自動翻轉,先前寫入的數(shù)據(jù)被覆蓋。


接收到P+1字節(jié)數(shù)據(jù)和主器件發(fā)送的停止信號后,AT24Cxx啟動內部寫周期將數(shù)據(jù)寫到數(shù)據(jù)區(qū)。所有接收的數(shù)據(jù)在一個寫周期內寫入AT24Cxx。

63ee749e-f067-11f0-8ce9-92fbcf53809c.png


代碼很簡單,和字節(jié)寫不同的是,數(shù)據(jù)會一直發(fā),直到主機發(fā)送停止信號。

左右滑動查看完整內容

/** * [url=home.php?mod=space&uid=2666770]@Brief[/url] 將緩沖區(qū)中的數(shù)據(jù)以頁寫入的方式寫到 I2C EEPROM 中 * [url=home.php?mod=space&uid=3142012]@param[/url] ptr_write: 緩沖區(qū)指針 *@param WriteAddr: 寫地址 *@param len: 寫的長度 *@retvalNone */voidBSP_I2C_EE_Writepage(unsignedchar* ptr_write , unsignedchar WriteAddr, unsignedchar len){ unsignedchar send_buffer[9] = {}; send_buffer[0] =WriteAddr;
for(unsignedchar i =0;i


6.2.3任意寫

在實際過程中,我們經常需要任意寫數(shù)據(jù),這里就調用頁寫的操作,來實現(xiàn)任意字節(jié)的寫操作。

左右滑動查看完整內容

/** *@brief 將緩沖區(qū)中的數(shù)據(jù)寫到 I2C EEPROM 中 *@param pBuffer: 緩沖區(qū)指針 *@param WriteAddr: 寫地址 *@param NumByteToWrite: 寫的字節(jié)數(shù) *@retvalNone */voidBSP_I2C_EE_BufferWrite(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite){ uint8_tNumOfPage=0,NumOfSingle=0,Addr=0, count =0; Addr=WriteAddr%EEPROM_PAGESIZE; count =EEPROM_PAGESIZE-Addr; NumOfPage= (uint8_t)(NumByteToWrite/EEPROM_PAGESIZE); NumOfSingle=NumByteToWrite%EEPROM_PAGESIZE;
/* If WriteAddr is I2C_PageSize aligned */ if(Addr==0) { /* If NumByteToWrite < I2C_PageSize */? ? ? ? if?(NumOfPage?==?0)? ? ? ? {? ? ? ? ? ? BSP_I2C_EE_Writepage(pBuffer,?WriteAddr,?NumOfSingle);? ? ? ? }? ? ? ? /* If NumByteToWrite > I2C_PageSize */ else { while(NumOfPage--) { BSP_I2C_EE_Writepage(pBuffer,WriteAddr,EEPROM_PAGESIZE); WriteAddr+=EEPROM_PAGESIZE; pBuffer +=EEPROM_PAGESIZE; } if(NumOfSingle!=0) { BSP_I2C_EE_Writepage(pBuffer,WriteAddr,NumOfSingle); } } } /* If WriteAddr is not I2C_PageSize aligned */ else { /* If NumByteToWrite < I2C_PageSize */? ? ? ? if?(NumOfPage==?0)? ? ? ? {? ? ? ? ? ? BSP_I2C_EE_Writepage(pBuffer,?WriteAddr,?NumOfSingle);? ? ? ? }? ? ? ? /* If NumByteToWrite > I2C_PageSize */ else { NumByteToWrite-= count; NumOfPage= (uint8_t)(NumByteToWrite/EEPROM_PAGESIZE); NumOfSingle=NumByteToWrite%EEPROM_PAGESIZE; if(count !=0) { BSP_I2C_EE_Writepage(pBuffer,WriteAddr, count); WriteAddr+= count; pBuffer += count; } while(NumOfPage--) { BSP_I2C_EE_Writepage(pBuffer,WriteAddr,EEPROM_PAGESIZE); WriteAddr+=EEPROM_PAGESIZE; pBuffer +=EEPROM_PAGESIZE; } if(NumOfSingle!=0) { BSP_I2C_EE_Writepage(pBuffer,WriteAddr,NumOfSingle); } } }}


主要分為兩種情況,寫的地址正好是一頁的開始,另外一種是在一頁的中間。不管如何,始終遵循的原則就是最大智能寫一頁,可以從一頁的中間開始。


6.2.4讀字節(jié)

讀操作允許主器件對寄存器的任意字節(jié)進行讀操作,主器件首先通過發(fā)送起始信號、從器件地址和它想讀取的字節(jié)數(shù)據(jù)的地址執(zhí)行一個寫操作。在AT24Cxx應答之后,主器件重新發(fā)送起始信號和從器件地址,此時R/W位置1,AT24Cxx響應并發(fā)送應答信號,然后輸出所要求的一個8位字節(jié)數(shù)據(jù),主器件不發(fā)送應答信號但產生一個停止信號。

63f815bc-f067-11f0-8ce9-92fbcf53809c.png


讀取字節(jié)的時序如下:

MCU先發(fā)送一個開始信號(START)啟動總線

接著跟上首字節(jié),發(fā)送器件寫操作地址(DEVICE ADDRESS)+寫數(shù)據(jù)(0xA0)

注意:這里寫操作是為了要把所要讀的數(shù)據(jù)的存儲地址先寫進去,告訴AT24Cxx要讀取哪個地址的數(shù)據(jù)。

發(fā)送要讀取內存的地址(WORD ADDRESS),通知AT24Cxx讀取要哪個地址的信息。

重新發(fā)送開始信號(START)。

發(fā)送設備讀操作地址(DEVICE ADDRESS)對AT24Cxx進行讀操作 (0xA1)。

AT24Cxx會自動向主機發(fā)送數(shù)據(jù),主機讀取從器件發(fā)回的數(shù)據(jù),在讀一個字節(jié)后,MCU會回應一個應答信號(ACK)。

發(fā)送一個“非應答位NAK(1)”。發(fā)送結束信號(STOP)停止總線。


6.2.5順序讀

在AT24Cxx發(fā)送完一個8位字節(jié)數(shù)據(jù)后,主器件產生一個應答信號來響應,告知AT24Cxx主器件要求更多的數(shù)據(jù),對應每個主機產生的應答信號AT24Cxx將發(fā)送一個8位數(shù)據(jù)字節(jié)。當主器件不發(fā)送應答信號而發(fā)送停止位時結束此操作。


從AT24Cxx輸出的數(shù)據(jù)按順序由N到N+1輸出。讀操作時地址計數(shù)器在AT24Cxx整個地址內增加,這樣整個寄存器區(qū)域可在一個讀操作內全部讀出,當讀取的字節(jié)超過E(對于24WC01,E=127;對24C02,E=255;對24C04,E=511;對24C08,E=1023;對24C16,E=2047)計數(shù)器將翻轉到零并繼續(xù)輸出數(shù)據(jù)字節(jié)。

64038460-f067-11f0-8ce9-92fbcf53809c.png


我們常用的方式就是連續(xù)讀取,代碼很簡單。

左右滑動查看完整內容

/** *@brief 讀取 I2C EEPROM 數(shù)據(jù) *@param ptr_read: 讀取緩沖區(qū)指針 *@param address: 地址 *@param byte: 讀取的字節(jié)數(shù) *@retvalNone */voidBSP_I2C_EE_BufferRead(unsignedchar* ptr_read,unsignedchar address,unsignedchar byte){ unsignedchar send_buffer[2] = {}; send_buffer[0] = address; R_SCI_I2C_Write(&g_i2c3_ctrl, &send_buffer[0],1,true); while((I2C_MASTER_EVENT_TX_COMPLETE!= i2c_event) && timeout_ms) { R_BSP_SoftwareDelay(400U,BSP_DELAY_UNITS_MICROSECONDS); timeout_ms--; } timeout_ms =500; R_BSP_SoftwareDelay(250U,BSP_DELAY_UNITS_MICROSECONDS); R_SCI_I2C_Read(&g_i2c3_ctrl, ptr_read, byte,false);}


最后看下hal_entry()函數(shù)吧。

左右滑動查看完整內容

voidhal_entry(void){ R_SCI_UART_Open (g_uart9.p_ctrl, g_uart9.p_cfg);
/* Initialize the I2C module */ R_SCI_I2C_Open(&g_i2c3_ctrl, &g_i2c3_cfg);
BSP_I2C_Test(); /*TODO:add your own code here */ while(1) { R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS); }#ifBSP_TZ_SECURE_BUILD /* Enter non-secure code */ R_BSP_NonSecureEnter();#endif}


首先對I2C初始化,然后就進行EEPROM的讀寫測試。


BSP_I2C_Test()函數(shù)如下:

左右滑動查看完整內容

/** * @brief I2C(AT24C02) 讀寫測試 * @param None * @retval 正常返回 1 ,不正常返回 0 */uint8_tBSP_I2C_Test(void){ uint8_ti; uint8_tDATA_Size =16; uint8_tI2c_Buf_Write[32] = {}; uint8_tI2c_Buf_Read[32] = {}; //將 I2c_Buf_Write 中順序遞增的數(shù)據(jù)寫入 EERPOM 中 printf("Write data:\r\n"); for( i=0; i


6.3

實現(xiàn)現(xiàn)象

接上AT24C02模塊,打開串口助手,打印信息如下:


640dbb7e-f067-11f0-8ce9-92fbcf53809c.png

Figure6?8 實驗現(xiàn)象


從打印信息可以看出,I2C讀寫AT24C02成功。


從OLED顯示到EEPROM讀寫,我們摸清了雙線通信的實用技巧。下一期將要解鎖嵌入式開發(fā)中“高速高效的通信技能”——SPI專題。如果你在實操中遇到了地址匹配、時序調試等問題,歡迎在評論區(qū)分享交流。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    147

    文章

    19160

    瀏覽量

    404716
  • 通信
    +關注

    關注

    18

    文章

    6457

    瀏覽量

    140282
  • EEPROM
    +關注

    關注

    9

    文章

    1146

    瀏覽量

    86363
  • RA
    RA
    +關注

    關注

    0

    文章

    38

    瀏覽量

    25363
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    瑞薩RA2L1 MCU e2 studio和FSP的使用指南

    本期“RA MCU寶典” 繼續(xù)聚焦 “環(huán)境搭建” 專題,帶大家走進【RA-Eco-RA2L1-48PIN-V1.0】的世界,查看e2 s
    的頭像 發(fā)表于 08-04 13:45 ?3234次閱讀
    瑞薩<b class='flag-5'>RA</b>2L1 <b class='flag-5'>MCU</b> e2 studio和FSP的使用指南

    瑞薩RA MCU寶典 SysTick之RA0E1定時器點燈

    RA MCU寶典 ”? SysTick 專題來啦!在上個的 環(huán)境搭建 專題中,我們已經筑牢了開發(fā)基礎,而這次,我們要聚焦一個讓程序“有節(jié)奏”運行的關鍵角色—— SysTick定
    的頭像 發(fā)表于 08-05 14:50 ?3650次閱讀
    瑞薩<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b>  SysTick之<b class='flag-5'>RA</b>0E1定時器點燈

    RA MCU寶典 | SPI驅動TFT屏幕

    “RAMCU寶典”SPI專題來啦!這次我們聚焦【RA-Eco-RA4E2】開發(fā)板,一步步用SPI驅動1.8寸TFT屏幕。開啟寶典前言本次實驗使用的是1.8寸TFT屏幕,分辨率128
    的頭像 發(fā)表于 02-03 17:02 ?7811次閱讀
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | SPI驅動TFT屏幕

    瑞薩RA MCU寶典 | 環(huán)境搭建之【RA-Eco-RA6E2-64PIN-V1.0 開發(fā)板】介紹、環(huán)境搭建、工程測試

    “RAMCU寶典”環(huán)境搭建專題再添實用干貨!這次咱們聚焦高性能入門級開發(fā)板——【RA-Eco-RA6E2-64PIN-V1.0】。本文介紹了RA-Eco-RA6E2-64PIN-V
    的頭像 發(fā)表于 03-20 16:23 ?7971次閱讀
    瑞薩<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 環(huán)境搭建之【<b class='flag-5'>RA-Eco-RA</b>6E2-64PIN-V1.0 開發(fā)板】介紹、環(huán)境搭建、工程測試

    瑞薩RA MCU寶典 | 環(huán)境搭建之【RA-Eco-RA4M2】搭建Keil開發(fā)環(huán)境

    瑞薩“RAMCU寶典”環(huán)境搭建專題再添硬核實操!開啟寶典概覽瑞薩電子RA4M232位微控制器(MCU)系列使用支持TrustZone的高
    的頭像 發(fā)表于 04-03 17:59 ?7143次閱讀
    瑞薩<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 環(huán)境搭建之【<b class='flag-5'>RA-Eco-RA</b>4M2】搭建Keil開發(fā)環(huán)境

    瑞薩RA MCU寶典 | 環(huán)境搭建之【RA-Eco-RA4M2】QE工具使用

    瑞薩“RAMCU寶典”環(huán)境搭建專題再添硬核實操!開啟寶典01簡介RA-Eco-RA4M2-100PIN-V1.0是一款基于100MHzArmCortex-M33內核架構的核心板,主
    的頭像 發(fā)表于 04-10 18:26 ?5806次閱讀
    瑞薩<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 環(huán)境搭建之【<b class='flag-5'>RA-Eco-RA</b>4M2】QE工具使用

    瑞薩RA MCU寶典 | 串口之【RA-Eco-RA2L1】RTC日歷及串口設置時間

    瑞薩“RAMCU寶典”串口專題添硬核實操!開啟寶典前言RAMCU寶典|串口之【RA2L1
    的頭像 發(fā)表于 04-21 18:07 ?6496次閱讀
    瑞薩<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 串口之【<b class='flag-5'>RA-Eco-RA</b>2L1】RTC日歷及串口設置時間

    RA-Eco-RA4M2開發(fā)板評測】I2C讀取EEPROM(二)

    6 I2C讀寫EEPROM 6.1 RA Smart Configurator配置I2C 打開RA Smart Configurator,根
    發(fā)表于 04-28 23:14

    使用硬件模塊實現(xiàn)8051 MCUI2C?串行EEPROM的接口

    本文檔內容介紹了基于使用硬件模塊實現(xiàn)8051 MCUI2C串行EEPROM的接口,供參考
    發(fā)表于 03-29 15:03 ?1次下載

    使用I2C讀取24cxx串行EEPROM

    Read 24cxx serial EEPROM with I2C
    發(fā)表于 06-30 15:10 ?2次下載
    使用<b class='flag-5'>I2C</b><b class='flag-5'>讀取</b>24cxx串行<b class='flag-5'>EEPROM</b>

    關于RA MCU如何讀取Unique ID和Device Part Number

    關于RA MCU如何讀取Unique ID和Device Part Number
    的頭像 發(fā)表于 09-28 16:09 ?2119次閱讀
    關于<b class='flag-5'>RA</b> <b class='flag-5'>MCU</b>如何<b class='flag-5'>讀取</b>Unique ID和Device Part Number

    瑞薩RA6M3 MCU通過I2C讀取HS3001溫濕度傳感器

    瑞薩RA6M3 MCU通過I2C讀取HS3001溫濕度傳感器
    的頭像 發(fā)表于 09-26 16:57 ?2066次閱讀
    瑞薩<b class='flag-5'>RA</b>6M3 <b class='flag-5'>MCU</b>通過<b class='flag-5'>I2C</b><b class='flag-5'>讀取</b>HS3001溫濕度傳感器

    RA MCU寶典 | IIC之【RA2E1】IIC通信的OLED顯示

    “RAMCU寶典”IIC專題上線啦!這次,瑞薩嵌入式小百科將和大家一起聚焦【瑞薩RA2E1】開發(fā)板,一步步玩轉IIC通信的OLED顯示。從IIC協(xié)議的核心原理、FSP中I2CMas
    的頭像 發(fā)表于 01-01 10:04 ?3419次閱讀
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | IIC之【<b class='flag-5'>RA</b>2E1】IIC通信的OLED顯示

    RA MCU寶典 | 在瑞薩CPKCOR-RA8D1B核心板上實現(xiàn)QSPI讀取外部Flash

    RA生態(tài)工作室關注我們“RAMCU寶典”中I2C/SPI通信與顯示驅動專題更新了。這次我們聚焦瑞薩【CPKCOR-RA8D1B核心板】開
    的頭像 發(fā)表于 02-06 18:02 ?5517次閱讀
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 在瑞薩CPKCOR-<b class='flag-5'>RA</b>8D1B核心板上實現(xiàn)QSPI<b class='flag-5'>讀取</b>外部Flash

    RA MCU寶典 | 環(huán)境搭建之【FPB-RA0E2】開發(fā)環(huán)境搭建

    RA生態(tài)工作室關注我們“RAMCU寶典”環(huán)境搭建專題更新啦!這次我們聚焦【FPB-RA0E2】開發(fā)板,一步步打通開發(fā)“第一關”,為后續(xù)功能開發(fā)筑牢基礎。開啟
    的頭像 發(fā)表于 03-11 16:33 ?1364次閱讀
    <b class='flag-5'>RA</b> <b class='flag-5'>MCU</b><b class='flag-5'>眾</b>測<b class='flag-5'>寶典</b> | 環(huán)境搭建之【FPB-<b class='flag-5'>RA</b>0E2】開發(fā)環(huán)境搭建
    无锡市| 聊城市| 江阴市| 香河县| 藁城市| 宁都县| 长子县| 余江县| 南雄市| 镇平县| 岱山县| 乐都县| 娱乐| 蒙自县| 安图县| 镇宁| 莒南县| 芒康县| 石河子市| 镇原县| 乌兰浩特市| 彰化县| 广州市| 新沂市| 宜兰市| 瑞金市| 翁源县| 永宁县| 南澳县| 铜梁县| 卢龙县| 新平| 平原县| 肥城市| 民和| 两当县| 武汉市| 定西市| 当阳市| 曲沃县| 会昌县|