yjmone 发表于 2020-3-30 15:40:42

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

#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片选
PA5SCLK
PA6MISO
PA7MOSI
*/

//引脚初始化
void MY_SPI_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDefGPIO_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
串口打印出来的数据如下:
收←◆flashid = 0   0   0   0   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = df   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = ff   ff   ff   ff   
收←◆flashid = 9f   ff   ff   ff   
收←◆flashid = df   ff   ff   ff   

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

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;
}

按照这个格式读
页: [1]
查看完整版本: 求解答STM32F103ZE系列单片机GPIO模拟SPI协议与W25Q16通讯