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

📄 main.c

📁 力天电子 dsp源码
💻 C
字号:
/******************************************************************/
/*Copyright (C), 2008-2009, 力天电子,LiTian Tech.Co.Ltd.		  */
/*  Module Name   : GPIO        							  	  */
/*  File Name     : main.c	   									  */        
/*  Author   	  : 侯长波                                        */     
/*  Create Date   : 2009/12/27                                    */      
/*  Version   	  : 2.0                                           */          
/*  Function      : 读写EEPROM 24C02       					      */                       
/*  Description   : 								              */            
/*  Support       : www.LT430.com 				                  */             
/******************************************************************/

/*****************头文件********************/  
#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<length;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<length-1;i++)
	{
		*buffer=Read_Byte();
		buffer++;
		Master_ACK();
	}
	*buffer=Read_Byte();
	Master_NO_ACK();
  	Stop_IIC();
}
    
/*------------------------------------------*/
/*形式参数:void							*/
/*返回值:当前地址的数据			  		    */
/*函数描述:从EEPROM的当前地址读取1个字节的数据*/
/*------------------------------------------*/  
unsigned char EEPROM_Current_Addr_Read(void)
{
	unsigned char temp;
  	Start_IIC();//启用数据总线
	Write_Byte(0xA1);//发送读命令
  	temp=EEPROM_Check();//等待ACK
  	if(temp==FALSE)
  	{
    	return FALSE;
  	}
	temp=Read_Byte();
	Master_NO_ACK();
  	Stop_IIC();
	return temp;
} 

/*------------------------------------------*/
/*形式参数:length--长度 buffer--数据存储区 */
/*返回值:void					  		    */
/*函数描述:从EEPROM的当前地址读取1个字节的数据*/
/*------------------------------------------*/  
void EEPROM_Sequential_Read(unsigned length,unsigned char *buffer)
{
	unsigned char temp,i;
  	Start_IIC();//启用数据总线
	Write_Byte(0xA1);//发送读命令
  	temp=EEPROM_Check();//等待ACK
  	if(temp==FALSE)
  	{
    	return ;
  	}
	for(i=0;i<length-1;i++)
	{
		*buffer=Read_Byte();
		buffer++;
		Master_ACK();
	}
	*buffer=Read_Byte();
	Master_NO_ACK();
  	Stop_IIC();
}  


 

⌨️ 快捷键说明

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