?? eeprom.c
字號:
#include "register.h"
int source[4]={0x2233,0x4455,0x4455,0x5566};
int result[4];
int n,control,control1;
//系統初始化子程序
void sysinitial()
{
asm(" setc INTM");//關閉總中斷
asm(" clrc OVM");//累加器結果正常溢出
asm(" clrc CNF");//B0被設置成數據空間
SCSR1=0X81FE;//CLKIN=10M,CLKOUT=20M
WDCR=0X0E8;//不使能看門狗
IMR=0X00;//禁止所有中斷
WSGR=0X0FFFF;//不使能所有的等待狀態
}
//I/O初始化子程序
void ioinitial()
{
MCRC=MCRC&0X8FFF;//定義IOPF4、IOPF5、IOPF6為通用I/O口
PFDATDIR=PFDATDIR|0X3000;//IOPF5為輸出,IOPF4為輸出,且寫允許
}
//延時子程序
void delay(int x)
{ int count;
for(count=0;count<x;count++)
;
}
//啟動I2C總線子程序
void I2CStart()
{
PFDATDIR=PFDATDIR|0X0060;//SDA=SCL=1
delay(72);//延時
PFDATDIR=PFDATDIR&0x0FFBF;//SDA=0
delay(72);//延時
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(24);//延時
}
//向I2C總線寫入數據子程序
void I2CSendByte(unsigned int data)
{
int flag,sz,k;
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(72);//延時
PFDATDIR=PFDATDIR|0X4000;//定義IOPF6為輸出
for(flag=0x0080;flag!=0X00;flag=flag>>1)
{
sz=data&flag;//保留相應位
if(sz==0)PFDATDIR=PFDATDIR&0x0FFBF;//如果相應的位為0,則SDA=0;
else PFDATDIR=PFDATDIR|0x0040;//如果相應的位為1,則SDA=1;
delay(72);//延時
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(72);//延時
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(24);//延時
}
}
//檢查應答位子程序(24LC256的應答)
int I2CRECACK()
{
int k;
PFDATDIR=PFDATDIR|0x0040;//SDA=1
delay(24);//延時
PFDATDIR=PFDATDIR&0x0BFFF;//SDA為輸入
delay(24);//延時
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(24);//延時
if(PFDATDIR&0x0040)
k=1;
else k=0;
PFDATDIR=(PFDATDIR|0X4000)&0XFF9F;/*SDA設為輸出,SDA=0,SCL=0*/
delay(24); //后來加的?。。。? return(k);
}
//從I2C總線讀取數據子程序
int I2CRecByte()
{
int k,flag,sz,kk=0x0000;
PFDATDIR=PFDATDIR&0x0BFFF;//SDA為輸入
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(72);
for(flag=0x080;flag!=0;flag=flag>>1)
{
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(72);//延時
sz=PFDATDIR&0X0040;//讀取SDA的值
if(sz==0) kk=kk;//若SDA=0,在相應的
else kk=kk|flag;//若SDA=1,在相應的數據位加數據位加0
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(72); //延時
}
PFDATDIR=PFDATDIR|0X4000; //SDA為輸出
delay(24); //延時
return(kk);
}
//對I2C總線產生應答(LF2407)
void I2CAck()
{
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
PFDATDIR=PFDATDIR&0x0FFBF;//SDA=0
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(24);//延時
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
// delay(20);//延時
}
//不對I2C總線產生應答
void I2CNoAck()
{
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(24);//延時
PFDATDIR=PFDATDIR&0x0FFDF;//SCL=0
delay(24);//延時
}
//停止I2C總線
void I2CStop()
{
PFDATDIR=PFDATDIR&0x0FFBF;//SDA=0
delay(24);//延時
PFDATDIR=PFDATDIR|0X0020;//SCL=1
delay(24);//延時
PFDATDIR=PFDATDIR|0x0040;//SDA=1
delay(24);//延時
}
//通用寫24LC256子程序,入口參數為輸入/輸出緩沖區首地址array,
//24LC256的塊內地址adress,控制字節control,需要讀寫的字節數n
int EEPROM_WR(int adress,int *array,int control,int n)
{
int dat,k;
PFDATDIR=PFDATDIR&0x0FFEF;//設置寫允許,WP=0
I2CStart();//啟動I2C
I2CSendByte(control);//送出寫控制字
dat=I2CRECACK();//檢查應答位
/* if(dat==0)I2CSendByte((page>>8)&0xff);//若應答正確,送頁數的高8位
dat=I2CRECACK(); //檢查應答位
if(dat==0)I2CSendByte(page&0xff);//若應答正確,送頁數的低8位
dat=I2CRECACK();//檢查應答位 */
if(dat==0)I2CSendByte((adress>>8)&0x00FF);//若應答正確,送地址的高8位
dat=I2CRECACK();//檢查應答位
if(dat==0)I2CSendByte(adress&0x00FF);//若應答正確,送地址的低8位
dat=I2CRECACK();//檢查應答位
if(dat==0) //若應答正確,送數據
{
for(k=0;k<n;k++)
{
I2CSendByte((*array>>8)&0X00FF); //送數據的高8位
dat=I2CRECACK();//檢查應答位
if(dat==1)break;//應答不正確,中斷
I2CSendByte(*array&0X00FF);//應答正確,送數據的低8位
dat=I2CRECACK();//檢查應答位
if(dat==1)break;//應答不正確,中斷
array++;
}
}
I2CStop();//停止I2C總線
return(dat);
}
//通用讀24LC256子程序,入口參數為輸入/輸出緩沖區首地址array,
//24LC256的塊內地址adress,控制字節control,需要讀寫的字節數n
int EEPROM_RD(int adress,int *array,int control,int control1,int n)
{
int dat,k;
I2CStart();//啟動I2C
I2CSendByte(control);//送出寫控制字
dat=I2CRECACK();//檢查應答位
/* if(dat==0)I2CSendByte((page>>8)&0xff);//若應答正確,送頁數的高8位
dat=I2CRECACK();//檢查應答位
if(dat==0)I2CSendByte(page&0xff);//若應答正確,送頁數的低8位
dat=I2CRECACK();//檢查應答位 */
if(dat==0)I2CSendByte((adress>>8)&0x00FF);//若應答正確,送地址的高8位
dat=I2CRECACK();//檢查應答位
if(dat==0)I2CSendByte(adress&0x00FF);//若應答正確,送地址的低8位
dat=I2CRECACK();//檢查應答位
if(dat==0)
{
I2CStart();//應答正確,啟動I2C
I2CSendByte(control1);//送讀控制字
}
dat=I2CRECACK();//檢查應答位
if(dat==0)//應答正確,接收數據
{
for(k=0;k<(n-1);k++)
{
dat=I2CRecByte();//接收高8位數據
*array=(dat<<8)&0xff00;//將接收到的8位數據保存為*array的高8位
I2CAck();//主機應答
dat=I2CRecByte(); //接收低8位數據
*array|=dat&0x00ff;//將接收到的8位數據保存為*array的低8位
I2CAck();//主機應答
array++;
}
dat=I2CRecByte();//接收最后一個字的高8位數據
*array=(dat<<8)&0xff00;//將接收到的8位數據保存為*array的高8位
I2CAck();//主機應答
dat=I2CRecByte();//接收最后一個字的低8位數據
*array|=dat&0x00ff;//將接收到的8位數據保存為*array的低8位
I2CNoAck();//不產生應答信號
I2CStop();//停止I2C
dat=0x00; //dat值賦0,表示前面的操作成功
}
return(dat);
}
//主程序
main()
{
int k;
sysinitial();//系統初始化
ioinitial();//IO初始化
while(1)
{
k=EEPROM_WR(0x01,source,0xA0,4);//寫EEPROM
if(k==0)//如果寫入成功,則進行讀操作,否則繼續寫操作
{
delay(5800);//延時
k=EEPROM_RD(0x01,result,0xA0,0xA1,4); //讀EEPROM
asm(" nop");
}
}
}
//直接返回中斷服務子程序
void interrupt nothing()
{
return;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -