• 方案介紹
    • 一、環(huán)境介紹
    • 二、AT24C02存儲(chǔ)芯片介紹
    • 三、IIC總線介紹
    • 四、IIC總線時(shí)序代碼、AT24C02讀寫代碼
  • 附件下載
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

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

02/11 09:46
3143
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

更多詳細(xì)資料請(qǐng)聯(lián)系.docx

共1個(gè)文件

一、環(huán)境介紹

編程軟件: keil5

操作系統(tǒng): win10

MCU型號(hào): STM32F103ZET6

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

IIC總線:??STM32本身支持IIC硬件時(shí)序的,本文采用的是模擬時(shí)序,下篇文章就介紹配置STM32的IIC硬件時(shí)序讀寫AT24C02和AT24C08。

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

目前器件: 采用AT24C02? EEPROM存儲(chǔ)芯片

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

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

2.1 芯片功能特性介紹

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

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

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

芯片功能描述:

AT24C02系列支持I2C,總線數(shù)據(jù)傳送協(xié)議I2C,總線協(xié)議規(guī)定任何將數(shù)據(jù)傳送到總線的器件作為發(fā)送器。任何從總線接收數(shù)據(jù)的器件為接收器;數(shù)據(jù)傳送是由產(chǎn)生串行時(shí)鐘和所有起始停止信號(hào)的主器件控制的。主器件和從器件都可以作為發(fā)送器或接收器,但由主器件控制傳送數(shù)據(jù)(發(fā)送或接收)的模式,由于A0、A1和A2可以組成000~111八種情況,即通過(guò)器件地址輸入端A0、A1和A2可以實(shí)現(xiàn)將最多8個(gè)AT24C02器件連接到總線上,通過(guò)進(jìn)行不同的配置進(jìn)行選擇器件。

芯片特性介紹:

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)部有頁(yè)緩沖區(qū),向AT24C0x寫入數(shù)據(jù)之后,還需要等待AT24C0x將緩沖區(qū)數(shù)據(jù)寫入到內(nèi)部EEPROM區(qū)域.

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

6. 100萬(wàn)次擦寫周期

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

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

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

IIC設(shè)備的標(biāo)準(zhǔn)地址位是7位。上面這個(gè)圖里AT24C02的1010是芯片內(nèi)部固定值,A2 、A1、 A0是硬件引腳、由硬件決定電平;最后一位是讀/寫位(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)在使用的開(kāi)發(fā)板上AT24C02的原理圖是這樣的:

那么這個(gè)AT24C02的標(biāo)準(zhǔn)設(shè)備地址就是: 0x50(十六進(jìn)制),對(duì)應(yīng)的二進(jìn)制就是: 1010000

如果將讀寫位組合在一起,讀權(quán)限的設(shè)備地址: 0xA1 (10100001)? 、寫權(quán)限的設(shè)備地址: 0xA0 (10100000)

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

? ? ?詳細(xì)解釋:

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

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

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

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

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

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

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

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

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

?詳細(xì)解釋:

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

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

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

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

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

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

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

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

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

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

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

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

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

.........

最多8次.

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

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

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

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

?詳細(xì)解釋:

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

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

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

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

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

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

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

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

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

