[资料分享] DSP281x 读写EEPROM 24C02编程例程

Jacktang   2018-3-18 21:00 楼主
源程序如下:
/******************************************************************/
/*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd.                  */
/*  Module Name   : GPIO                                                                            */
/*  File Name     : main.c                                                                                     */        
/*  Author             : 侯长波                                        */     
/*  Version             : 2.0                                           */         
/*  Function      : 读写EEPROM 24C02                                                     */                       
/*  Description   :                                                                               */            
/******************************************************************/

/*****************头文件********************/  
#include "DSP281x_Device.h"
#include "System.h"

/****************端口宏定义*****************/
#define SCL_OUT GpioDataRegs.GPDDAT.bit.GPIOD0
#define SCL_DIR GpioMuxRegs.GPDDIR.bit.GPIOD0
#define SDA_DAT GpioDataRegs.GPDDAT.bit.GPIOD1
#define SDA_DIR GpioMuxRegs.GPDDIR.bit.GPIOD1  

/****************常量宏定义*****************/
#define TRUE    1
#define FALSE   0  

/***************全局变量定义****************/
unsigned char w_buffer[8]={23,18,18,20,32,25,28,29};
unsigned char r_buffer[8]={0};

/****************函数声明*******************/
void Init_24C02(void);
void Set_SDA_In(void);
void Set_SDA_Out(void);
void Start_IIC(void);
void Stop_IIC(void);
void Master_ACK(void);
void Master_NO_ACK(void);
void Write_Byte(unsigned char content);
unsigned char Read_Byte(void);
unsigned char EEPROM_Check(void);
void EEPROM_Write_Byte(unsigned char Adr,unsigned char Data);
unsigned char EEPROM_Read_Byte(unsigned char Adr);
void EEPROM_Write_Page(unsigned char Adr,unsigned char length,unsigned char *Data);
void EEPROM_Read_Page(unsigned char Adr,unsigned length,unsigned char *buffer);
unsigned char EEPROM_Current_Addr_Read(void);
void EEPROM_Sequential_Read(unsigned length,unsigned char *buffer);

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:主函数                                        */
/*------------------------------------------*/
void main(void)
{
        unsigned char i,temp=0,w_data=17,err=0,r_data;
        unsigned char * pointer;
        InitSysCtrl();  // 系统初始化子程序,在DSP28_sysctrl.c中
        Init_24C02();
        for(i=0;i<8;i++)
                r_buffer[i]=0;
        for(i=0;i<5;i++)
        {
                EEPROM_Write_Byte(temp++,w_data++);
        }
        temp=0;
        w_data=17;
        for(i=0;i<5;i++)
        {
                r_data=EEPROM_Read_Byte(temp++);
                if(r_data!=w_data)
                        err=err+1;
                w_data++;
        }
        EEPROM_Write_Page(0x28,8,w_buffer);
        EEPROM_Read_Page(0x28,8,r_buffer);
        while(1);   
}

