本来自己写了一个w25q128的驱动,结果怎么也不行,总是死在等待中,后来反复看原子哥的代码,发现原子的代码中每一个操作前操作后都要开关Flash的片选,我之前还以为是省电或者抗干扰什么的,于是我就写了一个先关片选再开片选的函数,并加在每条不同的操作前,居然成功了!原来每次换操作之前都要用片选“重启”一次Flash呀,虽然不明白为什么,但是好歹成功了,于是再试试其他功能。我想在Flash中写入一个字符串,然后读出来(这里应该一致的吧),然后再执行全片擦除操作,完成后再读出来(这里应该是全部0xff的才对吧?),结果出现各种问题。我觉得可能是我的代码有问题,于是再例程上再跑一遍,因为例程的代码总比自己的要可靠吧,结果一试还是有问题,我真是晕了。。。。。。现在把代码贴上来请大家看看,仅仅只改了例程的主函数,直接覆盖探索者SPI例程的main就可以了。
[mw_shl_code=c,true]int main(void)
{
char nihao[]={"ABCDEFG123456"};
char Nihao[sizeof nihao];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init(168);
uart_init(115200);
LED_Init();
LCD_Init();
KEY_Init();
W25QXX_Init();
printf("初始化完成
"); //弹出【初始化完成】
W25QXX_Write((u8 *)nihao,0x12345678,sizeof nihao); //在地址0x12345678写入字符【ABCDEFG123456】
W25QXX_Read ((u8 *)Nihao,0x12345678,sizeof nihao); //在同样的地址中读出同样长度的数据
printf("芯片ID: %X
",W25QXX_ReadID()); //为什么弹出【初始化完成】后会有时很长时间(几十秒)才能读出ID?而有时候会很快(0.x秒)?
printf("%s
",Nihao); //读出来的是【??????????????】
printf("%X
",Nihao); //读出来的是【20001750】
W25QXX_Erase_Chip(); //芯片擦除
W25QXX_Read ((u8 *)Nihao,0x12345678,sizeof nihao);
printf("%X
",Nihao); //为什么读出来的还是【20001750】?不是已经芯片擦除了吗?
//另外貌似在Flash全片擦除时复位单片机会发生严重错误?
while(1); //为什么芯片擦除后芯片内容不是变成0xff而是0x3f(在字符串中是【?】)?并且每隔4096个【?】会出现318个字符的乱码?
}[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>