求解答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
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]