/*------------------------------------------*/
/*形式参数:void                                            */
/*返回值: void                                                      */
/*函数描述:初始化24C02                                            */
/*------------------------------------------*/
void Init_24C02(void)
{
        EALLOW;
        SCL_DIR=1;
          SDA_DIR=1;
        EDIS;
}   

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:设置SDA引脚输入                        */
/*------------------------------------------*/  
void Set_SDA_In(void)
{
          EALLOW;        
          SDA_DIR=0;
          EDIS;
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:设置SDA引脚输出                        */
/*------------------------------------------*/
void Set_SDA_Out(void)
{
          EALLOW;        
          SDA_DIR=1;
          EDIS;
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:完成IIC的起始条件操作            */
/*------------------------------------------*/
void Start_IIC(void)
{
        unsigned char i;
          SCL_OUT=1;
          SDA_DAT=1;
          for(i=0;i<30;i++);
        SDA_DAT=0;
          for(i=0;i<30;i++);
          SCL_OUT=0;
          for(i=0;i<30;i++);
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:完成IIC的终止条件操作            */
/*------------------------------------------*/  
void Stop_IIC(void)
{
        unsigned char i;
          SDA_DAT=0;
          for(i=0;i<30;i++);
          SCL_OUT=1;
          for(i=0;i<30;i++);
          SDA_DAT=1;
          for(i=0;i<30;i++);           
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:完成IIC的主机应答操作            */
/*------------------------------------------*/  
void Master_ACK(void)
{
          unsigned char i;
          SDA_DAT=0;
          for(i=0;i<30;i++);
          SCL_OUT=1;
          for(i=0;i<30;i++);        
          SCL_OUT=0;
          for(i=0;i<10;i++);
          SDA_DAT=1;     
          for(i=0;i<30;i++);        
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:void                                                */
/*函数描述:完成IIC的主机无应答操作          */
/*------------------------------------------*/  
void Master_NO_ACK(void)
{
          unsigned char i;
          SDA_DAT=1;
          for(i=0;i<30;i++);
          SCL_OUT=1;
          for(i=0;i<30;i++);        
          SCL_OUT=0;
          for(i=0;i<30;i++);
          SDA_DAT=0;
          for(i=0;i<30;i++);               
}

/*------------------------------------------*/
/*形式参数:void                            */
/*返回值:从机是否有应答:1--有,0--无       */
/*函数描述:检查从机的应答操作                        */
/*------------------------------------------*/  
unsigned char EEPROM_Check(void)
{
          unsigned char i,Slave_ACK;
          SDA_DAT=1;
          for(i=0;i<30;i++);
          SCL_OUT=1;
          for(i=0;i<30;i++);
          Set_SDA_In();
          for(i=0;i<30;i++);
          Slave_ACK = SDA_DAT;   //读入SDA数值
          SCL_OUT=0;
          for(i=0;i<30;i++);
          Set_SDA_Out();        
          if(Slave_ACK==0)
                  return TRUE;   
          else            
            return FALSE;
}

/*------------------------------------------*/
/*形式参数:content--发送的数据             */
/*返回值:void                                                        */
/*函数描述:向IIC总线发送一个字节的数据      */
/*------------------------------------------*/  
void Write_Byte(unsigned char content)
{
          unsigned char i,j;
          for(i = 8;i > 0;i--)
          {
            if((content&0x80)==0x80)        
            {
                      SDA_DAT=1;
                      for(j=0;j<30;j++);
                      SCL_OUT=1;
                      for(j=0;j<30;j++);
                      SCL_OUT=0;                        
                      for(j=0;j<30;j++);
            }
            else
            {
                      SDA_DAT=0;
                      for(j=0;j<30;j++);
                      SCL_OUT=1;
                      for(j=0;j<30;j++);
                      SCL_OUT=0;                        
                      for(j=0;j<30;j++);
            }
                content <<= 1;
          }                  
          SDA_DAT=1;
          for(i=0;i<30;i++);
}

/*------------------------------------------*/
/*形式参数:void                                            */
/*返回值:读出的数据                                                    */
/*函数描述:从IIC总线读一个字节的数据        */
/*------------------------------------------*/
unsigned char Read_Byte(void)
{
        unsigned char i,j,temp=0;
          for(i = 0;i < 8;i++)
          {
                Set_SDA_Out();
                SDA_DAT=1;
                SCL_OUT=1;
                for(j=0;j<30;j++);
                Set_SDA_In();
            if(SDA_DAT==1)
                      temp |= (0x01 << (7-i));
            SCL_OUT=0;
                for(j=0;j<30;j++);
          }
        Set_SDA_Out();
          return(temp);
}

/*------------------------------------------*/
/*形式参数:Adr--地址,Data--数据           */
/*返回值:void                                                            */
/*函数描述:向指定地址写入一个字节的数据     */
/*------------------------------------------*/
void EEPROM_Write_Byte(unsigned char Adr,unsigned char Data)
{
        unsigned char temp=0;
        unsigned int i;
          Start_IIC();//启用数据总线
          Write_Byte(0xA0);//发送写命令
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return;
          }
          Write_Byte(Adr);//发送指针寄存器
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return;
          }
          Write_Byte(Data);//发送数据
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return;
          }
          Stop_IIC();
        for(i=0;i<10000;i++);//等待写入完成
}

/*------------------------------------------*/
/*形式参数:Adr--地址                                    */
/*返回值:从指定的地址读处的数据                      */
/*函数描述:从指定地址读出一个字节的数据     */
/*------------------------------------------*/
unsigned char EEPROM_Read_Byte(unsigned char Adr)
{
        unsigned char temp=0,r_data;
          Start_IIC();//启用数据总线
          Write_Byte(0xA0);//发送写命令
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return FALSE;
          }
          Write_Byte(Adr);//发送指针寄存器
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return FALSE;
          }
        Start_IIC();//启用数据总线
        Write_Byte(0xA1);//发送读命令
          temp=EEPROM_Check();//等ACK
          if(temp==FALSE)
          {
            return FALSE;
          }
        r_data=Read_Byte();
        Master_NO_ACK();
          Stop_IIC();
        return r_data;
}   

/*------------------------------------------*/
/*形式参数:Adr--地址 length--长度 *Data--指向数据的指针*/
/*返回值:void                                                            */
/*函数描述:向指定地址写入一个字节的数据     */
/*------------------------------------------*/   
void EEPROM_Write_Page(unsigned char Adr,unsigned char length,unsigned char *Data)
{
        unsigned char temp=0;
        unsigned int i,j;
          Start_IIC();//启用数据总线
          Write_Byte(0xA0);//发送写命令
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return;
          }
          Write_Byte(Adr);//发送指针寄存器
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return;
          }
        for(i=0;i         {
                  Write_Byte(*Data);//发送数据
                Data++;
                  temp=EEPROM_Check();//等待ACK        
                  if(temp==FALSE)
                  {
                    return;
                  }
        }
          Stop_IIC();
        for(j=0;j<10000;j++);//等待写入完成
}  

/*------------------------------------------*/
/*形式参数:Adr--地址 length--长度 buffer--数据存储区*/
/*返回值:void                                                              */
/*函数描述:从指定地址读出length个字节的数据 */
/*------------------------------------------*/
void EEPROM_Read_Page(unsigned char Adr,unsigned length,unsigned char *buffer)
{
        unsigned char temp=0,i;
          Start_IIC();//启用数据总线
          Write_Byte(0xA0);//发送写命令
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return ;
          }
          Write_Byte(Adr);//发送指针寄存器
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return ;
          }
        Start_IIC();//启用数据总线
        Write_Byte(0xA1);//发送读命令
          temp=EEPROM_Check();//等待ACK
          if(temp==FALSE)
          {
            return ;
          }
        for(i=0;i         {
                *buffer=Read_Byte();
                buffer++;
                Master_ACK();
        }
        *buffer=Read_Byte();
        Master_NO_ACK();
          Stop_IIC();
}

/*------------------------------------------*/
……………………


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复