STM32模拟SPI

接着上篇文章继续,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;

	
}

猜你喜欢

转载自blog.csdn.net/ABCisCOOL/article/details/115218842