完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
现在我在用W25Q16这款FLASH芯片,现在出现了一个问题,就是我往一个地址中连着写两个0X55,然后再从这个地址中把他们读出来,可是我用逻辑分析仪抓取的结果是写时序正常,写的数据也正确,但是读的时序也是正常的,可是读出的数据却是两个0x00,读写的地址都是一样的,不知道这是怎么回事?涉及到的函数及变量:
u8 Flash_Init_Value[2]={0x55,0x55}; u8 Flash_Read_Init_Value[2] = {0}; u8 Flash_Load_Init_Value[20] = {0}; Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);//判断读取的值是不是0x55,如果是则非首次用 Flash_PagePro(Flash_Init_Value,WriteInitValueAddr,0x02); //如果不是,则将0x55,写入该地址 Flash_Read_Data(WriteInitValueAddr,0x02,Flash_Read_Init_Value);//读取一下,判断是否写入成功 基本函数: void Flash_PagePro(u8 *Pdat,u32 addr,u16 Len) { u8 padr1,padr2,padr3; u8 i; padr1 = (addr & 0xff0000)>>16; padr2 = (addr & 0xff00)>>8; padr3 = addr & 0xff; while((Flash_Read_SR(0x05))&0x01); Flash_Write_EnorDis(ENABLE); SPI2_Flash_CS_LOW(); SPI2_Flash_SendByte(PAGE_PROGRAM); SPI2_Flash_SendByte(padr1); SPI2_Flash_SendByte(padr2); SPI2_Flash_SendByte(padr3); for(i=0;i SPI2_Flash_SendByte(Pdat); } SPI2_Flash_CS_HIGH(); } void Flash_Read_Data(u32 addr, u32 len, u8* dst) { u8 adr1,adr2,adr3; u32 i = 0; // SPI2_SetSpeed(SPI_BaudRatePrescaler_4); adr1 = (addr & 0xff0000)>>16; adr2 = (addr & 0xff00)>>8; adr3 = addr & 0xff; SPI2_Flash_CS_LOW(); //delay_us(2); SPI2_Flash_SendByte(READ_DATA); SPI2_Flash_SendByte(adr1); SPI2_Flash_SendByte(adr2); SPI2_Flash_SendByte(adr3); for(i=0;i dst = SPI2_Flash_ReceiveByte(); } SPI2_Flash_CS_HIGH(); } |
|
相关推荐
33个回答
|
|
从你的分析仪来看,应该是flash的操作问题了,因为实际的返回就0x00.而且仅是read操作的,如果你读版本号是正常的话.剩下的只能啃flash的datasheet或网上找别人的例程对比了
|
|
|
|
cknz 发表于 2018-12-24 22:57 我再看看程序吧 |
|
|
|
YY599566 发表于 2018-12-24 21:42 看下这个波形是否正确,如果还不行的话,实在想不出哪里出问题了就,你也对比下st自带的flash读写示例,看下是否正常 |
|
|
|
好的,谢谢!麻烦您了 |
|
|
|
|
|
|
|
本帖最后由 watercici 于 2018-5-16 17:16 编辑 我现在有一个迫切想解决的问题,就是您看的时序的那个问题,按说发了0X05读取状态值为0X03,说明总线忙,就不应该发下一个写使能指令,但是他却发了?还有就是在发写使能指令的时候,MISO上居然有数据,我在想是不是判断语句的问题,可是按照你发的例程改了之后,还是这样。我对照了ST自带的FLASH程序,我感觉整体都一样啊?我已经黔驴技穷了。。。。 这个图是在检测到总线忙的时候,居然发了读指令,而且在发读指令的时候,MISO上居然有数据 |
|
|
|
YY599566 发表于 2018-12-25 00:11 本帖最后由 anobodykey 于 2018-5-16 18:04 编辑 这个看时序你MISO口收到的状态字节是0X03,理应是不往下走的,那你可以在你代码的读取字节函数中增加打印信息把收到的字节输出,查看是否与波形图一致,还有就是在写入时必须得进行擦除操作,才能够执行正常的写入操作。你还可以使用库例程把IO口改成你现有的然后烧录,查看结果是否正常 |
|
|
|
vywyefswer 发表于 2018-12-25 00:17 你好,我加了printf和串口发送数据,这俩是先后分别都试了试,可是不行,会导致时序不对,且串口助手也收不到数据 |
|
|
|
vywyefswer 发表于 2018-12-25 00:17 我今天弄了一天,我发现他能写进去,可是他是读的字节有问题,比如:时序上抓取的结果是发完读指令0X03之后,读取的是0X55,0X55,但我读到的数据是0X00,0X55,如果我把我的存储空间增加一个字节,那么读取的就是0x00,0X55,0x55,这是说明我是写进去可,可是读的却出了问题,好像多了一个dummy字节似的 |
|
|
|
YY599566 发表于 2018-12-25 00:39 哦,那说明读写操作应该是正常的,那你换个地址测试下看看是否依然存在这个问题,或许是你代码逻辑上有所疏忽,程序中读到的数据应该是与你逻辑分析仪抓到的数据一致才对。 |
|
|
|
vywyefswer 发表于 2018-12-25 00:47 恩恩,我找到问题了,是波特率的问题。我的SPI用的是SPI2,我原来的波特率是4分频,我将它改成2分频就好了。 |
|
|
|
结贴:本问题总的来说涉及了两个问题:第一个是写不进去的问题,原因是写之前没有擦除操作;二是逻辑分析仪抓取的数据正确,软件读取的数据不正确,总是相对于抓取的数据晚读一个,于是将4分频的波特率改成了2分频就OK了。这也解决了总线状态判断不正确的问题。
|
|
|
|
YY599566 发表于 2018-12-25 01:02 所以你真的没好好看datasheet,哈哈 |
|
|
|
flash存储的是16位,你读的是8位,当然是2个0了,应该是2个8位组合后才是真正的flash数据
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 10:14 , Processed in 0.962217 second(s), Total 100, Slave 83 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号