您好,我用的是DSP6713,在CE1空间接了一个Flash:AM29LV160D,但不知道为什么不论擦除,还是读写,CE1#片选信号都不拉低,请问哪些原因会导致这个问题?谢谢您的回答。
下面是我的程序:
主程序:
Flash_StartAdd = 0x90000000;
flash_chip_erase();
printf("Finish flash erase!!\n");
// Write flash memory. for(i=0;i<0x400;i++)
{
data = i;//fmod(i,0x10000);
addr = (Flash_StartAdd+2*i);
Write_Flash_Word(&data,&addr);
}
printf("Write flash ok.\n");
// Read flash memory. for(i=0;i<0x400;i++)
{
addr = Flash_StartAdd+2*i;
Read_Flash_Word(&data,&addr);
if(data != fmod(i,0x10000))
{
printf(" Testing is Failure!\n");
printf("Address 0x%x is error! Data is 0x%x\n",i,data);
exit(0);
}
}
printf("Opereation is success.\n");
相关函数:
#define FLASH_ADR1 (0x90000000+0x555<<1)
#define FLASH_ADR2 (0x90000000+0x2AA<<1)#define Sourceaddr 0x90000000
#define Toggle_Bit 0x80 //0x40 /* d6 = 1 */
#define Hangup_Bit 0x20 /* d5 = 1 */#define Pass_Flag 0
#define Fail_Flag 1
void flash_chip_erase()
{ *(volatile Uint16*)FLASH_ADR1=0x012a;//0xaa; *(volatile Uint16*)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16*)FLASH_ADR1=0x0100;//0x80;
*(volatile Uint16*)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16*)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16*)FLASH_ADR1=0x0010;//0x10;}
int Toggle_Bit_Check(Uint16 *addr)
{
Uint16 toggle_data,read_data;
toggle_data = *addr&Toggle_Bit;
do{
if(((read_data = *addr) &Toggle_Bit) == toggle_data)
break;
toggle_data = read_data & Toggle_Bit;
}while((read_data&Hangup_Bit) != Hangup_Bit);
toggle_data = *addr & Toggle_Bit;
if(((read_data = *addr)&Toggle_Bit) != toggle_data)
return (Fail_Flag);
return (Pass_Flag);
}
int Write_Flash_Word(Uint16 *data,Uint16 *address)
{ *(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x0120;//0xa0;
*address=*data; return(Toggle_Bit_Check(address));
}
int Read_Flash_Word(Uint16 *data,Uint16 *address){ *(volatile Uint16 *)FLASH_ADR1=0x012a;//0xaa;
*(volatile Uint16 *)FLASH_ADR2=0x0095;//0x55;
*(volatile Uint16 *)FLASH_ADR1=0x01b0;//0xf0;
*data=*address; return(Toggle_Bit_Check(address));}
dong sun:
回复 Shine:
CE1没有变低的原因找到了,是程序写的有问题,没有在CE1空间。不过改了之后出现了新的问题,就是一点运行,程序执行到向flash写数据的位置,就卡死了。在点运行之前,CE1是高的,AWE#按照一定的频率有一个低电平的脉冲,AOE#一直为低。点运行开始往flash里写程序时,CE1和AWE#同时变低了,但一直就变低了,就卡死在那里了。CE1空间的配置在EMIF中直接写成了0xffffff13。这样在之前的旧板子上是可以读写flash的,不知道为什么换到新画的板子上就不行了?DSP可能其他部分没问题,但flash读写这块有问题吗?实在不知道是什么原因了。