讀數(shù)據(jù)沒(méi)有字節(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公司開(kāi)發(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 總線通過(guò)串行數(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è)備連接圖

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

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

2.3?I2C總線特征

I2C總線上的每一個(gè)設(shè)備都可以作為主設(shè)備或者從設(shè)備,而且每一個(gè)從設(shè)備都會(huì)對(duì)應(yīng)一個(gè)唯一的地址(可以從I2C器件的數(shù)據(jù)手冊(cè)得知)。主從設(shè)備之間就通過(guò)這個(gè)地址來(lái)確定與哪個(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。一般通過(guò)I2C總線接口可編程時(shí)鐘來(lái)實(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器件無(wú)法訪問(wèn)總線。

停止條件:當(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)榈碗娖降倪^(guò)程。SCL=1;SDA=1;SDA=0;

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

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)。

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

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

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

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

? 2.8 總線時(shí)序

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

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

4.1 iic.c? 這是IIC模擬時(shí)序完整代碼

#include "iic.h"

/*
函數(shù)功能:IIC接口初始化
硬件連接:
SDA:PB7
SCL:PB6
*/
void IIC_Init(void)
{
	RCC->APB2ENR|=1<<3;//PB
	GPIOB->CRL&=0x00FFFFFF;
	GPIOB->CRL|=0x33000000;
	GPIOB->ODR|=0x3<<6;
}

/*
函數(shù)功能:IIC總線起始信號(hào)
*/
void IIC_Start(void)
{
	IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
	IIC_SDA_OUT=1; 		 //數(shù)據(jù)線拉高
	IIC_SCL=1;     		 //時(shí)鐘線拉高
	DelayUs(4);        //電平保持時(shí)間
	IIC_SDA_OUT=0; 		 //數(shù)據(jù)線拉低
	DelayUs(4);        //電平保持時(shí)間
	IIC_SCL=0;     		 //時(shí)鐘線拉低
}


/*
函數(shù)功能:IIC總線停止信號(hào)
*/
void IIC_Stop(void)
{
	IIC_SDA_OUTMODE();    //初始化SDA為輸出模式
	IIC_SDA_OUT=0; 		 //數(shù)據(jù)線拉低
	IIC_SCL=0;     		 //時(shí)鐘線拉低
	DelayUs(4);           //電平保持時(shí)間
	IIC_SCL=1;     		 //時(shí)鐘線拉高
	DelayUs(4);           //電平保持時(shí)間
	IIC_SDA_OUT=1; 		 //數(shù)據(jù)線拉高
}

/*
函數(shù)功能:獲取應(yīng)答信號(hào)
返 回 值:1表示失敗,0表示成功
*/
u8 IIC_GetACK(void)
{
	u8 cnt=0;
	IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
	IIC_SDA_OUT=1; 		  //數(shù)據(jù)線上拉
	DelayUs(2);         //電平保持時(shí)間
	IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
	DelayUs(2);         //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
	IIC_SCL=1;     		  //時(shí)鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在開(kāi)始讀取數(shù)據(jù)
	while(IIC_SDA_IN)   //等待從機(jī)應(yīng)答信號(hào)
	{
		cnt++;
		if(cnt>250)return 1;
	}
	IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
	return 0;
}


/*
函數(shù)功能:主機(jī)向從機(jī)發(fā)送應(yīng)答信號(hào)
函數(shù)形參:0表示應(yīng)答,1表示非應(yīng)答
*/
void IIC_SendACK(u8 stat)
{
	IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
	IIC_SCL=0;     		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
	if(stat)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送非應(yīng)答信號(hào)
	else IIC_SDA_OUT=0; 	 //數(shù)據(jù)線拉低,發(fā)送應(yīng)答信號(hào)
	DelayUs(2);            //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
	IIC_SCL=1;     		     //時(shí)鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
	DelayUs(2);            //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
	IIC_SCL=0;     		  	 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
}


/*
函數(shù)功能:IIC發(fā)送1個(gè)字節(jié)數(shù)據(jù)
函數(shù)形參:將要發(fā)送的數(shù)據(jù)
*/
void IIC_WriteOneByteData(u8 data)
{
	u8 i;
	IIC_SDA_OUTMODE(); //初始化SDA為輸出模式
	IIC_SCL=0;     		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
	for(i=0;i<8;i++)
	{
		if(data&0x80)IIC_SDA_OUT=1; //數(shù)據(jù)線拉高,發(fā)送1
		else IIC_SDA_OUT=0; 	 //數(shù)據(jù)線拉低,發(fā)送0
		IIC_SCL=1;     		     //時(shí)鐘線拉高,告訴從機(jī),主機(jī)數(shù)據(jù)發(fā)送完畢
		DelayUs(2);            //電平保持時(shí)間,等待從機(jī)接收數(shù)據(jù)
		IIC_SCL=0;     		 		 //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要發(fā)送數(shù)據(jù)
		DelayUs(2);            //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
		data<<=1;              //先發(fā)高位
	}
}


/*
函數(shù)功能:IIC接收1個(gè)字節(jié)數(shù)據(jù)
返 回 值:收到的數(shù)據(jù)
*/
u8 IIC_ReadOneByteData(void)
{
	u8 i,data;
	IIC_SDA_INPUTMODE();//初始化SDA為輸入模式
	for(i=0;i<8;i++)
	{
		IIC_SCL=0;     		  //時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù)
		DelayUs(2);         //電平保持時(shí)間,等待從機(jī)發(fā)送數(shù)據(jù)
		IIC_SCL=1;     		  //時(shí)鐘線拉高,告訴從機(jī),主機(jī)現(xiàn)在正在讀取數(shù)據(jù)
		data<<=1;           
		if(IIC_SDA_IN)data|=0x01;
		DelayUs(2);         //電平保持時(shí)間,等待時(shí)鐘線穩(wěn)定
	}
	IIC_SCL=0;     		  		//時(shí)鐘線拉低,告訴從機(jī),主機(jī)需要數(shù)據(jù) (必須拉低,否則將會(huì)識(shí)別為停止信號(hào))
	return data;
}


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

#include "at24c02.h"
/*
函數(shù)功能:檢查AT24C02是否存在
返 回 值:1表示失敗,0表示成功
*/
u8 At24c02Check(void)
{
	u8 data;
	At24c02WriteOneByteData(255,0xAA);
	data=At24c02ReadOneByteData(255);
	if(data==0xAA)return 0;
	else return 1;
}


/*
函數(shù)功能:AT24C02隨機(jī)讀數(shù)據(jù)
函數(shù)形參:讀取的地址(0~255)
返 回 值:讀出一個(gè)數(shù)據(jù)
*/
u8 At24c02ReadOneByteData(u32 addr)
{
	u8 data;
	IIC_Start(); //發(fā)送起始信號(hào)	
	IIC_WriteOneByteData(AT24C02_WRITE_ADDR); //設(shè)置寫模式
	IIC_GetACK();//獲取應(yīng)答
	IIC_WriteOneByteData(addr); //設(shè)置讀取數(shù)據(jù)的位置
	IIC_GetACK();//獲取應(yīng)答

	IIC_Start(); //發(fā)送起始信號(hào)	
	IIC_WriteOneByteData(AT24C02_READ_ADDR); //設(shè)置讀模式
	IIC_GetACK();//獲取應(yīng)答
	data=IIC_ReadOneByteData(); //接收數(shù)據(jù)
	IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
	IIC_Stop(); //停止信號(hào)
	return data;
}


/*
函數(shù)功能:AT24C02寫一個(gè)字節(jié)的數(shù)據(jù)
函數(shù)形參:
		addr:寫入的地址(0~255)
		data:寫入的數(shù)據(jù)
*/
void At24c02WriteOneByteData(u32 addr,u8 data)
{
	IIC_Start(); //發(fā)送起始信號(hào)
	IIC_WriteOneByteData(AT24C02_WRITE_ADDR); //設(shè)置寫模式
	IIC_GetACK();//獲取應(yīng)答
	IIC_WriteOneByteData(addr); //設(shè)置寫入數(shù)據(jù)的位置
	IIC_GetACK();//獲取應(yīng)答
	IIC_WriteOneByteData(data); //設(shè)置寫入的數(shù)據(jù)
	IIC_GetACK();//獲取應(yīng)答
	IIC_Stop();  //停止信號(hào)
	DelayMs(10); //等待寫入完畢
}


/*
函數(shù) 功 能:AT24C02當(dāng)前位置讀一個(gè)字節(jié)數(shù)據(jù)
函數(shù)返回值:讀出的數(shù)據(jù)
*/
u8 At24c02CurrentAddrReadOneByteData(void)
{
	u8 data;
	IIC_Start(); //發(fā)送起始信號(hào)
	IIC_WriteOneByteData(AT24C02_READ_ADDR); //設(shè)置讀模式
	IIC_GetACK();//獲取應(yīng)答
	data=IIC_ReadOneByteData(); //接收數(shù)據(jù)
	IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
	IIC_Stop(); //停止信號(hào)
	return data;
}



/*
函數(shù)功能:AT24C02連續(xù)讀數(shù)據(jù)
函數(shù)形參:
u8 addr   //讀取的地址(0~255)
u8 len    //讀取的長(zhǎng)度
u8 *buff  //讀出的數(shù)據(jù)存放緩沖區(qū)
*/
void At24c02ReadByteData(u32 addr,u8 len,u8 *buff)
{
	u8 i;
	IIC_Start(); //發(fā)送起始信號(hào)	
	IIC_WriteOneByteData(AT24C02_WRITE_ADDR); //設(shè)置寫模式
	IIC_GetACK();//獲取應(yīng)答
	IIC_WriteOneByteData(addr); //設(shè)置讀取數(shù)據(jù)的位置
	IIC_GetACK();//獲取應(yīng)答	
	IIC_Start(); //發(fā)送起始信號(hào)	
	IIC_WriteOneByteData(AT24C02_READ_ADDR); //設(shè)置讀模式
	IIC_GetACK();//獲取應(yīng)答

	for(i=0;i<len;i++)
	{
		 buff[i]=IIC_ReadOneByteData(); //接收數(shù)據(jù)
		 IIC_SendACK(0); //發(fā)送應(yīng)答信號(hào)
	}
	IIC_SendACK(1); //發(fā)送非應(yīng)答信號(hào)
	IIC_Stop(); //停止信號(hào)
}


/*
函數(shù)功能:AT24C02頁(yè)寫
函數(shù)形參:
		addr:寫入的地址(0~255)
		*data:寫入的數(shù)據(jù)緩沖區(qū)
		len :寫入的長(zhǎng)度

1. 頁(yè)寫的緩沖區(qū)大小是8個(gè)字節(jié),一次最多寫8個(gè)字節(jié)進(jìn)去。
2. 頁(yè)寫的地址是固定的。

0~7 是第一頁(yè)
8~15是第二頁(yè)			
*/
void At24c02PageWrite(u32 addr,u8 *data,u8 len)
{
	u8 i;
	IIC_Start(); //發(fā)送起始信號(hào)
	IIC_WriteOneByteData(AT24C02_WRITE_ADDR); //設(shè)置寫模式
	IIC_GetACK();//獲取應(yīng)答
	IIC_WriteOneByteData(addr); //設(shè)置寫入數(shù)據(jù)的位置
	IIC_GetACK();//獲取應(yīng)答

	for(i=0;i<len;i++)
	{
		IIC_WriteOneByteData(data[i]); //設(shè)置寫入的數(shù)據(jù)
		IIC_GetACK();//獲取應(yīng)答
	}
	IIC_Stop();  //停止信號(hào)
	DelayMs(10); //等待寫入完畢
}


void AT24C02_WriteData(u32 addr,u8 *data,u8 len)
{
    u32 page_remain=8-addr%8; //一頁(yè)剩余的字節(jié)數(shù)量
    if(page_remain>=len)
    {
        page_remain=len;
    }
    while(1)
    {
        At24c02PageWrite(addr,data,page_remain);
        if(page_remain==len)
        {
            break;
        }
        addr+=page_remain;
        data+=page_remain;
        len-=page_remain;
        if(len>=8)page_remain=8;
        else page_remain=len;
    }
}
  • 更多詳細(xì)資料請(qǐng)聯(lián)系.docx
    下載
意法半導(dǎo)體

意法半導(dǎo)體

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.

意法半導(dǎo)體(ST)集團(tuán)于1987年6月成立,是由意大利的SGS微電子公司和法國(guó)Thomson半導(dǎo)體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導(dǎo)體有限公司。意法半導(dǎo)體是世界最大的半導(dǎo)體公司之一,公司銷售收入在半導(dǎo)體工業(yè)五大高速增長(zhǎng)市場(chǎng)之間分布均衡(五大市場(chǎng)占2007年銷售收入的百分比):通信(35%),消費(fèi)(17%),計(jì)算機(jī)(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計(jì)數(shù)據(jù),意法半導(dǎo)體是全球第五大半導(dǎo)體廠商,在很多市場(chǎng)居世界領(lǐng)先水平。例如,意法半導(dǎo)體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導(dǎo)體和機(jī)頂盒芯片供應(yīng)商,而且在分立器件、手機(jī)相機(jī)模塊和車用集成電路領(lǐng)域居世界前列.收起

查看更多

相關(guān)推薦