接着上篇文章继续,STM32读写SPI FLASH
(1)更改GPIO配置
由于没有使用到硬件的SPI,那么将硬件初始化SPI部分进行删除,取消GPIO的复用功能,然后更改MOSI和SCLK引脚为输出模式,MISO更改为输入模式。
(2)改写uint8_t SPI1_SendByte(uint8_t byte)函数
void w25qxx_init(void)
{
/*!< Enable GPIO clocks,使能GPIOB硬件时钟 */
RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOB, ENABLE);
//端口配置 PB3 PB5
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_5; //3、5号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure);
//端口配置 PB4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //4号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure);
//初始化片选引脚 PB14
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14; //14号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度50MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure);
//由于M4芯片还没有真正配置好,先不让外部SPI设备工作
W25QXX_SS = 1;
}
//模拟SPI时序必须严格按照外围设备的时序图进行操作
uint8_t SPI1_SendByte(uint8_t byte)
{
uint32_t i=0;
uint8_t d=0;
for(i=0; i<8; i++)
{
//MSB,最高有效位优先
if(byte & (1<<(7-i)))
W25QXX_MOSI = 1;
else
W25QXX_MOSI = 0;
//设置SCLK线为低电平
W25QXX_SCLK = 0;
delay_us(2);
//由于是同步通信,这个时候可以读取数据
if(W25QXX_MISO)
d|=1<<(7-i);
//设置SCLK线为高电平
W25QXX_SCLK = 1;
delay_us(2);
}
return d;
}