⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.c

📁 dsp 对eprom操作
💻 C
字号:
/*** macro define for 24c08 or.24c01 ***/                   
//#define DEBUG1                   /*NOTE: this line should delete if DSP working in NORMAL mode(ie. MC)*/
#include "eeprom.h" 
#include "regs2407.h"
//#ifdef DEBUG1
//#define LINE_I2C_DAT_0    *PFDATDIR =(*PFDATDIR|0x0100)&0xFFFE;   //IOPF0 
//#define LINE_I2C_DAT_1    *PFDATDIR |=0x0101                      //IOPF0
//#define LINE_I2C_CLK_0    *PFDATDIR &=0xFFFD                      //IOPF1
//#define LINE_I2C_CLK_1    *PFDATDIR |=0x0002                      //IOPF1
//#define LINE_I2C_DAT_OUT  *PFDATDIR |=0x0100                      //IOPF0
//#define LINE_I2C_DAT_IN   *PFDATDIR &=0xFEFF                      //IOPF0
//#define LINE_I2C_DAT      (*PFDATDIR & 0x0001)                    //IOPF0
//#else
#define LINE_I2C_DAT_0    *PBDATDIR =(*PBDATDIR|0x2000)&0xFFDF      //'IOPB5
#define LINE_I2C_DAT_1    *PBDATDIR |=0x2020                          //'IOPB5
#define LINE_I2C_CLK_0    *PBDATDIR &=0xFFEF                          //'IOPB4
#define LINE_I2C_CLK_1    *PBDATDIR |=0x0010                          //'IOPB4
#define LINE_I2C_DAT_OUT  *PBDATDIR |=0x2000                          //'IOPB5
#define LINE_I2C_DAT_IN   *PBDATDIR &=0xDFFF                          //'IOPB5                                                                     
#define LINE_I2C_DAT      (*PBDATDIR & 0x0020)                        //'IOPB5     
//#endif

/*** macro define for E2PROM ***/
#define READ     0x0A1
#define WRITE    0x0A0
#define ACCESS_LIMIT    0x07    
/**********************************************************************************************************/ 
void i2cstart(void)
{
   LINE_I2C_CLK_0;
   LINE_I2C_DAT_OUT; 
   		delay_us(10);
   LINE_I2C_DAT_1; 
   		delay_us(10);
   LINE_I2C_CLK_1;
   delay_us(30);
   LINE_I2C_DAT_0;
   delay_us(30);
   LINE_I2C_CLK_0;
   delay_us(30);
   LINE_I2C_DAT_1;   
}

void i2cstop(void)
{
		delay_us(1);
   LINE_I2C_CLK_0; 
   		delay_us(10);
   LINE_I2C_DAT_OUT;
   LINE_I2C_DAT_0; 
   		delay_us(10);
   LINE_I2C_CLK_1;
   delay_us(30);
   LINE_I2C_DAT_1;
   delay_us(30);
   LINE_I2C_CLK_0;
   
}


int i2crxack(void)         //'返回值0,表示操作成功
{                          //'返回值!0,表示操作失败
   int temp;
   LINE_I2C_DAT_IN;
   delay_us(10);
   LINE_I2C_CLK_1;
   delay_us(30);
   temp=LINE_I2C_DAT;
   delay_us(30);
   LINE_I2C_CLK_0;
   return(temp);
}

void i2ctxack(void)
{
   LINE_I2C_DAT_OUT;
   LINE_I2C_DAT_0;
   delay_us(30);
   LINE_I2C_CLK_1;
   delay_us(30);
   LINE_I2C_CLK_0; 
   		delay_us(10);
}

void i2cnoack(void) 
{
   LINE_I2C_DAT_OUT;
   LINE_I2C_DAT_1; 
   		delay_us(10);
   LINE_I2C_CLK_1;  
   delay_us(10);
   LINE_I2C_CLK_0;  
        delay_us(10);
}   


void i2ctxbyte(int data8) 
{
   int keepbit, nowbit;
   LINE_I2C_DAT_OUT;         
   for(keepbit=0x0080; keepbit!=0x00; keepbit=keepbit>>1 )  //'先发送字节数据的最高位
   {
      delay_us(10);
      LINE_I2C_CLK_0;
      delay_us(10);
      nowbit=data8&keepbit; 
      if(nowbit==0) 
      {
         LINE_I2C_DAT_0;
      } 
      else
      {
         LINE_I2C_DAT_1;      
      } 
      delay_us(10);
      LINE_I2C_CLK_1;
      delay_us(10);
   }   
   LINE_I2C_CLK_0;
}


