完善资料让更多小伙伴认识你,还能领取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个回答
|
|
|
|
anobodykey 说得对!
另外,Flash_Read_Data() 的参数 Flash_Read_Init_Value 在一开始被你初始化为0了: u8 Flash_Read_Init_Value[2] = {0}; 所以你每次读取肯定是0啊 |
|
|
|
本帖最后由 watercici 于 2018-5-16 11:22 编辑 不好意思,可能是我粘贴过程中,不小心删掉了,我的也是dst ,还有其他的问题吗?诶????为什么我的括号和字母i显示不出来呢?那应该不是我删掉了,而是他没有显示,反正我和你说的是一样的。 |
|
|
|
60user1 发表于 2018-12-24 19:08 是这样的Flash_Read_Init_value我只是在变量定义的时候初始化了,然后我用Flash_Read_Data()这个函数来读取指定地址中的数据,并把它存在Flash_Read_Init_value中,是这样的,如果读取的数值为0,就将0X55写入到这个地址中去 |
|
|
|
60user1 发表于 2018-12-24 19:08 本帖最后由 watercici 于 2018-5-16 11:32 编辑 现在的问题是,我往WriteInitValueAddr这个地址中写两个0X55,然后在读出来是0第一个是写数据图,第二个是读数据图: |
|
|
|
就是之前说的,你在接收弄个断点,看看接收寄存器呀,这很直接...
|
|
|
|
YY599566 发表于 2018-12-24 19:22 哦,这样的话你可以更改一下排版,发帖时代码不要跟内容用一样的格式,发帖时上面有个<>的选项,是用来插入代码的,这样看起来更清晰,你可以试下,另外把你的读写接口也都放上来,只放一个Flash_Read_Data看不出问题的 |
|
|
|
您能说的具体点吗,是看单片机的SPI状态寄存器中的RXNE还是SPI的数据寄存器DR? |
|
|
|
vywyefswer 发表于 2018-12-24 20:19 不好意思,问一下,您说的这个读写接口指什么,是硬件的引脚,还是软件的读写基本函数? |
|
|
|
vywyefswer 发表于 2018-12-24 20:19 |
|
|
|
就是软件的读写基本函数,此外你可以读取一下flash的id看下是否读取正确借此检验你的接线是否正确 |
|
|
|
|
|
|
|
看起来是没啥问题的,如果读id正确的话,说明读取接口是对的,那可能是没写进去,看下写使能是否打开以及写保护引脚是否配置正确 |
|
|
|
本帖最后由 watercici 于 2018-5-16 14:03 编辑 WP和HOLD硬件连接都是接的高电平,写使能就是单片机给flash发送一个0X06的指令,从机应该是没有回复的,但不知道为什么有的时候,MISO上会收到一堆脉冲,但不知道是不是这个影响,还有就是在写使能前会读取状态寄存器,来检查总线是否忙,这里用的是while,程序中您也能看到,正常情况下,读取的值的最低位应该是0,那么说明总线不忙,可以写使能;可是,我读取的值是0x03什么的,反正最低位不是0,按理说这种情况下是不能发送写使能命令0X06的,可是时序上发送了,当我用逻辑分析仪单抓这段是他读取的却总是正常的。 我给你贴个图看看第一个是正常的,第二个是不正常的;0X05:读状态寄存器;0X06写使能;0X02页编程 |
|
|
|
YY599566 发表于 2018-12-24 21:42 这个问题加了一个延时,莫名其妙的脉冲没有了,但还是写不进去,@anobodykey,您帮我看看吧 |
|
|
|
W25Q16 Flash似乎在写入数据之前需要将BLock或者Sector先格式化一下,直接写数据并不能将原始数据覆盖,你看一下手册,顺便也试试这个方式?
|
|
|
|
60user36 发表于 2018-12-24 22:08 好的,谢谢!我看看 |
|
|
|
另外,这个芯片还带有Write Protect功能,检查一下,写数据之前, WP的状态
|
|
|
|
本帖最后由 watercici 于 2018-5-16 14:48 编辑 如果您说的这个写保护是指WP引脚的话,它一直都是高电平无效,还有我在写之前加的擦除,还是不行。我抓取的时序图发现擦除的好快,而且时序上有点问题,不知道擦了没有。我给您贴张图 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
991 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
970 浏览 2 评论
2080 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1177 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1599 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 19:14 , Processed in 1.225223 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号