[STM32] SPI inicialmente usa FLASH W25Q64 de lectura y escritura

Conexión de hardware

Insertar descripción de la imagen aquí

(1) SS (Selección de esclavo): línea de señal de selección de dispositivo esclavo, a menudo llamada línea de señal de selección de chip. Cada dispositivo esclavo tiene una línea de señal NSS independiente. Cuando el host desea seleccionar un dispositivo esclavo, el dispositivo esclavo La línea de señal NSS es configurado en nivel bajo, se selecciona el dispositivo esclavo, es decir, la selección de chip es válida y luego el host inicia la comunicación SPI con el dispositivo esclavo seleccionado. Por lo tanto, la comunicación SPI comienza con la línea NSS en nivel bajo y termina con la línea NSS en nivel alto.

(2) SCK (Reloj serie): Línea de señal de reloj, utilizada para la sincronización de datos de comunicación. Es generado por el host de comunicación y determina la velocidad de comunicación. Diferentes dispositivos admiten diferentes frecuencias de reloj máximas. Por ejemplo, la frecuencia de reloj SPI máxima de STM32 es fpclk/2. Cuando se comunica entre dos dispositivos, la velocidad de comunicación está limitada por la baja -dispositivo de velocidad. .

(3) MOSI (salida maestra, entrada esclava): pin de salida del dispositivo maestro/entrada del dispositivo esclavo.

(4) MISO (entrada maestra, salida esclava): pin de entrada del dispositivo maestro/salida del dispositivo esclavo.

carta de acuerdo

Insertar descripción de la imagen aquí

起始信号: La línea de señal NSS cambia de alta a baja, que es la señal inicial de la comunicación SPI.
数据有效性:Los datos de MOSI y MISO 上升沿se generan durante el cambio de SCK 下降沿时被采样. Es decir, en el flanco descendente de SCK , los datos de MOSI y MISO son válidos . Cuando el nivel es alto, significa dato "1", y cuando es bajo, significa dato "0".
CPOL/CPHA 及通讯模式: En términos generales, el estado del reloj de SCK y el tiempo de muestreo de datos cuando el bus está inactivo se determinan en función de la configuración de CPOL/CPHA en el registro CR. Generalmente se utilizan los modos 0 y 3.
Insertar descripción de la imagen aquí

Conceptos básicos de programación

(1) Inicializar el pin de destino y el reloj del puerto utilizados para la comunicación;
(2) Habilitar el reloj del periférico SPI;
(3) Configurar el modo, la dirección, la velocidad y otros parámetros del periférico SPI y habilitar el periférico SPI;
(4 ) Escribir funciones básicas de envío y recepción basadas en bytes SPI;
(5) Escribir funciones para borrado FLASH, operaciones de lectura y escritura;
(6) Escribir programas de prueba para verificar datos de lectura y escritura.

Configurar la multiplexación GPIO

//GPIO 配置
GPIO_InitTypeDef GPIO_InitStructure;
NSS片选引脚配置为普通GPIO
MISO MOSI SLK引脚配置为复用推挽输出
GPIO_Init(FLASH_SPI_MOSI_PORT, &GPIO_InitStructure);

Configurar SPI

SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd (SPI1, ENABLE );

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(FLASH_SPIx, &SPI_InitStructure);

SPI_Cmd(FLASH_SPIx, ENABLE);

Utilice SPi para leer y escribir FLASH W25Q64

Envía y recibe un byte de datos usando SPI

 #define Dummy_Byte  0xFF
u8 SPI_FLASH_SendByte(u8 byte)
{
    
    
	SPITimeout = SPIT_FLAG_TIMEOUT;
	/* 等待发送缓冲区为空,TXE 事件 */
	//读取SR寄存器 相关位
	while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_TXE) == RESET)
	{
    
    
		if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(0);	
	}
	
	/* 写入数据寄存器,把要写入的数据写入发送缓冲区 */
	//与大多数写DR寄存器操作一致,写动作会自动清空DR寄存器
	SPI_I2S_SendData(FLASH_SPIx, byte);

	SPITimeout = SPIT_FLAG_TIMEOUT;
	/* 等待接收缓冲区非空,RXNE 事件 */
	while (SPI_I2S_GetFlagStatus(FLASH_SPIx, SPI_I2S_FLAG_RXNE) == RESET)
	{
    
    
		if ((SPITimeout--) == 0) return SPI_TIMEOUT_UserCallback(1);
	}
	/* 读取数据寄存器,获取接收缓冲区数据 */
	//与大多数读DR寄存器操作一致,读动作会自动清空DR寄存器
	return SPI_I2S_ReceiveData(FLASH_SPIx);

}

Comandos para controlar Flash

El chip FLASH ha personalizado muchas instrucciones. Controlamos el STM32 y usamos el bus SPI para enviar instrucciones al chip FLASH. El chip FLASH realizará las operaciones correspondientes después de recibirlas.

Supongo que te gusta

Origin blog.csdn.net/apythonlearner/article/details/132604162
Recomendado
Clasificación