【1】24C02功能概述
24C02是一個2K Bit的串行EEPROM存儲器,内部含有256個位元組。在24C02裡面有一個8位元組的頁寫緩沖器。該裝置的工作電壓為1.8V到6.0V,晶片的第7引腳WP為寫保護引腳,将該引腳接地允許正常的讀寫。
【2】裝置位址
24C02的裝置位址包括固定部分和可程式設計部分。可程式設計部分需要根據硬體引腳A0、A1和A2來設定。裝置位址的最後一位用于設定資料傳輸的方向,即讀/寫位。格式如下圖:
在IIC總線協定中,裝置位址是起始信号後第一個發送的位元組。如果硬體位址引腳A0、A1、A2均接地,那麼,24C02的裝置的讀操作位址為:0xA1;而寫操作位址則為:0xA0。
【3】讀寫操作中的應答信号
在寫操作中,24C02每接收一個8位位元組後會産生一個應答信号。在讀操作中,24C02在發送一個8位資料後會釋放SDA線并監視應答信号。一旦收到應答信号,将繼續發送資料。如果主機沒有發送應答信号,從機則停止發送資料且等待一個停止信号。
【4】位元組寫操作
24C02接收完裝置位址後,産生應答信号;然後接收8位記憶體位元組位址,産生應答信号,接着接收一個8位資料,産生應答信号;最後主機發送停止信号,位元組寫操作結束。
【5】頁寫操作
24C02有一個8位元組的頁寫緩沖器,也就是說可以一次連續寫入8個位元組到緩沖器,然後由緩沖器一次性寫到EEPROM。頁寫操作初始化與位元組寫操作相同,隻是主機不會在寫完第一個資料後就發送停止信号,而是在24C02應答後,接着發送7個資料。
需要注意的是,24C02接收到每個資料後,其位元組位址的低3位會自動加1,高位位址不變,維持在目前頁内。當内部産生的位元組位址到達該頁邊界時,随後的資料将寫入該頁的頁首,先前的寫入的資料将會被覆寫。
【6】目前位址讀操作
24C02内部的位址寄存器會儲存着上次讀/寫操作最後一個位址加1的值。隻要晶片有電,該位址就一直儲存着。如果上次讀/寫操作的位址為N,那麼目前位址讀操作就從N+1開始。當讀到最後一個位元組(即255處),位址會回轉到0。
【7】位元組讀操作
主機首先發送起始信号,接着發送裝置位址和它想要讀取的資料記憶體位元組位址,執行一個僞寫操作。在24C02應答主機之後,主機重新發送起始信号和從裝置位址,進行讀操作。24C02響應并發送應答信号,然後輸出所要求的一個8位位元組資料。主機接收完這個8位資料後,産生一個“非應答”信号,最後發送停止條件,位元組讀操作結束。
【8】連續讀操作
在24C02發送完一個8位位元組資料之後,主機産生一個應答信号來響應,告知24C02要求讀取更多的資料,直到讀完最後一個資料,主機向24C02發送一個“非應答”信号,然後發送一個停止信号,結束此操作。
【9】基本讀寫操作流程
24C02的位元組寫操作,參考代碼:
void Write_24C02(unsigned char addr, unsigned char dat)
{
IIC_Start(); //IIC總線起始信号
IIC_SendByte(0xa0); //24C02的寫裝置位址
IIC_WaitAck(); //等待從機應答
IIC_SendByte(addr); //記憶體位元組位元組
IIC_WaitAck(); //等待從機應答
IIC_SendByte(dat); //寫入目标資料
IIC_WaitAck(); //等待從機應答
IIC_Stop(); //IIC總線停止信号
}
24C02的位元組讀操作,參考代碼:
unsigned char Read_24C02(unsigned char addr)
{
unsigned char tmp;
//進行一個僞寫操作
IIC_Start(); //IIC總線起始信号
IIC_SendByte(0xa0); //24C02寫裝置位址
IIC_WaitAck(); //等待從機應答
IIC_SendByte(addr); //記憶體自己位址
IIC_WaitAck(); //等待從機應答
//進行位元組讀操作
IIC_Start(); //IIC總線起始信号
IIC_SendByte(0xa1); //24C02讀裝置位址
IIC_WaitAck(); //等待從機應答
tmp = IIC_RecByte(); //讀取目标資料
IIC_Ack(0); //産生非應答信号
IIC_Stop(); //IIC總線停止信号
return tmp;
}
【10】進階強化實訓
【11】參考源碼共享
#include "regx52.h"
#include "absacc.h"
#include "iic.h"
unsigned char dat1 = 0, dat2 = 0, dat3 = 0;
unsigned char code SMG_duanma[18]=
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};
void DelaySMG(unsigned int t)
{
while(t--);
}
void DisplaySMG_Bit(unsigned char pos, unsigned char value)
{
XBYTE[0xE000] = 0xFF;
XBYTE[0xC000] = 0x01 << pos;
XBYTE[0xE000] = value;
}
void Write_24C02(unsigned char addr, unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
unsigned char Read_24C02(unsigned char addr)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
tmp = IIC_RecByte();
IIC_Ack(0);
IIC_Stop();
return tmp;
}
void Read_Write()
{
dat1 = Read_24C02(0x01);
dat2 = Read_24C02(0x03);
dat3 = Read_24C02(0x05);
dat1 = dat1 + 1;
dat2 = dat2 + 2;
dat3 = dat3 + 3;
if(dat1 > 10)
dat1 = 0;
if(dat2 > 20)
dat2 = 0;
if(dat3 > 30)
dat3 = 0;
Write_24C02(0x01, dat1);
DelaySMG(1000);
Write_24C02(0x03, dat2);
DelaySMG(1000);
Write_24C02(0x05, dat3);
DelaySMG(1000);
}
void DisplaySMG_24C02()
{
DisplaySMG_Bit(0, SMG_duanma[dat1/10]);
DelaySMG(500);
DisplaySMG_Bit(1, SMG_duanma[dat1%10]);
DelaySMG(500);
DisplaySMG_Bit(2, SMG_duanma[16]);
DelaySMG(500);
DisplaySMG_Bit(3, SMG_duanma[dat2/10]);
DelaySMG(500);
DisplaySMG_Bit(4, SMG_duanma[dat2%10]);
DelaySMG(500);
DisplaySMG_Bit(5, SMG_duanma[16]);
DelaySMG(500);
DisplaySMG_Bit(6, SMG_duanma[dat3/10]);
DelaySMG(500);
DisplaySMG_Bit(7, SMG_duanma[dat3%10]);
DelaySMG(500);
}
main()
{
XBYTE[0x8000] = 0xFF;
XBYTE[0xA000] = 0x00;
Read_Write();
while(1)
{
DisplaySMG_24C02();
}
}
【小蜜蜂筆記:廣東職業技術學院 歐浩源 [email protected]】