?? eeprom.c
字號:
/*************************************************************************
filename EEPROM.c
designer 戴展波
date 2004/12/29
*************************************************************************/
#include "DSP28_Device.h"
#include "EEPROM.h"
extern unsigned int *ram_addr;
extern unsigned int flag,EEPROM_Addr1,Write_Length1;
extern unsigned char Spi_VarRx[155];
/*********************************************************************
函數名: void EEPROM_Write_Enable(void)
目的: EEPROM的寫使能
輸入: 無
輸出: 無
*********************************************************************/
void EEPROM_Write_Enable(void)
{
// unsigned int i;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0; //使能ste
//發送SPI
SpiaRegs.SPITXBUF = WREN;
//
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
delay_time(60);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}
/*********************************************************************
函數名: void EEPROM_Write_Disable(void)
目的: EEPROM的寫關閉
輸出: 無
*********************************************************************/
void EEPROM_Write_Disable(void)
{
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = WRDI;
//
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
delay_time(100);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
}
/*********************************************************************
函數名: unsigned int EEPROM_Read_Status(void)
目的: EEPROM的讀狀態
輸入: 無
輸出: 無
*********************************************************************/
unsigned int EEPROM_Read_Status(void)
{
unsigned int i,data;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = RDSR;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = 0xff;
for(i = 0; i < 100; i++);
//判斷SPI發送準備好
while(Spi_RxReady() == 0);
//發送SPI
data = SpiaRegs.SPIRXBUF;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
return data;
}
/*********************************************************************
函數名: void EEPROM_Write_Status(unsigned int write_status)
目的: EEPROM的寫狀態
輸入: write_status 寫狀態寄存器的控制字
輸出: 無
*********************************************************************/
void EEPROM_Write_Status(unsigned int write_status)
{
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = WRSR;
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = write_status;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
delay_time(100);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//
for(i = 0; i < 100; i++);
}
/*********************************************************************
函數名: unsigned int EEPROM_Read(unsigned int address)
目的: EEPROM的讀
輸入: length 讀EEPROM的8位BYTE長度
address 讀EEPROM的首地址,16BIT
輸出: 無
*********************************************************************/
unsigned int EEPROM_Read(unsigned int address)
{
unsigned int j;
unsigned int data;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = READ;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = address;
//for(i = 0; i < 10000; i++);
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = address << 8;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI~~~~~~
SpiaRegs.SPITXBUF = 0x5500;
for(j = 0; j < 100; j++);
//判斷SPI發送準備好
while(Spi_RxReady() == 0);
//發送SPI
data = SpiaRegs.SPIRXBUF;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
delay_time(50);/////////250
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//
return data;
}
/*********************************************************************
函數名: void EEPROM_Write(unsigned int address,unsigned int *data)
目的: EEPROM的寫
輸入: address 寫地址
//////////////////////////////////////////////////
*data 寫數據~~~從0x00100000開始的數據。
輸出: 無
*********************************************************************/
void EEPROM_Write(unsigned int address,unsigned int data)
{
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = WRITE;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = address & 0xff00;
//
//for(i = 0; i < 10000; i++);
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = (address << 8) & 0xff00 ;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = (*(ram_addr+data) << 8) & 0xff00;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
delay_time(50); //150~~~~3.8
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
//delay_time(150); ///~~~~~~~~~~
}
/*********************************************************************
函數名: void EEPROM_Write_write(unsigned int first_addr)
目的: 寫EEPROM的寫命令字
輸入: first_addr 寫入的頁首地址
輸出: 無
*********************************************************************/
void EEPROM_Write_write(unsigned int first_addr)
{
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//
GpioDataRegs.GPFDAT.bit.GPIOF3 = 0;
//發送SPI
SpiaRegs.SPITXBUF = WRITE;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = first_addr & 0xff00;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
//發送SPI
SpiaRegs.SPITXBUF = (first_addr << 8) & 0xff00 ;
//判斷SPI發送準備好
while(Spi_TxReady() == 0);
delay_time(50);
}
////////////////////////////////////////////////////////
//eeprom按頁寫:64字節/頁
////////////////////////////////////////////////////////
void EEPROM_Write_All(void)
{
unsigned int Send_Counter,Page_Counter;
EEPROM_Write_Enable();
EEPROM_Write_write(EEPROM_Addr1);
for(Send_Counter=0;Send_Counter!=Write_Length1;)
{
if(Page_Counter != 64)
{
SpiaRegs.SPITXBUF =(*(ram_addr+Send_Counter) << 8) & 0xff00;
delay_time(50); //25000 1500 500 100
Page_Counter++;
Send_Counter++;
}
else
{
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;
while((EEPROM_Read_Status()&0x01) == 0x01);
Page_Counter = 0;
EEPROM_Addr1 = EEPROM_Addr1 + 64;
EEPROM_Write_Enable();
EEPROM_Write_write(EEPROM_Addr1); //更新寫入頁地址
}
}
GpioDataRegs.GPFDAT.bit.GPIOF3 = 1;//寫完
}
////////////////////////////////////////////
/*inline Uint16 EEPROM_Read1(void)
{
Uint16 data;
data = SpiaRegs.SPIRXBUF;
while(Spi_TxReady() == 0);
SpiaRegs.SPITXBUF = 0x5500;
for(j = 0; j < 100; j++);
while(Spi_RxReady() == 0);
delay_time(50);
return data;
}*/
////
void delay_time(unsigned int data)
{
unsigned int i;
for(i = 0; i < data; i++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -