野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 11122|回复: 4

学习spi的一点感想

[复制链接]
发表于 2017-8-23 12:04:45 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 xlyzp 于 2017-8-24 23:35 编辑

跟着视频写的程序,能正确地读取flash的序列号,但读取flash里面的数据时,就一直是00
无论是对flash进行写操作或者擦除操作都没有用,和例程对照了好几遍,一样的代码,不一样的输出,而且我用例程向flash里面写了很数据0xee,然后用自己程序读出来还是00,有大神能告诉我接下来该怎么调试吗?
再也不想写代码了,感觉受到了硬件故意和我对着干(_)

后来我把main函数的程序分解了,保留了最小的一个操作,写使能操作,然后读取FLASH状态寄存器里的值,结果大吃一惊。
SPI_FLASH_WriteEnable函数如果在后面加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x00
SPI_FLASH_WriteEnable函数如果在前面加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x02
SPI_FLASH_WriteEnable函数如果在前后不加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0xFFSPI_FLASH_WriteEnable函数如果在前后都加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x02
我实在搞不懂这是什么毛病。
如果是初始化出了问题,为何读出序列号的时候是正确的?
隐隐觉得可能是时序出了问题,可是手头暂时没有示波器或者逻辑分析仪这样的工具,也没法看到stm32实际输出的波形是怎么样的。
********************************************解决bug过程***************************************************************
1.串口陷入死循环,不停地发送数据。原因:循环体中循环变量i是8位的,小于要求循环次数num(16位的)。

2.SPI_FLASH中无法擦出扇区和进行页写入。

分解操作,检查写使能:写入使能无效

  SPI_FLASH_WriteEnable函数如果在后面加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x00

  SPI_FLASH_WriteEnable函数如果在前面加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x02

  SPI_FLASH_WriteEnable函数如果在前后不加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0xFF

  SPI_FLASH_WriteEnable函数如果在前后都加入SPI_FLASH_WaitForStandBy等待操作,则读出状态寄存器值为0x02

  接下来修改了SPI_FLASH_WaitForStandBy函数,将CS信号线高低电平操作放在了do-while循环外面。结果和原来一样。

  我想起了老师教的办法,把SPI的发送和接收连起,自发自收,注意把CS引脚置高电平。经过检验,结果依然是没有

  检查出任何问题

  第二次修改了SPI_FLASH_WaitForStandBy函数将SPI_FLASH_SendByte(W25X_Read_Status_Register_1);移动在了do-while循环外面。结果依然无效。

  对比了自己写的代码和例程初始化后的SPI寄存器值,是完全一样的。

  最后对比了自己写的代码和例程初始化后的GPIOC寄存器值,终于发现,例程中PC0(作为CS)设置的是通用推挽输出(GPIO_Mode_Out_PP),而我

  设置的是复用推挽输出(GPIO_Mode_AF_PP),导致我的程序CS片选的高平是不稳定的。

3.写入异常

  现象:擦出-读出 正常 ;写入-读出 异常 ,读出的值是最开始ReadBuff初始化后的数0x80;擦出-读出 正常。
  判断:擦出函数正常,读出函数正常。如果读出函数有问题,则读出的一定是一个一样的特定值,第一次读出时就破坏了原ReadBuff中的数,但第二次出,却读出还原了原ReadBuff中的数,故读出函数正常,故擦出函数正常。如果写入函数有问题,则写入应该是失败的,第二次读出应该是0xFF。
  发现本来应该写入WriteBuff中的数0x55,写入了ReadBuff中的数0x80。

  查找方法:调试时查看数组内容时发现WriteBuff中的数值等于ReadBuff中的数值

  结论:ReadBuff的大小为256,初始化时,却初始化了512个字节,侵犯了WriteBuff中的内存空间
****************************************************************************************************************************************
终于告以段落了



main函数里的代码

main函数里的代码
回复

使用道具 举报

发表于 2017-8-23 13:46:24 | 显示全部楼层
在写之前 要先擦除            
回复 支持 反对

使用道具 举报

发表于 2017-8-23 15:12:23 | 显示全部楼层
用beyond compare软件对比下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-23 23:22:19 | 显示全部楼层
fire 发表于 2017-8-23 13:46
在写之前 要先擦除

很高兴fire能关心我遇到的问题,这怪我没说清楚,我的在写之前已经进行过擦出操作了,我更新了一下帖子,把情况写的更具体一些了,希望能得到指点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-24 23:33:05 | 显示全部楼层
经过两天的努力终于解决了bug,分享一下过程
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-1-16 15:57 , Processed in 0.032323 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表