0.png (11.95 KB, 下載次數: 52)
下載附件
2017-12-25 22:35 上傳
單片機源程序如下:
- /******************************************************************/
- /*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)
2017-12-25 20:07 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|