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

求解答STM32F103ZE系列单片机GPIO模拟SPI协议与W25Q16通讯

[复制链接]
yjmone 提问时间:2020-3-30 15:40 /
#include "stm32f10x.h"
#include "my_usart.h"


#define SPI_CS_Clr()  GPIO_ResetBits(GPIOA,GPIO_Pin_4)//CS
#define SPI_CS_Set()  GPIO_SetBits(GPIOA,GPIO_Pin_4)
#define SPI_SCLK_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_5)//SCL
#define SPI_SCLK_Set() GPIO_SetBits(GPIOA,GPIO_Pin_5)
#define SPI_Read() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)//MISO
#define SPI_SDOUT_Clr() GPIO_ResetBits(GPIOA,GPIO_Pin_7)//MOSI
#define SPI_SDOUT_Set() GPIO_SetBits(GPIOA,GPIO_Pin_7)
        
void delay(u8 i)
{
  while(i > 0)
  {
    i--;
  }
}

/*
PA4  片选
PA5  SCLK
PA6  MISO
PA7  MOSI
*/

//引脚初始化
void MY_SPI_Init(void)
{
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
  GPIO_InitTypeDef  GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOD1,5,15
//  GPIO_SetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度50MHz
  GPIO_Init(GPIOA, &GPIO_InitStructure);   //初始化GPIOD1,5,15
}
//读写
u8 MY_SPI_WR_OneByte(u8 byte)
{
  u8 i, temp = 0;
  
  for(i = 0; i < 8; i++)
  {
    SPI_SCLK_Clr();  
    if(byte & 0x80)  SPI_SDOUT_Set();
    else   SPI_SDOUT_Clr();
    byte <<= 1;
    SPI_SCLK_Set();//拉高时钟线(上升沿传输)
   
    temp <<= 1;
    if(SPI_Read()) temp++;
    SPI_SCLK_Clr();  //下降沿读取数据
  }
  
  return temp;
}

int main(void)
{
  MY_SPI_Init();
  YJM_Usart_Init(USART1, 115200, 0, 0);
  SPI_CS_Clr();  //拉低片选(使能芯片)
  printf("flashid = %x   %x   %x   %x   ", MY_SPI_WR_OneByte(0x9f), MY_SPI_WR_OneByte(0xff), MY_SPI_WR_OneByte(0xff),      MY_SPI_WR_OneByte(0xff));
  SPI_CS_Set();
  while(1);
}


SPI芯片是W25Q16
串口打印出来的数据如下:
[15:33:45.176]收←◆flashid = 0   0   0   0   
[15:33:45.837]收←◆flashid = 9f   ff   ff   ff   
[15:33:46.196]收←◆flashid = 9f   ff   ff   ff   
[15:33:46.586]收←◆flashid = ff   ff   ff   ff   
[15:33:46.906]收←◆flashid = df   ff   ff   ff   
[15:33:47.286]收←◆flashid = 9f   ff   ff   ff   
[15:33:47.796]收←◆flashid = ff   ff   ff   ff   
[15:33:48.236]收←◆flashid = ff   ff   ff   ff   
[15:33:48.586]收←◆flashid = ff   ff   ff   ff   
[15:33:48.891]收←◆flashid = 9f   ff   ff   ff   
[15:33:49.186]收←◆flashid = 9f   ff   ff   ff   
[15:33:49.506]收←◆flashid = ff   ff   ff   ff   
[15:33:50.036]收←◆flashid = ff   ff   ff   ff   
[15:33:50.316]收←◆flashid = ff   ff   ff   ff   
[15:33:50.566]收←◆flashid = ff   ff   ff   ff   
[15:33:50.816]收←◆flashid = 9f   ff   ff   ff   
[15:33:51.386]收←◆flashid = ff   ff   ff   ff   
[15:33:51.666]收←◆flashid = 9f   ff   ff   ff   
[15:33:51.946]收←◆flashid = df   ff   ff   ff   

请问要怎么修改程序才能正确读出FLASH_ID

收藏 评论1 发布时间:2020-3-30 15:40

举报

1个回答
mylovemcu 回答时间:2020-3-30 16:03:47
uint16 SPI_Flash_ReadID(void)
{
        uint16 Temp = 0;          
        SPI1_CS.ClrVal();                                    
        SPI1_ReadWriteByte(0x9F);//发送读取ID命令            
        SPI1_ReadWriteByte(0x00);             
//        SPI1_ReadWriteByte(0x00);             
//        SPI1_ReadWriteByte(0x00);                                    
        Temp|=SPI1_ReadWriteByte(0xFF)<<8;  
        Temp|=SPI1_ReadWriteByte(0xFF);         
        SPI1_CS.SetVal();                                    
        return Temp;
}

按照这个格式读  
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版