在使用原子哥的SPI通信中的 W25QXX_Write()函数时发现了有一处错误,第一次可以进行正确的读写,可当我第二次改变写的数据,并往同一地址写的时候就出现了乱码,经过查找发现了一个问题,下面是截取的一段代码
W25QXX_Read(W25QXX_BUF,secpos*4096,4096);
for(i=0;i<secremain;i++)
{
if(W25QXX_BUF[secoff+i]!=0XFF)break;
}
if(i<secremain)//ÐèÒª²Á³ý
{
W25QXX_Erase_Sector(secpos); //此处错误
for(i=0;i<secremain;i++)
{
W25QXX_BUF[i+secoff]=pBuffer;
}
W25QXX_Write_NoCheck(W25QXX_BUF,secpos*4096,4096);
代码的意思是当检测到写入的扇区内有数据的时候,执行扇区删除操作,W25QXX_Erase_Sector()函数传递进去的参数应该是一个24位的地址,可是在上面的程序中传进去的不是一个地址,而是secpos=WriteAddr/4096;,即第几个扇区,所以错误的地方应该改为W25QXX_Erase_Sector(secpos*4096);
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我很好奇,这东西为什么我们一直用着正常?咋突然就说某个地方错了呢
起初也有这样的感觉,专门对照了代码,也是粗心,没注意到代码处理语句
错了影不影响用不太确定,但如果错了这么多网友应该会早些时候就发现问题了,毕竟代码推出已经有一段时间了
例程代码没有问题,是楼主自己写的擦除函数写错了,看你之前说的都弄糊涂了。
W25QXX_Erase_Sector(secpos);的参数就应该是第几个扇区,而不是地址。W25QXX_Erase_Sector内部自己带有地址计算。而且个人感觉这个W25QXX_Write函数封的很难受,判断有数据就要擦除,我们就不能很好地控制哪些数据该擦,哪些不该擦,还是自己控着安心。
一周热门 更多>