STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

一、原理图分析

STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 由原理图可知w25Q128 CS片选引脚为PB14、MISO是PB4、MOSI是PB5.

二、程序编写

1、spi初始化以及读写函数

#include "spi.h"

void Spi_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;
	SPI_InitTypeDef  SPI_InitStruct;
	
	//使能端口 B 的硬件时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
	
	//使能SPI的硬件时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
	
	//PB3-PB5引脚连接到SPI1的硬件
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;//PB3  PB4  PB5
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF;//复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz
	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB,&GPIO_InitStruct);	
	
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource4, GPIO_AF_SPI1);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_SPI1);
	
	//配置PB14为输出模式
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_14;//PB14
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;//输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_Fast_Speed;//速度 快速 25MHz
	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_UP;//上拉
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	//PB14初始电平状态?   
	SPI_CS = 1;//片选引脚   低电平有效选择,高电平无效选择
	
	//配置SPI相关参数
   SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//双线全双工通信
   SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//默认是主机角色,主动控制从机
   SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//默认是8位数据传输,主要根据从机的设备进行配置 【看从机的数据手册的时序图】
   //模式3
   SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//SPI总线空闲的时候,时钟线为高电平  CPOL=1,【看从机的数据手册的时序图】
   SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//CPHA = 1,,就是主机会对MOSI引脚进行电平采样在时钟的第二个条边沿【看从机的数据手册的时序图】
   SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//片选引脚有软件代码控制【看从机的数据手册的时序图】
   SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;//SPI的硬件时钟=84MHz/4=21MHz {看从机的数据手册的芯片描述,一般在开头介绍}
 
   SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//高位先出【看从机的数据手册的时序图】
   //SPI_InitStruct.SPI_CRCPolynomial = 7;//主要是用在两个M4芯片进行通信,最后添加CRC检验码
   SPI_Init(SPI1, &SPI_InitStruct);

	//使能SPI1硬件
   SPI_Cmd(SPI1, ENABLE);

}

/*
 * 功能:SPI 读写一个字节函数    ---》数据交换
 * 参数:发送一个字节数据
 * 返回值:返回读取的数据
*/

uint16_t spi_read_writeByte(uint8_t TXdata)
{
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);   //等待上一次的数据发完
	SPI_I2S_SendData(SPI1,TXdata);//发送数据
	
	while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET);  //等上次数据接收完
	return SPI_I2S_ReceiveData(SPI1);//接收数据	
}

 2、读写厂商ID和设备ID

STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 由上图可知厂商ID是0xEF,设备ID是0x17.

STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 由上图可知读取厂商ID和设备ID指令为0x90(第一个字节),

 

该指令与 Release from Power-Down/Device ID 指令相似。该指令以/CS 拉低开始,然
后通过 DI 传输指令代码 90H 和 24 位的地址(全为 000000H)。这之后,WINBOND 的 ID
(EFH)和芯片 ID 将在时钟的下降沿以高位在前的方式传出。关于 W25Q128BV 的芯片和
制造商 ID,在图 29 中列出。如果 24 位地址传输的是 000001H,那么芯片 ID 将首先被
传出,然后紧接着的是制造商 ID。这两个是连续读出来的。该指令以/CS 拉高结束。

STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

 

 


 

STM32(三十七)SPI读取W25Q128flash的厂商ID、设备ID以及读写数据(硬件SPI)

上一篇:golang环境变量的设置


下一篇:清理mysql特定数据