OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6173|回复: 10

关于使用SPI操作FLASH(W25Q128的相关问题)

[复制链接]

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
发表于 2019-7-30 14:28:52 | 显示全部楼层 |阅读模式
3金钱
1.W25Q128支持标准的SPI模式0、模式3.
例程上面是选择模式3
  1. //以下是SPI模块的初始化代码,配置成主机模式                                                   
  2. //SPI口初始化
  3. //这里针是对SPI1的初始化
  4. void SPI1_Init(void)
  5. {         
  6.   GPIO_InitTypeDef  GPIO_InitStructure;
  7.   SPI_InitTypeDef  SPI_InitStructure;
  8.        
  9.   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟

  11.   //GPIOFB3,4,5初始化设置
  12.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能输出       
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  14.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  15.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  16.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  17.   GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化
  18.        
  19.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
  20.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4复用为 SPI1
  21.         GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5复用为 SPI1

  22.         //这里只针对SPI口初始化
  23.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
  24.         RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1

  25.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  26.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                //设置SPI工作模式:设置为主SPI
  27.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                //设置SPI的数据大小:SPI发送接收8位帧结构
复制代码
s设置成mode程序无法正常读取:
  1. //以下是SPI模块的初始化代码,配置成主机模式
  2. //SPI口初始化
  3. //这里针是对SPI1的初始化
  4. void SPI1_Init(void)
  5. {       
  6. GPIO_InitTypeDef GPIO_InitStructure;
  7. SPI_InitTypeDef SPI_InitStructure;

  8. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//使能GPIOB时钟
  9. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);//使能SPI1时钟

  10. //GPIOFB3,4,5初始化设置
  11. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;//PB3~5复用功能输出       
  12. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
  13. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
  14. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
  15. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
  16. GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化

  17. GPIO_PinAFConfig(GPIOB,GPIO_PinSource3,GPIO_AF_SPI1); //PB3复用为 SPI1
  18. GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_SPI1); //PB4复用为 SPI1
  19. GPIO_PinAFConfig(GPIOB,GPIO_PinSource5,GPIO_AF_SPI1); //PB5复用为 SPI1

  20. //这里只针对SPI口初始化
  21. RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);//复位SPI1
  22. RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,DISABLE);//停止复位SPI1

  23. SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //设置SPI单向或者双向的数据模式:SPI设置为双线双向全双工
  24. SPI_InitStructure.SPI_Mode = SPI_Mode_Master;        //设置SPI工作模式:设置为主SPI
  25. SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;        //设置SPI的数据大小:SPI发送接收8位帧结构
  26. /*--------------------------------mode 0-----------------------------------------------------*/
  27. SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;        //串行同步时钟的空闲状态为高电平
  28. SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;        //串行同步时钟的第二个跳变沿(上升或下降)数据被采样
  29. SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;        //NSS信号由硬件(NSS管脚)还是软件(使用SSI位)管理:内部NSS信号有SSI位控制
  30. SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;        //定义波特率预分频的值:波特率预分频值为256
  31. SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;        //指定数据传输从MSB位还是LSB位开始:数据传输从MSB位开始
  32. SPI_InitStructure.SPI_CRCPolynomial = 7;        //CRC值计算的多项式
  33. SPI_Init(SPI1, &SPI_InitStructure); //根据SPI_InitStruct中指定的参数初始化外设SPIx寄存器

  34. SPI_Cmd(SPI1, ENABLE); //使能SPI外设

  35. SPI1_ReadWriteByte(0xff);//启动传输       
  36. }
复制代码
看W25Q128数据手册,是兼容模式0模式3,请问他是如何做到同时兼容两种模式,而且好像没有设置任何寄存器去选择其中之一。




最佳答案

查看完整内容[请看2#楼]

两个模式都是支持的,都可以通信。 你看我们NRF和W25Q共用SPI的时候,就是以NRF的模式为准的, 也是可以访问SPI FLASH的。 看mini板例程。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165508
金钱
165508
注册时间
2010-12-1
在线时间
2115 小时
发表于 2019-7-30 14:28:53 | 显示全部楼层
两个模式都是支持的,都可以通信。
你看我们NRF和W25Q共用SPI的时候,就是以NRF的模式为准的, 也是可以访问SPI FLASH的。
看mini板例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-5-9
在线时间
10 小时
发表于 2019-7-30 16:28:31 | 显示全部楼层
这个应该是跟Flash芯片内部的硬件逻辑有关的,时钟相位,时钟极性支持两种模式的话,芯片内部有对应的硬件检测或对应的pulse中断,这个只是一个SPI指令模式的识别方式,没有必要太过深究。
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-30 20:39:58 | 显示全部楼层
赵晓雨 发表于 2019-7-30 16:28
这个应该是跟Flash芯片内部的硬件逻辑有关的,时钟相位,时钟极性支持两种模式的话,芯片内部有对应的硬件 ...

你好,请问你测试过mode0 模式读写吗,好像是无法正常读写的。还有就是您的意思是,我无需去配置W25Q128模式,flash芯片会自动识别我当前的模式吗(mode0 / mode3)?
回复

使用道具 举报

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-12-30
在线时间
32 小时
发表于 2019-7-30 23:27:01 | 显示全部楼层
czw 发表于 2019-7-30 20:39
你好,请问你测试过mode0 模式读写吗,好像是无法正常读写的。还有就是您的意思是,我无需去配置W25Q128 ...

STM32MXCUBE配置SPI时钟有bug,不论如何设置,初始化后时钟输出为高,当你将CS拉低时,时钟线此时任然为高,导致通讯错误。要么硬件上外挂下拉电阻,要么先随便用这个SPI中先发送一个数据(不要拉低片选),在发送完成后时钟线保持为设定值,以后可以正常通讯
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-31 09:34:47 | 显示全部楼层
Talons 发表于 2019-7-30 23:27
STM32MXCUBE配置SPI时钟有bug,不论如何设置,初始化后时钟输出为高,当你将CS拉低时,时钟线此时任然为 ...

你好,我是F4库函数开发都有这个问题吗?
回复

使用道具 举报

9

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2015-12-30
在线时间
32 小时
发表于 2019-7-31 10:56:55 | 显示全部楼层
czw 发表于 2019-7-31 09:34
你好,我是F4库函数开发都有这个问题吗?

具体原因我也不清楚,但是下拉或者发一次无效数据可以让时钟线正常。
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-7-31 11:39:52 | 显示全部楼层
Talons 发表于 2019-7-31 10:56
具体原因我也不清楚,但是下拉或者发一次无效数据可以让时钟线正常。

你好,我在SPI初始化的时候有发一次无效数据,就是上面代码中的启动传输。
  1. SPI1_ReadWriteByte(0xff);//启动传输
复制代码
回复

使用道具 举报

2

主题

474

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6447
金钱
6447
注册时间
2018-6-27
在线时间
546 小时
发表于 2019-8-1 08:00:12 | 显示全部楼层
学习学习,学习学习。
回复

使用道具 举报

12

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2018-1-21
在线时间
46 小时
 楼主| 发表于 2019-8-2 10:02:32 | 显示全部楼层
正点原子 发表于 2019-7-30 14:28
两个模式都是支持的,都可以通信。
你看我们NRF和W25Q共用SPI的时候,就是以NRF的模式为准的, 也是可以访 ...

原子哥,我选择mode0,  读取ID失败是为什么?
回复

使用道具 举报

1

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
285
金钱
285
注册时间
2018-3-18
在线时间
38 小时
发表于 2019-8-5 16:00:10 | 显示全部楼层
学习了
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-15 20:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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