|
0.png (11.95 KB, 下載次數(shù): 52)
下載附件
2017-12-25 22:35 上傳
單片機(jī)源程序如下:
- /******************************************************************/
- /*Copyright (C), 2008-2009, 力天電子,LiTian Tech.Co.Ltd. */
- /* Module Name : GPIO */
- /* File Name : main.c */
- /* Author : 侯長(zhǎng)波 */
- /* Version : 2.0 */
- /* Function : 讀寫(xiě)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};
- /****************函數(shù)聲明*******************/
- 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);
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:主函數(shù) */
- /*------------------------------------------*/
- void main(void)
- {
- unsigned char i,temp=0,w_data=17,err=0,r_data;
- unsigned char * pointer;
- InitSysCtrl(); // 系統(tǒng)初始化子程序,在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);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值: void */
- /*函數(shù)描述:初始化24C02 */
- /*------------------------------------------*/
- void Init_24C02(void)
- {
- EALLOW;
- SCL_DIR=1;
- SDA_DIR=1;
- EDIS;
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:設(shè)置SDA引腳輸入 */
- /*------------------------------------------*/
- void Set_SDA_In(void)
- {
- EALLOW;
- SDA_DIR=0;
- EDIS;
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:設(shè)置SDA引腳輸出 */
- /*------------------------------------------*/
- void Set_SDA_Out(void)
- {
- EALLOW;
- SDA_DIR=1;
- EDIS;
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:完成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++);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:完成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++);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:完成IIC的主機(jī)應(yīng)答操作 */
- /*------------------------------------------*/
- 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++);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:void */
- /*函數(shù)描述:完成IIC的主機(jī)無(wú)應(yīng)答操作 */
- /*------------------------------------------*/
- 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++);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:從機(jī)是否有應(yīng)答:1--有,0--無(wú) */
- /*函數(shù)描述:檢查從機(jī)的應(yīng)答操作 */
- /*------------------------------------------*/
- 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數(shù)值
- SCL_OUT=0;
- for(i=0;i<30;i++);
- Set_SDA_Out();
- if(Slave_ACK==0)
- return TRUE;
- else
- return FALSE;
- }
- /*------------------------------------------*/
- /*形式參數(shù):content--發(fā)送的數(shù)據(jù) */
- /*返回值:void */
- /*函數(shù)描述:向IIC總線發(fā)送一個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- 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++);
- }
- /*------------------------------------------*/
- /*形式參數(shù):void */
- /*返回值:讀出的數(shù)據(jù) */
- /*函數(shù)描述:從IIC總線讀一個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- 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);
- }
- /*------------------------------------------*/
- /*形式參數(shù):Adr--地址,Data--數(shù)據(jù) */
- /*返回值:void */
- /*函數(shù)描述:向指定地址寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- void EEPROM_Write_Byte(unsigned char Adr,unsigned char Data)
- {
- unsigned char temp=0;
- unsigned int i;
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA0);//發(fā)送寫(xiě)命令
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- Write_Byte(Adr);//發(fā)送指針寄存器
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- Write_Byte(Data);//發(fā)送數(shù)據(jù)
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- Stop_IIC();
- for(i=0;i<10000;i++);//等待寫(xiě)入完成
- }
- /*------------------------------------------*/
- /*形式參數(shù):Adr--地址 */
- /*返回值:從指定的地址讀處的數(shù)據(jù) */
- /*函數(shù)描述:從指定地址讀出一個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- unsigned char EEPROM_Read_Byte(unsigned char Adr)
- {
- unsigned char temp=0,r_data;
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA0);//發(fā)送寫(xiě)命令
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return FALSE;
- }
- Write_Byte(Adr);//發(fā)送指針寄存器
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return FALSE;
- }
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA1);//發(fā)送讀命令
- temp=EEPROM_Check();//等ACK
- if(temp==FALSE)
- {
- return FALSE;
- }
- r_data=Read_Byte();
- Master_NO_ACK();
- Stop_IIC();
- return r_data;
- }
- /*------------------------------------------*/
- /*形式參數(shù):Adr--地址 length--長(zhǎng)度 *Data--指向數(shù)據(jù)的指針*/
- /*返回值:void */
- /*函數(shù)描述:向指定地址寫(xiě)入一個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- void EEPROM_Write_Page(unsigned char Adr,unsigned char length,unsigned char *Data)
- {
- unsigned char temp=0;
- unsigned int i,j;
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA0);//發(fā)送寫(xiě)命令
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- Write_Byte(Adr);//發(fā)送指針寄存器
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- for(i=0;i<length;i++)
- {
- Write_Byte(*Data);//發(fā)送數(shù)據(jù)
- Data++;
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return;
- }
- }
- Stop_IIC();
- for(j=0;j<10000;j++);//等待寫(xiě)入完成
- }
- /*------------------------------------------*/
- /*形式參數(shù):Adr--地址 length--長(zhǎng)度 buffer--數(shù)據(jù)存儲(chǔ)區(qū)*/
- /*返回值:void */
- /*函數(shù)描述:從指定地址讀出length個(gè)字節(jié)的數(shù)據(jù) */
- /*------------------------------------------*/
- void EEPROM_Read_Page(unsigned char Adr,unsigned length,unsigned char *buffer)
- {
- unsigned char temp=0,i;
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA0);//發(fā)送寫(xiě)命令
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return ;
- }
- Write_Byte(Adr);//發(fā)送指針寄存器
- temp=EEPROM_Check();//等待ACK
- if(temp==FALSE)
- {
- return ;
- }
- Start_IIC();//啟用數(shù)據(jù)總線
- Write_Byte(0xA1);//發(fā)送讀命令
- 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();
- }
-
- /*------------------------------------------*/
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
EE.rar
(1.09 MB, 下載次數(shù): 30)
2017-12-25 20:07 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|