源程序如下:
/******************************************************************/
/*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();
}
/*------------------------------------------*/
……………………