[STM32L1] 使用STM32L151的SPI2读取W25Q16的ID错误,返回总是0xFFFF,请帮忙看看代码是什么原因。

[复制链接]
 楼主| dianhang 发表于 2020-5-6 09:31 | 显示全部楼层 |阅读模式
使用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. }
  37. 复制代码
  38. //SPIx 读写一个字节
  39. //TxData:要写入的字节
  40. //返回值:读取到的字节
  41. uint8_t SPI2_ReadWriteByte(uint8_t TxData)
  42. {  
  43. uint8_t retry=0;      
  44. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
  45.   {
  46.   retry++;
  47.   if(retry>200)return 0;
  48.   }     
  49. SPI_I2S_SendData(SPI2, TxData); //通过外设SPIx发送一个数据
  50. retry=0;

  51. while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //检查指定的SPI标志位设置与否:接受缓存非空标志位
  52.   {
  53.   retry++;
  54.   if(retry>200)return 0;
  55.   }            
  56. return SPI_I2S_ReceiveData(SPI2); //返回通过SPIx最近接收的数据         
  57. }
  58. 复制代码
  59. //读取芯片ID
  60. //返回值如下:      
  61. //0XEF13,表示芯片型号为W25Q80  
  62. //0XEF14,表示芯片型号为W25Q16   
  63. //0XEF15,表示芯片型号为W25Q32  
  64. //0XEF16,表示芯片型号为W25Q64
  65. //0XEF17,表示芯片型号为W25Q128   
  66. uint16_t W25QXX_ReadID(void)
  67. {
  68. uint16_t Temp = 0;   
  69. GPIO_ResetBits(GPIOB,GPIO_Pin_12);        
  70. SPI2_ReadWriteByte(0x90);//发送读取ID命令     
  71. SPI2_ReadWriteByte(0x00);      
  72. SPI2_ReadWriteByte(0x00);      
  73. SPI2_ReadWriteByte(0x00);         
  74. Temp|=SPI2_ReadWriteByte(0x00)<<8;  
  75. Temp|=SPI2_ReadWriteByte(0x00);  
  76. GPIO_SetBits(GPIOB,GPIO_Pin_12);        
  77. return Temp;
  78. }      
mmuuss586 发表于 2020-5-16 20:28 | 显示全部楼层
看不出来哪里问题
952351564 发表于 2020-5-24 19:22 | 显示全部楼层
解决了吗,咋解决的
welssss 发表于 2020-5-24 20:09 | 显示全部楼层
//SPI2_ReadWriteByte(0xff);
观海 发表于 2020-6-6 16:01 | 显示全部楼层
是不是时序有问题
磨砂 发表于 2020-6-6 16:01 | 显示全部楼层
读取的地址不对?
晓伍 发表于 2020-6-6 16:02 | 显示全部楼层
这样看可看不出来问题
八层楼 发表于 2020-6-6 16:02 | 显示全部楼层
不知道楼主解决问题了没有
guanjiaer 发表于 2020-6-6 16:03 | 显示全部楼层
用示波器看看波形符合要求吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

273

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部