[STM32] SPI utilise initialement le FLASH W25Q64 en lecture et en écriture

connexion matérielle

Insérer la description de l'image ici

(1) SS (Slave Select) : Ligne de signal de sélection de périphérique esclave, souvent appelée ligne de signal de sélection de puce. Chaque périphérique esclave possède une ligne de signal NSS indépendante. Lorsque l'hôte souhaite sélectionner un périphérique esclave, le périphérique esclave La ligne de signal NSS est réglé sur un niveau bas, le périphérique esclave est sélectionné, c'est-à-dire que la sélection de puce est valide, puis l'hôte démarre la communication SPI avec le périphérique esclave sélectionné. Par conséquent, la communication SPI commence avec la ligne NSS réglée à un niveau bas et se termine par une ligne NSS tirée à un niveau haut.

(2) SCK (Serial Clock) : ligne de signal d'horloge, utilisée pour la synchronisation des données de communication. Il est généré par l'hôte de communication et détermine le taux de communication. Différents appareils prennent en charge différentes fréquences d'horloge maximales. Par exemple, la fréquence d'horloge SPI maximale du STM32 est fpclk/2. Lors de la communication entre deux appareils, le taux de communication est limité par le faible appareil à grande vitesse. .

(3) MOSI (sortie maître, entrée esclave) : sortie du périphérique maître/broche d'entrée du périphérique esclave.

(4) MISO (entrée principale, sortie esclave) : broche d'entrée de périphérique maître/sortie de périphérique esclave.

lettre d'accord

Insérer la description de l'image ici

起始信号: La ligne de signal NSS passe de haut en bas, ce qui est le signal de départ de la communication SPI.
数据有效性: Les données MOSI et MISO 上升沿changent de sortie pendant SCK 下降沿时被采样. C'est-à -dire qu'au front descendant de SCK , les données MOSI et MISO sont valides . Lorsque le niveau est haut, cela signifie les données "1", et lorsqu'il est bas, cela signifie les données "0".
CPOL/CPHA 及通讯模式: D'une manière générale, l'état de l'horloge du SCK et le temps d'échantillonnage des données lorsque le bus est inactif sont déterminés en fonction de la configuration de CPOL/CPHA dans le registre CR. Les modes 0 et 3 sont généralement utilisés.
Insérer la description de l'image ici

Les essentiels de la programmation

(1) Initialiser la broche cible et l'horloge du port utilisés pour la communication ;
(2) Activer l'horloge du périphérique SPI ;
(3) Configurer le mode, l'adresse, le débit et d'autres paramètres du périphérique SPI et activer le périphérique SPI ;
(4 ) Écrire des fonctions d'envoi et de réception SPI de base basées sur les octets ;
(5) Écrire des fonctions pour les opérations d'effacement FLASH, de lecture et d'écriture ;
(6) Écrire des programmes de test pour vérifier les données de lecture et d'écriture.

Configurer le multiplexage GPIO

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

Configurer 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);

Utilisez SPi pour lire et écrire FLASH W25Q64

Envoyer et recevoir un octet de données à l'aide de 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);

}

Commandes pour contrôler Flash

La puce FLASH a personnalisé de nombreuses instructions. Nous contrôlons le STM32 et utilisons le bus SPI pour envoyer des instructions à la puce FLASH. La puce FLASH effectuera les opérations correspondantes après l'avoir reçue.

Je suppose que tu aimes

Origine blog.csdn.net/apythonlearner/article/details/132604162
conseillé
Classement