你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L151读取W25Q16的ID错误,请帮忙看看是什么原因

[复制链接]
chenbourne 提问时间:2020-5-6 09:26 /
使用STM32L151的SPI2读取W25Q16的ID错误,返回总是0xFFFF,请帮忙看看代码是什么原因。代码参考的是正点原子的。
  1. void SPI2_Init(void)
  2. {
  3.   SPI_InitTypeDef  SPI_InitStructure;
  4.   GPIO_InitTypeDef GPIO_InitStructure;
  5.     ////SPI Set PB13,14,15 as Output push-pull - SCK, MISO and MOSI
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);

  7.     /* 使能SPI引脚相关的时钟 */
  8.    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,ENABLE);
  9.    
  10.     /*指令IO的复用功能*/
  11.      GPIO_PinAFConfig(GPIOB, GPIO_PinSource13,GPIO_AF_SPI2);
  12.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource14,GPIO_AF_SPI2);
  13.   GPIO_PinAFConfig(GPIOB, GPIO_PinSource15,GPIO_AF_SPI2);
  14.     /*  SCK、MOSI、MISO */
  15.   GPIO_InitStructure.GPIO_Pin =   GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
  16.   GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF;  //复用
  17.   GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽
  18.   GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  19.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_40MHz;
  20.   GPIO_Init(GPIOB,&GPIO_InitStructure);

  21.         /* SPI2 configuration */                                            
  22.         SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  
  23.         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                                
  24.         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                        
  25.         SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                                   
  26.         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                        
  27.         SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                                 
  28.         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;
  29.         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                        
  30.         SPI_InitStructure.SPI_CRCPolynomial = 7;                                

  31.         SPI_Init(SPI2, &SPI_InitStructure);  
  32.         /* Enable SPI2  */
  33.         SPI_Cmd(SPI2, ENABLE);                                    
  34.         
  35.         SPI2_ReadWriteByte(0xff);

  36. }
复制代码
  1. //SPIx 读写一个字节
  2. //TxData:要写入的字节
  3. //返回值:读取到的字节
  4. uint8_t SPI2_ReadWriteByte(uint8_t TxData)
  5. {  
  6. uint8_t retry=0;      
  7. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  8.   {
  9.   retry++;
  10.   if(retry>200)return 0;
  11.   }     
  12. SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
  13. retry=0;

  14. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  15.   {
  16.   retry++;
  17.   if(retry>200)return 0;
  18.   }            
  19. return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据         
  20. }
复制代码
  1. //读取芯片ID
  2. //返回值如下:      
  3. //0XEF13,表示芯片型号为W25Q80  
  4. //0XEF14,表示芯片型号为W25Q16   
  5. //0XEF15,表示芯片型号为W25Q32  
  6. //0XEF16,表示芯片型号为W25Q64
  7. //0XEF17,表示芯片型号为W25Q128   
  8. uint16_t W25QXX_ReadID(void)
  9. {
  10. uint16_t Temp = 0;   
  11. GPIO_ResetBits(GPIOB,GPIO_Pin_12);        
  12. SPI2_ReadWriteByte(0x90);//发送读取ID命令     
  13. SPI2_ReadWriteByte(0x00);      
  14. SPI2_ReadWriteByte(0x00);      
  15. SPI2_ReadWriteByte(0x00);         
  16. Temp|=SPI2_ReadWriteByte(0x00)<<8;  
  17. Temp|=SPI2_ReadWriteByte(0x00);  
  18. GPIO_SetBits(GPIOB,GPIO_Pin_12);        
  19. return Temp;
  20. }      
复制代码





收藏 评论8 发布时间:2020-5-6 09:26

举报

8个回答
mylovemcu 回答时间:2020-5-6 10:22:58
PB12引脚是不是没有配置  默认的话是输入模式  不配置CS引脚不能拉低   
还有测试一下其他读写功能好使不

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

chenbourne 回答时间:2020-5-6 12:29:43
mylovemcu 发表于 2020-5-6 10:22
PB12引脚是不是没有配置  默认的话是输入模式  不配置CS引脚不能拉低   
还有测试一下其他读写功能好使不 ...

PB12配置了的,读写功能也不正常,读出来的数据与写进去的数据不一样
mylovemcu 回答时间:2020-5-6 13:14:25
chen_hang 发表于 2020-5-6 12:29
PB12配置了的,读写功能也不正常,读出来的数据与写进去的数据不一样

PB15换成输入模式  不用复用模式  
SPI波特率降低  你现在配置的是2分频  设置到128分频试一下
废鱼 回答时间:2020-5-6 15:03:54
用示波器先看有没有数据通讯,排除硬件链接和引脚功能配置错误以后,再进行确定发送的时序,数据内容是否真确。楼主应该掌握排查问题的方法,这样解决问题会快很多。

评分

参与人数 1蝴蝶豆 +3 收起 理由
STMCU + 3

查看全部评分

chenbourne 回答时间:2020-5-6 20:28:10
mylovemcu 发表于 2020-5-6 13:14
PB15换成输入模式  不用复用模式  
SPI波特率降低  你现在配置的是2分频  设置到128分频试一下 ...

好的 我试一试 谢谢了
chenbourne 回答时间:2020-5-6 20:41:10
安 发表于 2020-5-6 15:03
用示波器先看有没有数据通讯,排除硬件链接和引脚功能配置错误以后,再进行确定发送的时序,数据内容是否真 ...

好的 谢谢了
李康1202 回答时间:2020-5-7 09:16:44
chen_hang 发表于 2020-5-6 12:29
PB12配置了的,读写功能也不正常,读出来的数据与写进去的数据不一样

spi的速度降一下试一试
lebment 回答时间:2020-5-9 15:34:03
调试法则:1.检查硬件。
                2.检查软件。
                3.重复1,2步骤直到发现问题。
最基本的东西是正确的,后面的步骤才会有效。
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版