2026/4/18 8:29:13
网站建设
项目流程
网站流量显示,网站与建设的字体间距,上海网站建设电,优化营商环境心得体会SPI 配置步骤#xff1a;
使能 GPIO 和 SPI 时钟
配置 GPIO 为复用功能 (如 PA5-SCK, PA6-MISO, PA7-MOSI)
配置 SPI 参数 (模式、波特率、数据位、时钟极性 / 相位)
使能 SPI
SPI 通信函数#xff1a;
发送#xff1a;HAL_SPI_Transmit()
接收#xff1a;HAL_SPI_Receive…SPI 配置步骤使能 GPIO 和 SPI 时钟配置 GPIO 为复用功能 (如 PA5-SCK, PA6-MISO, PA7-MOSI)配置 SPI 参数 (模式、波特率、数据位、时钟极性 / 相位)使能 SPISPI 通信函数发送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; // 时钟极性(CPOL0)hspi1.Init.CLKPhase SPI_PHASE_1EDGE; // 时钟相位(CPHA0)hspi1.Init.NSS SPI_NSS_SOFT; // 软件控制片选hspi1.Init.BaudRatePrescaler SPI_BAUDRATEPRESCALER_2; // 波特率f/2hspi1.Init.FirstBit SPI_FIRSTBIT_MSB; // 高位先发送hspi1.Init.TIMode SPI_TIMODE_DISABLE; // 禁用TI模式hspi1.Init.CRCCalculation SPI_CRCCALCULATION_DISABLE; // 禁用CRCHAL_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_buf[3] {(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;}