Day32:SPI 配置与使用

SPI 配置步骤:

使能 GPIO 和 SPI 时钟

配置 GPIO 为复用功能 (如 PA5-SCK, PA6-MISO, PA7-MOSI)

配置 SPI 参数 (模式、波特率、数据位、时钟极性 / 相位)

使能 SPI

SPI 通信函数:

发送:HAL_SPI_Transmit()

接收:HAL_SPI_Receive()

收发:HAL_SPI_TransmitReceive()(推荐,效率更高)

代码示例:(STM32 作为主设备与 SPI Flash 通信)

// SPI Flash命令

#define W25X_WriteEnable 0x06

#define W25X_WriteDisable 0x04

#define W25X_ReadStatusReg 0x05

#define W25X_WriteStatusReg 0x01

#define W25X_ReadData 0x03

#define W25X_WriteData 0x02

// SPI初始化

SPI_HandleTypeDef hspi1;

void SPI1_Init(void){

GPIO_InitTypeDef GPIO_InitStruct;

// 使能GPIOA和SPI1时钟

__HAL_RCC_GPIOA_CLK_ENABLE();

__HAL_RCC_SPI1_CLK_ENABLE();

// 配置PA5(SCK)、PA6(MISO)、PA7(MOSI)为复用功能

GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;

GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // 复用推挽输出

GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

GPIO_InitStruct.Alternate = GPIO_AF2_SPI1;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

// 配置SPI参数(模式0, 波特率f/2)

hspi1.Instance = SPI1;

hspi1.Init.Mode = SPI_MODE_MASTER; // 主模式

hspi1.Init.Direction = SPI_DIRECTION_2LINES; // 双线全双工

hspi1.Init.DataSize = SPI_DATASIZE_8BIT; // 8位数据

hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; // 时钟极性(CPOL=0)

hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; // 时钟相位(CPHA=0)

hspi1.Init.NSS = SPI_NSS_SOFT; // 软件控制片选

hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; // 波特率f/2

hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; // 高位先发送

hspi1.Init.TIMode = SPI_TIMODE_DISABLE; // 禁用TI模式

hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; // 禁用CRC

HAL_SPI_Init(&hspi1);

HAL_SPI_Start(&hspi1); // 启动SPI

}

// 读取SPI Flash一个字节

uint8_t SPI_Flash_ReadByte(void){

uint8_t data;

HAL_SPI_TransmitReceive(&hspi1, &dummy, &data, 1, 1000);

return data;

}

// 主函数

int main(){

SPI1_Init();

// 片选有效

HAL_GPIO_WritePin(SPI_FLASH_CS_PORT, SPI_FLASH_CS_PIN, GPIO_PIN_RESET);

// 发送读数据命令

uint8_t cmd = W25X_ReadData;

HAL_SPI_Transmit(&hspi1, &cmd, 1, 1000);

// 发送地址(高位在前)

uint32_t addr = 0x000000;

uint8_t addr_buf3 = {(uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr};

HAL_SPI_Transmit(&hspi1, addr_buf, 3, 1000);

// 读取数据

uint8_t data = SPI_Flash_ReadByte();

// 片选无效

HAL_GPIO_WritePin(SPI_FLASH_CS_PORT, SPI_FLASH_CS_PIN, GPIO_PIN_SET);

return 0;

}

相关推荐
irislinAmelia2 小时前
缺陷检测AI关键点在哪
人工智能·嵌入式硬件·1024程序员节
糖糖单片机设计2 小时前
基于 STM32 的植物生长环境监控系统
stm32·单片机·嵌入式硬件
创界工坊工作室3 小时前
56-基于STC89C52的智能声控饮水机设计
stm32·单片机·嵌入式硬件·51单片机·proteus
LCG米3 小时前
STM32 DMA 多通道链式传输实测:请求仲裁顺序错位根因、半满中断乒乓与高速并发搬运落地
stm32·单片机·嵌入式·1024程序员节
hkj88083 小时前
stm32 ADC DMA 循环模式配合双缓冲分块(Ping-Pong)
stm32·单片机·嵌入式硬件
POMAGTOR5 小时前
【磁吸式连接器选型工程解析:结构原理、应用场景与选型可靠性要点】
网络·嵌入式硬件
RFID科技的魅力6 小时前
2026 年 RFID 资产标签批量制作怎么做?RFID 标签打印机实操指南
运维·人工智能·嵌入式硬件·物联网
Sakura_j_h_8 小时前
STM32F103 定时器的三种用法:PWM 输出、输入捕获与编码器接口
stm32·嵌入式·输入捕获·定时器·pwm·编码器·1024程序员节
Lxx_Zw8 小时前
机器周期与共地:时钟基准和电压参考基准
stm32·单片机·嵌入式硬件
我叫洋洋10 小时前
用 Qoder(AI 编程助手)把 Cadence 16.6 从零配到能画板
人工智能·单片机·嵌入式硬件·电路·1024程序员节