📄 en25b16_driver.c
字号:
/****************************************************************************
** - EN25B16_driver.c -
**
** NewMsg_EN25B16模块驱动程序的c文档
**
**
**
** mader:许利军
**
** File version: $2008.6.27$
**
***************************************************************************/
#define SYSTEM_CLOCK 8000000
#include<def_AVR_IAR.h>
#include"EN25B16_driver.h"
void EN25B16_INITIALIZTION()
{
EN25B16_CS_DDR = 1;
EN25B16_DO_DDR = 0;
EN25B16_DI_DDR = 1;
EN25B16_WP_DDR = 1;
EN25B16_CLK_DDR = 1;
EN25B16_HOLD_DDR = 1;
EN25B16_CS = 1;
EN25B16_DO = 1;
EN25B16_DI = 1;
EN25B16_WP = 1;
EN25B16_CLK = 1;
EN25B16_HOLD = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1 ;
_NOP_ms(1);
EN25B16Write8Bit(WriteStatusRegister);
EN25B16Write8Bit((unsigned char)STATUS_RERISTER);
EN25B16_CS = 1;
_NOP_ms(15);
}
void EN25B16Write8Bit(unsigned char byte)
{
unsigned char i;
EN25B16_CS = 0;
EN25B16_CLK = 0;
for ( i = 0 ; i < 8 ; i++){
EN25B16_CLK = 0;
EN25B16_DI = (byte&0x80)>>7;;
byte = byte<<1;
EN25B16_CLK = 1;
}
}
unsigned char EN25B16Read8Bit(void)
{
unsigned char i;
unsigned char byte = 0x00;
EN25B16_CS = 0;
EN25B16_CLK = 0;
for ( i = 0; i < 8; i++)
{
byte = byte<<1;
EN25B16_CLK = 0;
byte = byte|(EN25B16_DO_PING&0x01);
EN25B16_CLK = 1;
}
return(byte);
}
/*----------4K 扇区读写擦函数---------*/
void WriteSector_4K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(ReadStatusRegister);
while((EN25B16Read8Bit()&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(PageProgram);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
EN25B16Write8Bit(*(pdata+i));
}
EN25B16_CS = 1;
}
void ReadSector_4K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(ReadDataBytes);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
*(pdata+i) = EN25B16Read8Bit();
}
EN25B16_CS = 1;
}
void EraseSector_4K(unsigned char sector_num)
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(SectorErase);
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)>>16));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)>>8));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_4K_BASE_ADDRESS+SECTOR_4K_ADD_ONE_ADDRESS*sector_num)));
EN25B16_CS = 1;
}
/*----------8K 扇区读写擦函数---------*/
void WriteSector_8K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(ReadStatusRegister);
while((EN25B16Read8Bit()&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(PageProgram);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_8K_BASE_ADDRESS+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
EN25B16Write8Bit(*(pdata+i));
}
EN25B16_CS = 1;
}
void ReadSector_8K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(ReadDataBytes);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_8K_BASE_ADDRESS+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_8K_BASE_ADDRESS+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
*(pdata+i) = EN25B16Read8Bit();
}
EN25B16_CS = 1;
}
void EraseSector_8K()
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(SectorErase);
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)>>16));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)>>8));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_8K_BASE_ADDRESS)));
EN25B16_CS = 1;
}
/*----------32K 扇区读写擦函数---------*/
void WriteSector_32K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(ReadStatusRegister);
while((EN25B16Read8Bit()&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(PageProgram);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_32K_BASE_ADDRESS+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
EN25B16Write8Bit(*(pdata+i));
}
EN25B16_CS = 1;
}
void ReadSector_32K(unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(ReadDataBytes);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_32K_BASE_ADDRESS+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_32K_BASE_ADDRESS+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
*(pdata+i) = EN25B16Read8Bit();
}
EN25B16_CS = 1;
}
void EraseSector_32K()
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(SectorErase);
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)>>16));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)>>8));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_32K_BASE_ADDRESS)));
EN25B16_CS = 1;
}
/*----------64K 扇区读写擦函数---------*/
void WriteSector_64K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(ReadStatusRegister);
while((EN25B16Read8Bit()&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(PageProgram);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
EN25B16Write8Bit(*(pdata+i));
}
EN25B16_CS = 1;
}
void ReadSector_64K(unsigned char sector_num,unsigned char data_location,unsigned char data_num,unsigned char *pdata)
{
unsigned char i;
EN25B16Write8Bit(ReadDataBytes);
EN25B16Write8Bit((unsigned char)((unsigned long)((SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num+data_location*8))));
for ( i = 0 ; i < data_num ;i++ ){
*(pdata+i) = EN25B16Read8Bit();
}
EN25B16_CS = 1;
}
void EraseSector_64K(unsigned char sector_num)
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(SectorErase);
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)>>16));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)>>8));
EN25B16Write8Bit((unsigned char)((unsigned long)(SECTOR_64K_BASE_ADDRESS+SECTOR_64K_ADD_ONE_ADDRESS*sector_num)));
EN25B16_CS = 1;
}
/*快速读取某几个byte*/
void FastReadSomeByte(unsigned long int add,unsigned char data_num,unsigned char *pdata)
{
unsigned char i,temp;
EN25B16Write8Bit(ReadDataBytes);
EN25B16Write8Bit((unsigned char)((unsigned long)((add))>>16));
EN25B16Write8Bit((unsigned char)(((unsigned long)(add))>>8));
EN25B16Write8Bit((unsigned char)(((unsigned long)(add))));
temp = 0;
i = temp;
temp = EN25B16Read8Bit();
for ( i = 0 ; i < data_num ;i++ ){
*(pdata+i) = EN25B16Read8Bit();
}
EN25B16_CS = 1;
}
void EraseAll(void)
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(BulkErase);
EN25B16_CS = 1;
}
/*--------进入DeepPowerdownMode-------*/
void GoToDeepPowerdownMode(void)
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(DeepPowerdown);
EN25B16_CS = 1;
}
void ReleaDeepPowerdownMode(void)
{
EN25B16Write8Bit(ReadStatusRegister);
while(((EN25B16Read8Bit())&0x01));
EN25B16_CS = 1;
EN25B16Write8Bit(WriteEnable);
EN25B16_CS = 1;
EN25B16Write8Bit(ReleaseDeepPowerdown);
EN25B16_CS = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -