求助!关于W25Q128存储器
事情是这样的:
我用W25Q_Write_N这个函数实现把数据放到W25Q128里面,PAGE_SIZE代表每一页256字节大小,为了方便存储和读取,每一页存一条数据就转存到下一页,理论上是可以存65535条数据的,可是每次存到大概249条以后的时候,(test_info.List我把它放在第一页,数据从第二页开始存,每存一条test_info.List++)数据读出来就全是FF,大概看了一下,可能是块的问题,64K为一个块,但是我不能理解为什么往后就存不进去了呢。麻烦大佬们给孩子指点迷津吧{:daku:}
void W25Q_Write_Page(uint8* pbuf,uint32 WriteAddr,uint16 Len)
{
uint16 i;
while(W25Q_ReadStatus()&0x01); //判断是否忙
WriteEnable(); //写使能
SPI_CS_0; //使能器件
SPI_SendByte(W25X_Writepage); //发送写页命令
SPI_SendByte((uint8)((WriteAddr)>>16)); //发送24bit地址
SPI_SendByte((uint8)((WriteAddr)>>8));
SPI_SendByte((uint8)WriteAddr);
for(i=0;i<Len;i++) //循环写数
{
SPI_SendByte(*pbuf++);
}
SPI_CS_1; //取消片选
while(W25Q_ReadStatus()&0x01); //等待写入结束
}
void W25Q_Write_N(uint8 * pbuf,uint32 WriteAddr,uint16 Len)
{
uint16 PageLen; // 页内写入字节长度
PageLen=256-WriteAddr%256; // 单页剩余的字节数 (单页剩余空间)
if(Len<=PageLen) PageLen=Len; // 不大于256 个字节
while(1)
{
W25Q_Write_Page(pbuf,WriteAddr,PageLen);
if(PageLen==Len)break; // 写入结束了
else
{
pbuf+=PageLen;
WriteAddr+=PageLen;
Len-=PageLen; //减去已经写入了的字节数
if(Len>256)PageLen=256; // 一次可以写入256 个字节
else PageLen=Len; // 不够256 个字节了
}
}
}
W25Q_Write_N(Flash_Save, FLASH_ADDRESS + (test_info.List * PAGE_SIZE), 36);
在您的问题中,您提到使用W25Q128存储器时,数据存储到大约249条后,读取的数据全为0xFF。这可能是由于以下几个原因导致的:
1. 块擦除问题:W25Q128的存储结构是以块(Block)为单位进行管理的,每个块大小为64KB。在写入数据之前,必须确保目标块已经被擦除。如果未擦除块,写入操作可能会失败,导致读取时返回0xFF。建议在写入数据前,先检查并擦除目标块。
2. 页边界问题:W25Q128的页大小为256字节。如果写入的数据跨越了页边界,可能会导致数据写入失败。确保每次写入的数据长度不超过页边界,或者在写入时处理页边界问题。
3. 写保护:W25Q128具有写保护功能,如果写保护被启用,写入操作将无法成功。请检查写保护状态,并确保在写入时禁用写保护。
4. 地址计算错误:在您的代码中,地址计算可能存在错误,导致写入地址超出预期范围。请仔细检查地址计算逻辑,确保写入地址正确。
5. 硬件问题:如果以上软件问题都排除了,可能是硬件问题导致的。检查SPI通信是否正常,确保W25Q128与MCU之间的连接稳定。
针对您的问题,建议您按照以下步骤进行排查和解决:
1. 擦除目标块:在写入数据前,先擦除目标块。可以使用W25QEraseSector或W25QEraseBlock函数进行擦除操作。
2. 检查页边界:确保每次写入的数据长度不超过256字节,或者在写入时处理页边界问题。
3. 禁用写保护:在写入数据前,禁用写保护。可以使用W25QWriteDisable函数禁用写保护。
4. 检查地址计算:仔细检查地址计算逻辑,确保写入地址正确。
5. 检查硬件连接:检查SPI通信是否正常,确保W25Q128与MCU之间的连接稳定。
以下是一个示例代码,展示如何在写入数据前擦除块并处理页边界问题:
c
void W25QWritePage(uint8 pbuf, uint32 WriteAddr, uint16 Len) {
uint16 i;
uint32 blockAddr = WriteAddr & 0xFFFF0000; // 计算块地址
// 擦除目标块
W25QEraseBlock(blockAddr);
// 写入数据
while (Len > 0) {
uint16 writeLen = (Len > 256) ? 256 : Len; // 确保不超过页边界
while (W25QReadStatus() & 0x01); // 判断是否忙
WriteEnable(); // 写使能
SPICS0; // 使能器件
SPISendByte(W25XWritepage); // 发送写页命令
SPISendByte((uint8)((WriteAddr) >> 16)); // 发送24bit地址
SPISendByte((uint8)((WriteAddr) >> 8));
SPISendByte((uint8)WriteAddr);
for (i = 0; i < writeLen; i++) {
SPISendByte(pbuf);
}
SPICS1; // 禁用器件
pbuf += writeLen;
WriteAddr += writeLen;
Len -= writeLen;
}
}
通过以上步骤和代码示例,您应该能够解决W25Q128存储器写入数据时遇到的问题。如果问题仍然存在,建议进一步检查硬件和软件配置,或联系技术支持获取帮助。
[本文内容由国芯人工智能辅助生成,仅供参考]
请直接参考下面的演示程序
SPI / QSPI 编程外部串行Flash | 配合ISP软件中【工具 | 串行Flash编程器】,2/5 - QSPI/3组SPI/I2S/I2C,一线制温湿度传感器 国芯技术交流网站 - AI32位8051交流社区
页:
[1]