最近在做6416的FLASH调试,出现的问题和你的很像,就是写不进去,FLASH芯片为AM29LV160B,目前手头有两块板(都是自己做的PCB),一块是按16bit位宽连接的EMIFA的CE0,可以正常读写;一块是按8bit位宽连接的EMIFB的CE1,死活没法写,读出的数据全是FF!目前已经测试芯片管脚的CE,OE,WE,RESET,BYTE等信号,还没发现问题!跪求各位老师、专家给点建议和指导啊!谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
最近在做6416的FLASH调试,出现的问题和你的很像,就是写不进去,FLASH芯片为AM29LV160B,目前手头有两块板(都是自己做的PCB),一块是按16bit位宽连接的EMIFA的CE0,可以正常读写;一块是按8bit位宽连接的EMIFB的CE1,死活没法写,读出的数据全是FF!目前已经测试芯片管脚的CE,OE,WE,RESET,BYTE等信号,还没发现问题!跪求各位老师、专家给点建议和指导啊!谢谢!
检查一下你的两个flash的命令是否有区别。
下面是我在C6416上测试过的nor flash相关代码:
typedef unsigned int FLASH_DATA_TYPE;
#define FlashBaseAddr 0x064000000 //EMIFB CE1, COPY TO ADDRESS 0.
void Init_Emif()
{
#define EMIFA_GCTL 0x01800000
#define EMIFA_CE1 0x01800004
#define EMIFA_CE0 0x01800008
#define EMIFA_CE2 0x01800010
#define EMIFA_CE3 0x01800014
#define EMIFA_SDRAMCTL 0x01800018
#define EMIFA_SDRAMTIM 0x0180001c
#define EMIFA_SDRAMEXT 0x01800020
#define EMIFA_CE1SECCTL 0x01800044
#define EMIFA_CE0SECCTL 0x01800048
#define EMIFA_CE2SECCTL 0x01800050
#define EMIFA_CE3SECCTL 0x01800054
#define EMIFB_GCTL 0x01A80000
#define EMIFB_CE1 0x01A80004
#define EMIFB_CE0 0x01A80008
#define EMIFB_CE2 0x01A80010
#define EMIFB_CE3 0x01A80014
#define EMIFB_SDRAMCTL 0x01A80018
#define EMIFB_SDRAMTIM 0x01A8001c
#define EMIFB_SDRAMEXT 0x01A80020
#define EMIFB_CE1SECCTL 0x01A80044
#define EMIFB_CE0SECCTL 0x01A80048
#define EMIFB_CE2SECCTL 0x01A80050
#define EMIFB_CE3SECCTL 0x01A80054
/* Setup EMIFB Version 2 (120 MHz EMIF) */
*(int*)EMIFB_GCTL = 0x00002060;
*(int*)EMIFB_CE1 = 0xffffff03; // CE1 Flash 8-bit---BOOTLOADER
/* EMIFA Version 2 (120MHz EMIF) */
*(int*)EMIFA_GCTL = 0x00012070;
*(int*)EMIFA_CE0 = 0x23228c43; // CE0 SDRAM 1Mx32bitx4bank=16M byte
*(int*)EMIFA_CE1 = 0x23228c43; // CE1 8-bit Async
*(int*)EMIFA_CE2 = 0x23228c43; // CE2 Daughtercard 32-bit async
*(int*)EMIFA_CE3 = 0x23228c43; // CE3 Daughtercard 32-bit async
*(int*)EMIFA_SDRAMCTL = 0x56228000; // SDRAM control
*(int*)EMIFA_SDRAMTIM = 0x00001E1D; // SDRAM timing refresh
*(int*)EMIFA_CE2SECCTL = 0x0032; //Read space;
*(int*)EMIFA_CE3SECCTL = 0x0030; // Write back Space;
*(int*)EMIFA_SDRAMCTL |= 0x01000000;
}
void Chip_Erase()
{
//Unlock command
*(unsigned char *)(FlashBaseAddr + 0xAAA) = 0xAA;
*(unsigned char *)(FlashBaseAddr + 0x555) = 0x55;
*(unsigned char *)(FlashBaseAddr + 0xAAA) = 0x80;
*(unsigned char *)(FlashBaseAddr + 0xAAA) = 0xAA;
*(unsigned char *)(FlashBaseAddr + 0x555) = 0x55;
*(unsigned char *)(FlashBaseAddr + 0xAAA) = 0x10;
// Polling D2, D6, D7 to determine when completed.
// Polling D7 change to "0" after erase complete.
while ((*(unsigned char *)FlashBaseAddr) != 0xff);
}
int Write_Byte(unsigned int Address, unsigned char data)
{
unsigned int timeout = 0;
//Unlock command
*(unsigned char *)(FlashBaseAddr+0xAAA) = 0xAA;
*(unsigned char *)(FlashBaseAddr+0x555) = 0x55;
//Setup command
*(unsigned char *)(FlashBaseAddr+0xAAA) = 0xA0;
//Write data to destination
*(unsigned char *)Address = data;
do timeout += 1;
while((*(unsigned char *)Address) != data && timeout < 0xffff);
if(timeout ==0xffff)
return -1;
else
return 0;
// flashnext++;
}
main()
{
unsigned int i, Address;
Address = FlashBaseAddr;
Init_Emif();
printf("C64x Flash Burn, 8-bit Flash Boot Mode, Write by CHAO\n");
printf("Erasing Flash, Please Waiting......\n");
Chip_Erase();
printf("Reset Flash to Normal Mode\n");
*(unsigned char *)FlashBaseAddr = 0xF0; // Reset Flash to Normal Mode;
printf("Programming Begin Start From 0x64000000, Length = 0x%x; Please Wait Again......\n", hex_CNT );
for(i=0; i<hex_CNT; i++)
{
if(Write_Byte(Address++, hex[i]) == -1)
{
printf("Write error at Address: 0x%x\n", Address-1);
return;
}
}
printf("Write Complete Flag\n");
for (i= 0; i<4; i++)
Write_Byte(Address++, 0); // Write complete flag;
printf("Flash Burn End, Reset Flash to Normal Mode.\n");
*(unsigned char *)FlashBaseAddr = 0xF0; // Reset Flash to Normal Mode;
printf("Re-Power On the Board.\n");
while(1);
}