单片机源程序如下:
- /******************************************************************/
- /*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<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();
- }
-
- /*------------------------------------------*/
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
EE.rar
(1.09 MB, 下载次数: 30)
|