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

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32: 采用IIC硬件時(shí)序讀寫AT24C08

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-03-16 09:31 ? 次閱讀

?

一、環(huán)境介紹

編程軟件: keil5

操作系統(tǒng): win10

MCU型號(hào): STM32F103ZET6

STM32編程方式: 寄存器開發(fā) (方便程序移植到其他單片機(jī))

IIC總線:STM32本身支持IIC硬件時(shí)序的,上篇文章已經(jīng)介紹了采用IIC模擬時(shí)序讀寫AT24C02,這篇文章介紹STM32的硬件IIC配置方法,并讀寫AT24C08。

文章地址:https://xiaolong.blog.csdn.net/article/details/117586108

模擬時(shí)序更加方便移植到其他單片機(jī),通用性更高,不分MCU;硬件時(shí)序效率更高,每個(gè)MCU配置方法不同,依賴硬件本身支持。

器件型號(hào): 采用AT24C08 EEPROM存儲(chǔ)芯片

二、AT24C08存儲(chǔ)芯片介紹

2.1 芯片功能特性介紹

AT24C08 是串行CMOS類型的EEPROM存儲(chǔ)芯片,AT24C0x這個(gè)系列包含了AT24C01、AT24C02、AT24C04、AT24C08、AT24C16這些具體的芯片型號(hào)。

他們?nèi)萘糠謩e是:1K (128 x 8)、2K (256 x 8)、8K (1024 x 8)、16K (2048 x 8) ,其中的8表示8位(bit)

它們的管腳功能、封裝特點(diǎn)如下:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

芯片功能描述:

AT24C08系列支持I2C,總線數(shù)據(jù)傳送協(xié)議I2C,總線協(xié)議規(guī)定任何將數(shù)據(jù)傳送到總線的器件作為發(fā)送器。任何從總線接收數(shù)據(jù)的器件為接收器;數(shù)據(jù)傳送是由產(chǎn)生串行時(shí)鐘和所有起始停止信號(hào)的主器件控制的。主器件和從器件都可以作為發(fā)送器或接收器,但由主器件控制傳送數(shù)據(jù)(發(fā)送或接收)的模式。

芯片特性介紹:

1. 低壓和標(biāo)準(zhǔn)電壓運(yùn)行
–2.7(VCC=2.7伏至5.5伏)
–1.8(VCC=1.8伏至5.5伏)

2. 兩線串行接口(SDA、SCL)

3. 有用于硬件數(shù)據(jù)保護(hù)的寫保護(hù)引腳

4. 自定時(shí)寫入周期(5毫秒~10毫秒),因?yàn)閮?nèi)部有頁緩沖區(qū),向AT24C0x寫入數(shù)據(jù)之后,還需要等待AT24C0x將緩沖區(qū)數(shù)據(jù)寫入到內(nèi)部EEPROM區(qū)域.

5. 數(shù)據(jù)保存可達(dá)100年

6. 100萬次擦寫周期

7. 高數(shù)據(jù)傳送速率為400KHz、低速100KHZ和IIC總線兼容。 100 kHz(1.8V)和400 kHz(2.7V、5V)

8. 8字節(jié)頁寫緩沖區(qū)
這個(gè)緩沖區(qū)大小與芯片具體型號(hào)有關(guān): 8字節(jié)頁(1K、2K)、16字節(jié)頁(4K、8K、16K)

2.2 芯片設(shè)備地址介紹

?

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

因?yàn)镮IC協(xié)議規(guī)定,每次傳遞數(shù)據(jù)都是按8個(gè)字節(jié)傳輸?shù)?,AT24C08是1024字節(jié),地址的選擇上與AT24C02有所區(qū)別;

IIC設(shè)備的標(biāo)準(zhǔn)地址位是7位。上面這個(gè)圖里AT24C08的1010是芯片內(nèi)部固定值,A2 是硬件引腳、由硬件決定電平;P1、P0是空間存儲(chǔ)塊選擇,每個(gè)存儲(chǔ)塊大小是256字節(jié),尋址范圍是0~255,AT24C08相當(dāng)于是4塊AT24C02的構(gòu)造;最后一位是讀/寫位(1是讀,0是寫),讀寫位不算在地址位里,但是根據(jù)IIC的時(shí)序順序,在操作設(shè)備前,都需要先發(fā)送7位地址,再發(fā)送1位讀寫位,才能啟動(dòng)對(duì)芯片的操作,我們?cè)趯懩M時(shí)序?yàn)榱朔奖憬y(tǒng)一寫for循環(huán),按字節(jié)發(fā)送,所以一般都是將7地址位與1位讀寫位拼在一起,組合成1個(gè)字節(jié),方便按字節(jié)傳輸數(shù)據(jù)。