int i2crxbyte(void)
{
   int i;
   int value=0;
   LINE_I2C_DAT_IN;
   LINE_I2C_CLK_0; 
   for(i=0;i<8;i++)
   {
	   		delay_us(10);
      LINE_I2C_CLK_1;
      value=value<<1;   //--
      if(LINE_I2C_DAT)  //--
      value=value|0x01; //--
            delay_us(10);

//'      if(LINE_I2C_DAT)
//'      {  value|=(0x080>>i); }    //'字节数据的最高位,最先被接收到
      LINE_I2C_CLK_0;
   } 
   return(value);
}
                                                       
///'''以下程序只能用于对AT24C08的读写操作                                                    
int read(int* aimaddr,int control, int length)         //' 前提条件: 总线启动信号、控制命令已送出
{                                                      //'           读E2PROM的源地址已送出,且收到应答信号
   int err=1, word_l, word_h;                          //'           该程序结束后应调用i2cstop()以停止I2C总线
   i2cstart();                                         //'总线停止信号尚未送出时,该程序读所送地址单元中的内容
   i2ctxbyte(control);                                 //'总线停止信号送出时,该程序读所送地址的下一个单元中的内容
   if(i2crxack()==0)            
   {                                                   
      for(;length>1; length--,aimaddr++)
      {
         word_h=(i2crxbyte())<<8;  //'最先收到的是高位字节
         i2ctxack();
         word_l=i2crxbyte(); 
         i2ctxack();
         *aimaddr=word_h|word_l;
      } 
      word_h=(i2crxbyte())<<8;
      i2ctxack();
      word_l=i2crxbyte();
      i2cnoack();
      *aimaddr=word_h|word_l;
      err=0;       //'清读错标志
   } 
   return(err);       //'返回0表示读操作正确
                      //'返回1表示读操作错误
}

                                                      
int write(int* sourseaddr,int control,int length )    //' 前提条件: 总线启动信号、控制命令已送出,
{                                                     //'           写E2PROM的目的地址已送出,且收到应答信号
                                                      //'           该程序结束后应调用i2cstop()以停止I2C总线
                                                       //'该程序写所送地址单元中的内容
   int err, word_l, word_h;  
    for(;length>0;length--,sourseaddr++)             
    {                                                 
        word_h=(*sourseaddr)>>8;
        word_l=(*sourseaddr)&0x00FF;
        i2ctxbyte(word_h);
        err=i2crxack();
        if(err==1)  break;
        i2ctxbyte(word_l);
        err=i2crxack();
        if(err==1)  break;
    }
    return(err);               //'返回0表示写操作正确
                              //'返回1表示写操作错误       

}


int e2prom(int* ramaddr, int romaddr,int control,int length)   //'control 采用宏参WRITE、READ
{                                                              //'为了简化程序的编写control命令字的第1、2为固定为0
   int err=1, temp;                                            //'所以romaddr只能取0~255,E2PROM只用了低256字节的空间
   i2cstart();
   temp=control&0x0FFFE;
   i2ctxbyte(temp);   
   if(i2crxack()==0)
   {
   i2ctxbyte(romaddr);
      if(i2crxack()==0)
      {
         switch(control) 
         {
             case READ:
                  err=read(ramaddr,control,length);
                  break;
             case WRITE:
                  err=write(ramaddr,control,length);
                  break;
         }
      }   
   }
   i2cstop();
   return(err);                   //'返回0表示操作正确
}                                 //'返回1表示操作错误

//'该程序调用方法 
//'   int k ,access_num=0;                  
//'   while(1)                 
//'   {                                
//'      k=e2prom();
//'      if(k==0)              //访问成功,结束对E2PROM的操作
//'      {  break;   }
//'      else
//'      {                     //访问不成功次数达到极限值,结束对E2PROM的操作
//'         if((++access_num)>=ACCESS_LIMIT)
//'         {  break; }
//'      }
//'   }
//'
//'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -