今日调试驱动,发现以下问题,一直找不到原因。
读ID正常;
复位不正常,一直检测不到RB拉低;
block擦除不了,检测到I/O0为高;
写不了,检测到I/O0为高;
读出来全是FF;
贴上部分代码,请教各位大神,急,万分感激!
bool_t hw_k9k8g08u0a_init(void)
{
t_sysgpio_setDirection(NF_CLE_PORT, NF_CLE_PIN, DIR_OUTPUT);
t_sysgpio_setDirection(NF_CE_PORT, NF_CE_PIN, DIR_OUTPUT);
t_sysgpio_setDirection(NF_WE_PORT, NF_WE_PIN, DIR_OUTPUT);
t_sysgpio_setDirection(NF_ALE_PORT, NF_ALE_PIN, DIR_OUTPUT);
t_sysgpio_setDirection(NF_RE_PORT, NF_RE_PIN, DIR_OUTPUT);
t_sysgpio_setDirection(NF_RB_PORT, NF_RB_PIN, DIR_INPUT);
SET_NF_CLE(0);
SET_NF_CE(1);
SET_NF_WE(1);
SET_NF_ALE(0);
SET_NF_RE(1);
hw_k9k8g08u0a_reset();
if(hw_k9k8g08u0a_readID() == 0xd3519558) return 1;
else return 0;
}
static void hw_k9k8g08u0a_reset(void)
{
u2_t i=0;
SET_NF_DATA_DIR(DIR_OUTPUT);
SET_NF_CE(0);
SET_NF_CLE(1); //write command
SET_NF_WE(0);
SEND_NF_DATA(0xff);
SET_NF_WE(1);
SET_NF_CLE(0);
while(READ_NF_RB)
{
i++;
if(i == 0xffff) return;
}
SET_NF_CE(1);
}
bool_t hw_k9k8g08u0a_blockerase(u4_t block_num)
{
u2_t i=0;
u4_t row_addr = block_num*((NF_PAGESIZE+NF_PAGESPARE_SIZE)*NF_PAGE_PER_BLOCK);
SET_NF_CE(0);
SET_NF_CLE(1);
SET_NF_WE(0); //write 0x60
SEND_NF_DATA(0x60);
SET_NF_WE(1);
SET_NF_CLE(0);
SET_NF_ALE(1);
SET_NF_WE(0); //write row.addr1
SEND_NF_DATA(row_addr&0x000000ff);
SET_NF_WE(1);
SET_NF_WE(0); //write row.addr2
SEND_NF_DATA((row_addr>>8)&0x000000ff);
SET_NF_WE(1);
SET_NF_WE(0); //write row.addr3
SEND_NF_DATA((row_addr>>16)&0x000000ff);
SET_NF_WE(1);
SET_NF_ALE(0);
SET_NF_CLE(1);
SET_NF_WE(0); //write 0xd0
SEND_NF_DATA(0xd0);
SET_NF_WE(1);
SET_NF_CLE(0);
while(READ_NF_RB)
{
i++;
if(i == 0xffff) return 1;
}
SET_NF_CLE(1);
SET_NF_WE(0); //write 0x70
SEND_NF_DATA(0x70);
SET_NF_WE(1);
SET_NF_CLE(0);
SET_NF_DATA_DIR(DIR_INPUT);
SET_NF_RE(0);
SET_NF_RE(1);
RB_val = READ_NF_IO0;
SET_NF_CE(1);
return RB_val;
}
------解决思路----------------------
可以参考一下这个代码
http://www.pudn.com/downloads213/sourcecode/embed/detail1005033.html