我現(xiàn)在使用的開發(fā)板上AT24C08的原理圖是這樣的:

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

那么這個(gè)AT24C08的標(biāo)準(zhǔn)設(shè)備地址分別是:

第一塊區(qū)域: 0x50(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 1010000

第二塊區(qū)域: 0x51(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 1010001

第三塊區(qū)域: 0x52(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 1010010

第四塊區(qū)域: 0x53(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 1010011

如果將讀寫位組合在一起,讀權(quán)限的設(shè)備地址:

第一塊區(qū)域: 0xA1(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100001

第二塊區(qū)域: 0xA3(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100011

第三塊區(qū)域: 0xA5(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100101

第四塊區(qū)域: 0xA7(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100111

如果將讀寫位組合在一起,寫權(quán)限的設(shè)備地址:

第一塊區(qū)域: 0xA0(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100000

第二塊區(qū)域: 0xA2(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100010

第三塊區(qū)域: 0xA4(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100100

第四塊區(qū)域: 0xA6(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 10100110

2.3 對(duì)AT24C08 按字節(jié)寫數(shù)據(jù)的指令流程(時(shí)序)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

詳細(xì)解釋:

1. 先發(fā)送起始信號(hào)

2. 發(fā)送設(shè)備地址(寫權(quán)限)

3. 等待AT24C08應(yīng)答、低電平有效

4. 發(fā)送存儲(chǔ)地址、AT24C08內(nèi)部一共有256個(gè)字節(jié)空間,尋址是從0開始的,范圍是(0~255);發(fā)送這個(gè)存儲(chǔ)器地址就是告訴AT24C08接下來的數(shù)據(jù)改存儲(chǔ)到哪個(gè)地方。

5.等待AT24C08應(yīng)答、低電平有效

6. 發(fā)送一個(gè)字節(jié)的數(shù)據(jù),這個(gè)數(shù)據(jù)就是想存儲(chǔ)到AT24C08里保存的數(shù)據(jù)。

7.等待AT24C08應(yīng)答、低電平有效

8. 發(fā)送停止信號(hào)

2.3 對(duì)AT24C08 按頁寫數(shù)據(jù)的指令流程(時(shí)序)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

詳細(xì)解釋:

1. 先發(fā)送起始信號(hào)

2. 發(fā)送設(shè)備地址(寫權(quán)限)

3. 等待AT24C08應(yīng)答、低電平有效

4. 發(fā)送存儲(chǔ)地址、AT24C08內(nèi)部一共有256個(gè)字節(jié)空間,尋址是從0開始的,范圍是(0~255);發(fā)送這個(gè)存儲(chǔ)器地址就是告訴AT24C08接下來的數(shù)據(jù)改存儲(chǔ)到哪個(gè)地方。

5.等待AT24C08應(yīng)答、低電平有效

6. 可以循環(huán)發(fā)送8個(gè)字節(jié)的數(shù)據(jù),這些數(shù)據(jù)就是想存儲(chǔ)到AT24C08里保存的數(shù)據(jù)。

AT24C08的頁緩沖區(qū)是16個(gè)字節(jié),所有這里的循環(huán)最多也只能發(fā)送16個(gè)字節(jié),多發(fā)送的字節(jié)會(huì)將前面的覆蓋掉。

需要注意的地方: 這個(gè)頁緩沖區(qū)的尋址也是從0開始,比如: 0~15算第1頁,16~32算第2頁......依次類推。 如果現(xiàn)在寫數(shù)據(jù)的起始地址是3,那么這一頁只剩下13個(gè)字節(jié)可以寫;并不是說從哪里都可以循環(huán)寫16個(gè)字節(jié)。

詳細(xì)流程: 這里程序里一般使用for循環(huán)實(shí)現(xiàn)

(1). 發(fā)送字節(jié)1

(2). 等待AT24C08應(yīng)答,低電平有效

(3). 發(fā)送字節(jié)2

(4).等待AT24C08應(yīng)答,低電平有效

.........

最多8次.

7.等待AT24C08應(yīng)答、低電平有效

8. 發(fā)送停止信號(hào)

2.4 從AT24C08任意地址讀任意字節(jié)數(shù)據(jù)(時(shí)序)

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

AT24C08支持當(dāng)前地址讀、任意地址讀,最常用的還是任意地址讀,因?yàn)榭梢灾付ㄗx取數(shù)據(jù)的地址,比較靈活,上面這個(gè)指定時(shí)序圖就是任意地址讀。

詳細(xì)解釋:

1. 先發(fā)送起始信號(hào)

2. 發(fā)送設(shè)備地址(寫權(quán)限)

3. 等待AT24C08應(yīng)答、低電平有效

4. 發(fā)送存儲(chǔ)地址、AT24C08內(nèi)部一共有2048個(gè)字節(jié)空間,尋址是從0開始的,范圍是(0~1024);發(fā)送這個(gè)存儲(chǔ)器地址就是告訴AT24C08接下來應(yīng)該返回那個(gè)地址的數(shù)據(jù)給單片機(jī)。

5.等待AT24C08應(yīng)答、低電平有效

6. 重新發(fā)送起始信號(hào)(切換讀寫模式)

7.發(fā)送設(shè)備地址(讀權(quán)限)

8.等待AT24C08應(yīng)答、低電平有效

9. 循環(huán)讀取數(shù)據(jù): 接收AT24C08返回的數(shù)據(jù).

讀數(shù)據(jù)沒有字節(jié)限制,可以第1個(gè)字節(jié)、也可以連續(xù)將整個(gè)芯片讀完。

10. 發(fā)送非應(yīng)答(高電平有效)

11. 發(fā)送停止信號(hào)

三、IIC總線介紹

2.1 IIC總線簡(jiǎn)介

I2C(Inter-Integrated Circuit)總線是由PHILIPS公司開發(fā)的兩線式串行總線,用于連接微控制器及其外圍設(shè)備,是微電子通信控制領(lǐng)域廣泛采用的一種總線標(biāo)準(zhǔn)。具有接口線少,控制方式簡(jiǎn)單,器件封裝形式小,通信速率較高等優(yōu)點(diǎn)。

I2C規(guī)程運(yùn)用主/從雙向通訊。器件發(fā)送數(shù)據(jù)到總線上,則定義為發(fā)送器,器件接收數(shù)據(jù)則定義為接收器。主器件和從器件都可以工作于接收和發(fā)送狀態(tài)。

I2C 總線通過串行數(shù)據(jù)(SDA)線和串行時(shí)鐘(SCL)線在連接到總線的器件間傳遞信息。每個(gè)器件都有一個(gè)唯一的地址識(shí)別,而且都可以作為一個(gè)發(fā)送器或接收器(由器件的功能決定)。

I2C有四種工作模式:
1.主機(jī)發(fā)送
2.主機(jī)接收
3.從機(jī)發(fā)送
4.從機(jī)接收

I2C總線只用兩根線:串行數(shù)據(jù)SDA(Serial Data)、串行時(shí)鐘SCL(Serial Clock)。

總線必須由主機(jī)(通常為微控制器)控制,主機(jī)產(chǎn)生串行時(shí)鐘(SCL)控制總線的傳輸方向,并產(chǎn)生起始和停止條件。

SDA線上的數(shù)據(jù)狀態(tài)僅在SCL為低電平的期間才能改變。

2.2 IIC總線上的設(shè)備連接圖

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

I2C 總線在物理連接上非常簡(jiǎn)單,分別由SDA(串行數(shù)據(jù)線)和SCL(串行時(shí)鐘線)及上拉電阻組成。通信原理是通過對(duì)SCL和SDA線高低電平時(shí)序的控制,來產(chǎn)生I2C總線協(xié)議所需要的信號(hào)進(jìn)行數(shù)據(jù)的傳遞。在總線空閑狀態(tài)時(shí),這兩根線一般被上面所接的上拉電阻拉高,保持著高電平。

其中上拉電阻范圍是4.7K~100K。

2.3I2C總線特征

I2C總線上的每一個(gè)設(shè)備都可以作為主設(shè)備或者從設(shè)備,而且每一個(gè)從設(shè)備都會(huì)對(duì)應(yīng)一個(gè)唯一的地址(可以從I2C器件的數(shù)據(jù)手冊(cè)得知)。主從設(shè)備之間就通過這個(gè)地址來確定與哪個(gè)器件進(jìn)行通信,在通常的應(yīng)用中,我們把CPU帶I2C總線接口的模塊作為主設(shè)備,把掛接在總線上的其他設(shè)備都作為從設(shè)備。

1. 總線上能掛接的器件數(shù)量
I2C總線上可掛接的設(shè)備數(shù)量受總線的最大電容400pF 限制,如果所掛接的是相同型號(hào)的器件,則還受器件地址的限制。
一般I2C設(shè)備地址是7位地址(也有10位),地址分成兩部分:芯片固化地址(生產(chǎn)芯片時(shí)候哪些接地,哪些接電源,已經(jīng)固定),可編程地址(引出IO口,由硬件設(shè)備決定)。
例如: 某一個(gè)器件是7 位地址,其中10101 xxx 高4位出廠時(shí)候固定了,低3位可以由設(shè)計(jì)者決定。
則一條I2C總線上只能掛該種器件最少8個(gè)。
如果7位地址都可以編程,那理論上就可以達(dá)到128個(gè)器件,但實(shí)際中不會(huì)掛載這么多。

2. 總線速度傳輸速度:
I2C總線數(shù)據(jù)傳輸速率在標(biāo)準(zhǔn)模式下可達(dá)100kbit/s,快速模式下可達(dá)400kbit/s,高速模式下可達(dá)3.4Mbit/s。一般通過I2C總線接口可編程時(shí)鐘來實(shí)現(xiàn)傳輸速率的調(diào)整。

3. 總線數(shù)據(jù)長(zhǎng)度
I2C總線上的主設(shè)備與從設(shè)備之間以字節(jié)(8位)為單位進(jìn)行雙向的數(shù)據(jù)傳輸。

2.4 I2C總線協(xié)議基本時(shí)序信號(hào)

空閑狀態(tài):SCL和SDA都保持著高電平。

起始條件:總線在空閑狀態(tài)時(shí),SCL和SDA都保持著高電平,當(dāng)SCL為高電平期間而SDA由高到低的跳變,表示產(chǎn)生一個(gè)起始條件。在起始條件產(chǎn)生后,總線處于忙狀態(tài),由本次數(shù)據(jù)傳輸?shù)闹鲝脑O(shè)備獨(dú)占,其他I2C器件無法訪問總線。

停止條件:當(dāng)SCL為高而SDA由低到高的跳變,表示產(chǎn)生一個(gè)停止條件。

答應(yīng)信號(hào):每個(gè)字節(jié)傳輸完成后的下一個(gè)時(shí)鐘信號(hào),在SCL高電平期間,SDA為低,則表示一個(gè)應(yīng)答信號(hào)。

非答應(yīng)信號(hào):每個(gè)字節(jié)傳輸完成后的下一個(gè)時(shí)鐘信號(hào),在SCL高電平期間,SDA為高,則表示一個(gè)應(yīng)答信號(hào)。應(yīng)答信號(hào)或非應(yīng)答信號(hào)是由接收器發(fā)出的,發(fā)送器則是檢測(cè)這個(gè)信號(hào)(發(fā)送器,接收器可以從設(shè)備也可以主設(shè)備)。

注意:起始和結(jié)束信號(hào)總是由主設(shè)備產(chǎn)生。

2.5 起始信號(hào)與停止信號(hào)

起始信號(hào)就是: 時(shí)鐘線SCL處于高電平的時(shí)候,數(shù)據(jù)線SDA由高電平變?yōu)榈碗娖降倪^程。SCL=1;SDA=1;SDA=0;

停止信號(hào)就是: 時(shí)鐘線SCL處于低電平的時(shí)候, 數(shù)據(jù)線SDA由低電平變?yōu)楦唠娖降倪^程。SCL=1;SDA=0;SDA=1;

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.6 應(yīng)答信號(hào)

數(shù)據(jù)位的第9位就時(shí)應(yīng)答位。 讀取應(yīng)答位的流程和讀取數(shù)據(jù)位是一樣的。示例: SCL=0;SCL=1;ACK=SDA; 這個(gè)ACK就是讀取的應(yīng)答狀態(tài)。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.7 數(shù)據(jù)位傳輸時(shí)序

通過時(shí)序圖了解到,SCL處于高電平的時(shí)候數(shù)據(jù)穩(wěn)定,SCL處于低電平的時(shí)候數(shù)據(jù)不穩(wěn)定。

那么對(duì)于寫一位數(shù)據(jù)(STM32--->AT24C08):SCL=0;SDA=data;SCL=1;

那么對(duì)于讀一位數(shù)據(jù)(STM32<-----AT24C08):?SCL=0;SCL=1;data=SDA;??

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

2.8 總線時(shí)序

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

四、IIC總線時(shí)序代碼、AT24C08讀寫代碼

在調(diào)試IIC模擬時(shí)序的時(shí)候,可以在淘寶上買一個(gè)24M的USB邏輯分析儀,時(shí)序出現(xiàn)問題,使用邏輯分析儀一分析就可以快速找到問題。

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?

完整的工程源碼下載地址,下載即可編譯運(yùn)行測(cè)試(包含了模擬IIC時(shí)序、STM32硬件IIC時(shí)序分別驅(qū)動(dòng)AT24C02和AT24C08): https://download.csdn.net/download/xiaolong1126626497/19399945

4.1 iic.c 這是STM32的IIC硬件時(shí)序完整代碼

/*
函數(shù)功能: 初始化IIC總線
硬件連接: 
				SCL---PB6
				SDA---PB7
*/
void IIC_Init(void)
{
	 /*1. 時(shí)鐘配置*/
	 RCC->APB2ENR|=1<<3; //PB

 	 /*2. GPIO口模式配置*/
	 GPIOB->CRL&=0x00FFFFFF;
	 GPIOB->CRL|=0xFF000000; //復(fù)用開漏輸出
	 GPIOB->ODR|=0x3<<6;
		
	 /*3. GPIO口時(shí)鐘配置(順序不能錯(cuò))*/
	 RCC->APB1ENR|=1<<21; //I2C1時(shí)鐘
	 RCC->APB1RSTR|=1<<21; //開啟復(fù)位時(shí)鐘
	 RCC->APB1RSTR&=~(1<<21);//關(guān)閉復(fù)位時(shí)鐘
	
	 /*4. 配置IIC的核心寄存器*/
	 I2C1->CR2=0x24<<0;  //配置主機(jī)頻率為36MHZ
	 I2C1->CCR|=0x2D<<0; //配置主機(jī)頻率是400KHZ
	 I2C1->CR1|=1<<0;    //開啟IIC模塊
	
	/*
	CCR=主機(jī)時(shí)鐘頻率/2/IIC總線的頻率
	45=36MHZ/2/400KHZ  ---0x2D
	*/
}


/*
函數(shù)功能: 發(fā)送起始信號(hào)
當(dāng)時(shí)鐘線為高電平的時(shí)候,數(shù)據(jù)線由高電平變?yōu)榈碗娖降倪^程
*/
void IIC_SendStart(void)
{
	I2C1->CR1|=1<<8; //產(chǎn)生起始信號(hào)
	while(!(I2C1->SR1&1<<0)){} //等待起始信號(hào)完成
	I2C1->SR1=0; //清除狀態(tài)位
}

/*
函數(shù)功能: 停止信號(hào)
當(dāng)時(shí)鐘線為高電平的時(shí)候,數(shù)據(jù)線由低電平變?yōu)楦唠娖降倪^程
*/
void IIC_SendStop(void)
{
		I2C1->CR1|=1<<9;
}

/*
函數(shù)功能: 發(fā)送地址數(shù)據(jù)
*/
void IIC_SendAddr(u8 addr)
{
	u32 s1,s2;
	I2C1->DR=addr; //發(fā)送數(shù)據(jù)
	while(1)
	{
			s1=I2C1->SR1;
			s2=I2C1->SR2;
		  if(s1&1<<1) //判斷地址有沒有發(fā)送成功
			{
					break;
			}
	}
}

/*
函數(shù)功能: 發(fā)送數(shù)據(jù)
*/
void IIC_SendOneByte(u8 addr)
{
	u32 s1,s2;
	I2C1->DR=addr; //發(fā)送數(shù)據(jù)
	while(1)
	{
			s1=I2C1->SR1;
			s2=I2C1->SR2;
			if(s1&1<<2) //判斷數(shù)據(jù)有沒有發(fā)送成功
			{
					break;
			}
	}
}

/*
函數(shù)功能: 接收一個(gè)字節(jié)數(shù)據(jù)
*/
u8 IIC_RecvOneByte(void)
{
	u8 data=0;
	I2C1->CR1|=1<<10; //使能應(yīng)答
	while(!(I2C1->SR1&1<<6)){} //等待數(shù)據(jù)
	data=I2C1->DR;
	I2C1->CR1&=~(1<<10); //關(guān)閉應(yīng)答使能
	return data;
}
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.2 AT24C08.c 這是AT24C08完整的讀寫代碼

*
函數(shù)功能: 寫一個(gè)字節(jié)
函數(shù)參數(shù):
	u8 addr 數(shù)據(jù)的位置(0~1023)
	u8 data 數(shù)據(jù)范圍(0~255)
*/
void AT24C08_WriteOneByte(u16 addr,u8 data)
{
    u8 read_device_addr=AT24C08_READ_ADDR;
	u8 write_device_addr=AT24C08_WRITE_ADDR;
    if(addr<256*1) //第一個(gè)塊
    {
        write_device_addr|=0x0<<1;
        read_device_addr|=0x0<<1;
    }
    else if(addr<256*2) //第二個(gè)塊
    {
        write_device_addr|=0x1<<1;
        read_device_addr|=0x1<<1;
    }
    else if(addr<256*3) //第三個(gè)塊
    {
        write_device_addr|=0x2<<1;
        read_device_addr|=0x2<<1;
    }
    else if(addr<256*4) //第四個(gè)塊
    {
        write_device_addr|=0x3<<1;
        read_device_addr|=0x3<<1;
    }
    addr=addr%256; //得到地址范圍

    
    IIC_SendStart();//起始信號(hào)
    IIC_SendAddr(write_device_addr);//發(fā)送設(shè)備地址
    IIC_SendOneByte(addr); //數(shù)據(jù)存放的地址
    IIC_SendOneByte(data); //發(fā)送將要存放的數(shù)據(jù)
    IIC_SendStop(); //停止信號(hào)
    DelayMs(10); //等待寫
}


/*
函數(shù)功能: 讀一個(gè)字節(jié)
函數(shù)參數(shù):
	u8 addr 數(shù)據(jù)的位置(0~1023)
返回值: 讀到的數(shù)據(jù)
*/
u8 AT24C08_ReadOneByte(u16 addr)
{
    u8 data=0;
    u8 read_device_addr=AT24C08_READ_ADDR;
	u8 write_device_addr=AT24C08_WRITE_ADDR;
    if(addr<256*1) //第一個(gè)塊
    {
        write_device_addr|=0x0<<1;
        read_device_addr|=0x0<<1;
    }
    else if(addr<256*2) //第二個(gè)塊
    {
        write_device_addr|=0x1<<1;
        read_device_addr|=0x1<<1;
    }
    else if(addr<256*3) //第三個(gè)塊
    {
        write_device_addr|=0x2<<1;
        read_device_addr|=0x2<<1;
    }
    else if(addr<256*4) //第四個(gè)塊
    {
        write_device_addr|=0x3<<1;
        read_device_addr|=0x3<<1;
    }
    addr=addr%256; //得到地址范圍

    IIC_SendStart();//起始信號(hào)
    IIC_SendAddr(write_device_addr);//發(fā)送設(shè)備地址
    IIC_SendOneByte(addr); //將要讀取數(shù)據(jù)的地址
    IIC_SendStart();//起始信號(hào)
    IIC_SendAddr(read_device_addr);//發(fā)送設(shè)備地址
    data=IIC_RecvOneByte();//讀取數(shù)據(jù)
    IIC_SendStop(); //停止信號(hào)
    return data;
}


/*
函數(shù)功能: 從指定位置讀取指定長(zhǎng)度的數(shù)據(jù)
函數(shù)參數(shù):
	u16 addr 數(shù)據(jù)的位置(0~1023)
	u16 len 讀取的長(zhǎng)度
	u8 *buffer 存放讀取的數(shù)據(jù)
返回值: 讀到的數(shù)據(jù)
*/
void AT24C08_ReadByte(u16 addr,u16 len,u8 *buffer)
{
	 u16 i=0;
	IIC_SendStart();//起始信號(hào)
	IIC_SendAddr(AT24C08_WRITE_ADDR);//發(fā)送設(shè)備地址
	IIC_SendOneByte(addr); //將要讀取數(shù)據(jù)的地址	
	IIC_SendStart();//起始信號(hào)
	IIC_SendAddr(AT24C08_READ_ADDR);//發(fā)送設(shè)備地址
	
	for(i=0;ilen) //判斷當(dāng)前頁剩余的字節(jié)空間是否夠?qū)?		{
				page_byte=len; //表示一次性可以寫完
		}
		while(1)
		{
				AT24C08_PageWrite(addr,page_byte,buffer); //寫一頁
				if(page_byte==len)break; //寫完了
				buffer+=page_byte; //指針偏移
				addr+=page_byte;//地址偏移
				len-=page_byte;//得到剩余沒有寫完的長(zhǎng)度
				if(len>16)page_byte=16;
				else page_byte=len; //一次可以寫完
		}
};i++)>
poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

4.3 main.c 這是AT24C08測(cè)試代碼

#include "stm32f10x.h"
#include "beep.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include 
#include 
#include "exti.h"
#include "timer.h"
#include "rtc.h"
#include "adc.h"
#include "ds18b20.h"
#include "ble.h"
#include "esp8266.h"
#include "wdg.h"
#include "oled.h"
#include "rfid_rc522.h"
#include "infrared.h"
#include "iic.h"
#include "at24c08.h"

u8 buff_tx[50]="1234567890";
u8 buff_rx[50];
u8 data=88;
u8 data2;
int main()
{   
    u8 key;
    LED_Init();
    KEY_Init();
    BEEP_Init();
    TIM1_Init(72,20000); //輔助串口1接收,超時(shí)時(shí)間為20ms
    USART_X_Init(USART1,72,115200);

    IIC_Init(); //IIC總線初始化
    printf("usart1 ok\n");

    while(1)
    {
        key=KEY_Scanf();
        if(key)
        {
            //AT24C08_WriteByte(100,50,buff_tx);
            //AT24C08_ReadByte(100,50,buff_rx);
            //printf("buff_rx=%s\n",buff_rx);

               //測(cè)試第0塊
//            data=AT24C08_ReadOneByte(0);
//            AT24C08_WriteOneByte(0,data+1);
//            printf("data=%d\n",data);
               //測(cè)試第1塊
//            data=AT24C08_ReadOneByte(300);
//            AT24C08_WriteOneByte(300,data+1);
//            printf("data=%d\n",data);
               //測(cè)試第2塊
//            data=AT24C08_ReadOneByte(600);
//            AT24C08_WriteOneByte(600,data+1);
//            printf("data=%d\n",data);
               //測(cè)試第3塊
             data=AT24C08_ReadOneByte(900);
             AT24C08_WriteOneByte(900,data+1);
             printf("data=%d\n",data);
        }
    }
}

串口調(diào)試助手源碼下載地址:QT應(yīng)用編程: 開發(fā)串口調(diào)試助手_DS小龍哥的博客-CSDN博客

poYBAGDYdXCAWkKMAAAAK8RNs4s030.png

?


審核編輯:湯梓紅

?

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

    關(guān)注

    146

    文章

    16922

    瀏覽量

    349989
  • STM32
    +關(guān)注

    關(guān)注

    2264

    文章

    10858

    瀏覽量

    354392
  • 硬件
    +關(guān)注

    關(guān)注

    11

    文章

    3224

    瀏覽量

    66070
  • 時(shí)序
    +關(guān)注

    關(guān)注

    5

    文章

    384

    瀏覽量

    37251
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STM32 IIC讀寫AT24C02(二)

    上次已經(jīng)完成了IIC讀寫AT24C02的協(xié)議層,現(xiàn)在開始編寫讀寫AT24C02的驅(qū)動(dòng)函數(shù)。先從單字節(jié)的
    發(fā)表于 07-22 10:31 ?1373次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>IIC</b><b class='flag-5'>讀寫</b>AT<b class='flag-5'>24C</b>02(二)

    用verilog實(shí)現(xiàn)IIC。

    我想用verilog實(shí)現(xiàn)一個(gè)控制AT24C08讀寫IIC協(xié)議的狀態(tài)機(jī),現(xiàn)在出現(xiàn)了一個(gè)很奇怪的問題,我的狀態(tài)機(jī)在功能仿真時(shí)可以實(shí)現(xiàn)讀寫,但下到芯片里卻發(fā)現(xiàn)不成功。特此求教大家,望大家不
    發(fā)表于 01-29 11:18

    請(qǐng)問哪位大神知道AT24C08芯片的特性,用途?

    AT24C08芯片的特性,用途,急用。。。全是英文開不懂
    發(fā)表于 07-05 09:14

    請(qǐng)問讀寫AT24C256的時(shí)序是掃描樣嗎?

    最近在研究IIC通訊,做IIC讀寫AT24C256的程序,但是單片機(jī)用1M晶振可以正常運(yùn)行,換成12M就出錯(cuò),這應(yīng)該就是時(shí)序的問題了,哪位大
    發(fā)表于 05-10 04:14

    電可檫編程只讀存儲(chǔ)器AT24C08相關(guān)資料下載

    概述:AT24C08是ATMEL公司出品的一款8192位的串行電可擦寫可編程只讀存儲(chǔ)器(EEPROM),每個(gè)存儲(chǔ)單元有1024字,每個(gè)字為8位。AT24C08系列芯片采用8引腳PDIP,8引腳JEDEC SOI
    發(fā)表于 04-06 08:35

    IIC及AT24C02的讀寫

    IIC及AT24C02的讀寫(單片機(jī)實(shí)驗(yàn))有問題歡迎私信哦課程設(shè)計(jì)(綜合實(shí)驗(yàn))內(nèi)容及要求通過IIC總線擴(kuò)展1片AT24C02芯片 ,實(shí)現(xiàn)單片
    發(fā)表于 07-16 06:27

    采用IIC硬件時(shí)序讀寫AT24C08的方法步驟

    時(shí)序的,上篇文章已經(jīng)介紹了采用IIC模擬時(shí)序讀寫AT24C02,這篇文章介紹
    發(fā)表于 11-30 07:48

    配置STM32IIC硬件時(shí)序讀寫AT24C02和AT24C08

    時(shí)序的,本文采用的是模擬時(shí)序,下篇文章就介紹配置STM32IIC硬件
    發(fā)表于 12-08 06:27

    怎樣使用STM32的IO口模擬IIC并對(duì)AT24C128進(jìn)行讀寫

    怎樣使用STM32的IO模擬IIC時(shí)序呢?怎樣使用STM32的IO口模擬IIC并對(duì)AT24C12
    發(fā)表于 01-24 06:14

    AT24C02/AT24C04/AT24C08/AT24C1

    AT24C02/AT24C04/AT24C08/AT24C16/AT24C32/AT24C56序
    發(fā)表于 08-13 15:28 ?253次下載

    HL配套C實(shí)驗(yàn)例程iic--24c02_EEPROM讀寫

    HL配套C實(shí)驗(yàn)例程iic--24c02EEPROM讀寫,配合開發(fā)板學(xué)習(xí)效果更好。
    發(fā)表于 04-11 17:04 ?12次下載

    STM32入門開發(fā): 采用IIC硬件時(shí)序讀寫AT24C08(EEPROM)

    STM32入門開發(fā): 采用IIC硬件時(shí)序讀寫AT24C08
    發(fā)表于 11-21 13:51 ?47次下載
    <b class='flag-5'>STM32</b>入門開發(fā): <b class='flag-5'>采用</b><b class='flag-5'>IIC</b><b class='flag-5'>硬件</b><b class='flag-5'>時(shí)序</b><b class='flag-5'>讀寫</b><b class='flag-5'>AT24C08</b>(EEPROM)

    IIC及AT24C02的讀寫(單片機(jī)實(shí)驗(yàn))

    IIC及AT24C02的讀寫(單片機(jī)實(shí)驗(yàn))有問題歡迎私信哦課程設(shè)計(jì)(綜合實(shí)驗(yàn))內(nèi)容及要求通過IIC總線擴(kuò)展1片AT24C02芯片 ,實(shí)現(xiàn)單片
    發(fā)表于 11-22 09:21 ?73次下載
    <b class='flag-5'>IIC</b>及AT<b class='flag-5'>24C</b>02的<b class='flag-5'>讀寫</b>(單片機(jī)實(shí)驗(yàn))

    STM32入門開發(fā): 介紹IIC總線、讀寫AT24C02(EEPROM)(采用模擬時(shí)序)

    時(shí)序的,本文采用的是模擬時(shí)序,下篇文章就介紹配置STM32IIC硬件
    發(fā)表于 11-25 20:06 ?39次下載
    <b class='flag-5'>STM32</b>入門開發(fā): 介紹<b class='flag-5'>IIC</b>總線、<b class='flag-5'>讀寫</b>AT<b class='flag-5'>24C</b>02(EEPROM)(<b class='flag-5'>采用</b>模擬<b class='flag-5'>時(shí)序</b>)

    STM32 IIC讀寫AT24C02(一)

    要用IIC讀寫AT24C02,首先要了解IIC是什么。
    發(fā)表于 07-22 10:28 ?1105次閱讀
    <b class='flag-5'>STM32</b> <b class='flag-5'>IIC</b><b class='flag-5'>讀寫</b>AT<b class='flag-5'>24C</b>02(一)