📄 nandflash.c
字号:
#include <cdefBF561.h>
#include "nandflash.h"
int pf_direction(int pf, int pf_direction)
{
volatile unsigned short int *dirc_register;
if(pf_direction != 0 && pf_direction != 1) return 0;
if(pf>=0&&pf<=47)
{
if(pf<=15&&pf>=0) dirc_register = FIO0_DIR;
else if(pf<=31&&pf>=16) { dirc_register = FIO1_DIR; pf -= 16;}
else if(pf<=47&&pf>=32) { dirc_register = FIO2_DIR; pf -= 32;}
if(pf_direction) { *dirc_register |= (0x1<<pf);return 1;}
else {*dirc_register &= (0xffff - (0x1<<pf));return 1;}
}
else return 0;
}
int pf_in_enable(int pf, int pf_direction)
{
volatile unsigned short int *dirc_register;
if(pf_direction != 0 && pf_direction != 1) return 0;
if(pf>=0&&pf<=47)
{
if(pf<=15&&pf>=0) dirc_register = FIO0_INEN;
else if(pf<=31&&pf>=16) { dirc_register = FIO1_INEN; pf -= 16;}
else if(pf<=47&&pf>=32) { dirc_register = FIO2_INEN; pf -= 32;}
if(pf_direction) { *dirc_register |= (0x1<<pf);return 1;}
else {*dirc_register &= (0xffff - (0x1<<pf));return 1;}
}
else return 0;
}
int data_in_enable(int dir)
{
if(dir)
{
if( !pf_in_enable(d0,pf_out)) return 0;
if( !pf_in_enable(d1,pf_out)) return 0;
if( !pf_in_enable(d2,pf_out)) return 0;
if( !pf_in_enable(d3,pf_out)) return 0;
if( !pf_in_enable(d4,pf_out)) return 0;
if( !pf_in_enable(d5,pf_out)) return 0;
if( !pf_in_enable(d6,pf_out)) return 0;
if( !pf_in_enable(d7,pf_out)) return 0;
}
else
{
if( !pf_in_enable(d0,pf_in)) return 0;
if( !pf_in_enable(d1,pf_in)) return 0;
if( !pf_in_enable(d2,pf_in)) return 0;
if( !pf_in_enable(d3,pf_in)) return 0;
if( !pf_in_enable(d4,pf_in)) return 0;
if( !pf_in_enable(d5,pf_in)) return 0;
if( !pf_in_enable(d6,pf_in)) return 0;
if( !pf_in_enable(d7,pf_in)) return 0;
}
}
int pf_outset(int pf, int setdata)
{
volatile unsigned short int *tempregister;
if(setdata != 0 && setdata != 1) return 0;
if(pf>=0&&pf<=47)
{
if(pf<=15&&pf>=0) tempregister = FIO0_FLAG_D;
else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_D; pf -= 16;}
else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_D; pf -= 32;}
if(setdata) { *tempregister |= (0x1<<pf);return 1;}
else {*tempregister &= (0xffff - (0x1<<pf));return 1;}
}
else return 0;
}
int pf_set(int pf)
{
volatile unsigned short int *tempregister;
if(pf>=0&&pf<=47)
{
if(pf<=15&&pf>=0) {tempregister = FIO0_FLAG_S;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO0_FLAG_C;
*tempregister &=0x0;
tempregister = FIO0_FLAG_T;
*tempregister &=0x0;
}
else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_S;pf -= 16;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO1_FLAG_C;
*tempregister &=0x0;
tempregister = FIO1_FLAG_T;
*tempregister &=0x0;
}
else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_S; pf -= 32;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO2_FLAG_C;
*tempregister &=0x0;
tempregister = FIO2_FLAG_T;
*tempregister &=0x0;
}
// *tempregister |= (0x1<<pf);
}
else return 0;
}
int pf_clear(int pf)
{
volatile unsigned short int *tempregister;
if(pf>=0&&pf<=47)
{
if(pf<=15&&pf>=0) {tempregister = FIO0_FLAG_C;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO0_FLAG_S;
*tempregister &=0x0;
tempregister = FIO0_FLAG_T;
*tempregister &=0x0;
}
else if(pf<=31&&pf>=16) { tempregister = FIO1_FLAG_C; pf -= 16;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO1_FLAG_S;
*tempregister &=0x0;
tempregister = FIO1_FLAG_T;
*tempregister &=0x0;
}
else if(pf<=47&&pf>=32) { tempregister = FIO2_FLAG_C; pf -= 32;
*tempregister |= (0x1<<pf);
//++
delay(2);
*tempregister &=0x0;
tempregister = FIO2_FLAG_S;
*tempregister &=0x0;
tempregister = FIO2_FLAG_T;
*tempregister &=0x0;
}
// *tempregister |= (0x1<<pf);
}
else return 0;
}
void delay(int time)
{ if(time <= 0) return 0;
int i;
for(i=0;i<=time;i++) {;}
}
bool nandflash_we_on()
{
if(pf_outset(we,setdata0)) return true;
else
{
printf("write enable wrong!!!!\n");
return false;
}
}
bool nandflash_we_off()
{
//pf_set(we);
if(pf_outset(we,setdata1)) return true;
else
{
printf("write unenable wrong!!!!\n");
return false;
}
}
bool nandflash_cle_on()
{
if(pf_outset(cle,setdata1)) return true;
else
{
printf("command enable wrong!!!!\n");
return false;
}
}
bool nandflash_cle_off()
{
if(pf_outset(cle,setdata0)) return true;
else
{
printf("command unenable wrong!!!!\n");
return false;
}
}
bool nandflash_ale_on()
{
if(pf_outset(ale,setdata1)) return true;
else
{
printf("address enable wrong!!!\n");
return false;
}
}
bool nandflash_ale_off()
{
if(pf_outset(ale,setdata0)) return true;
else
{
printf("address uneable wrong!!!!\n");
return false;
}
}
bool nandflash_re_on()
{
if(pf_outset(re,setdata0)) return true;
else
{
printf("read enable wrong!!!!\n");
return false;
}
}
bool nandflash_re_off()
{
if(pf_outset(re,setdata1)) return true;
else
{
printf("read unenable wrong!!!!\n");
return false;
}
}
bool nandflash_ce_on()
{
if(pf_outset(ce,setdata0)) return true;
else
{
printf("ce enable wrong!!!!\n");
return false;
}
}
bool nandflash_ce_off()
{
if(pf_outset(ce,setdata1))
return true;
else
{
printf("ce unenable wrong!!!!\n");
return false;
}
}
/*
bool nandflash_rb_on()
{
pf_outset(rb,setdata1);
}
bool nandflash_rb_off()
{
pf_outset(rb,setdata0);
}
*/
void data_thran_dir(int set_dir)
{
volatile unsigned short int *dirc_register;
dirc_register = FIO0_DIR;
if(set_dir == 1 )
{
*dirc_register |= 0xFFFF;
}
if(set_dir == 0 )
{
*dirc_register &= 0xFF00;
}
}
int nandflash_init()
{
if( !pf_direction(we,pf_out)) return 0;
if( !pf_direction(re,pf_out)) return 0;
if( !pf_direction(ale,pf_out)) return 0;
if( !pf_direction(cle,pf_out)) return 0;
if( !pf_direction(rb,pf_in)) return 0;
if( !pf_direction(ce,pf_out)) return 0;
if( !pf_in_enable(rb,pf_out)) return 0;
return 1;
}
void create_initial_invalid_block_table()
{
unsigned int Block_Address = 0; //Block_Address 为页地址 Page_Address 为列地址
int block_count = 0; //first_block;
int bad_block_count = 0;
int block_num;
//int num_bad_block;
struct Invalid_Block_Table bad_blocks;
struct Invalid_Block * list_table;
list_table = bad_blocks.value.next;
for(block_num = 2048; block_num != 0 ; block_num--)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -