当前位置: 首页 > news >正文

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_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;
}

http://www.cnnetsun.cn/news/115589.html

相关文章:

  • Linux C/C++ 学习日记(51):内存池
  • AAAI25|基于神经共形控制的时间序列预测模型
  • CATCH:ICLR 2025 最值得关注的时间序列异常检测新框架
  • 开发到生产全链路:Docker containerd Kubernetes 运行时全景指南
  • 文件包含漏洞终极指南
  • #扫雷游戏
  • Java计算机毕设之基于springboot+vue的高校学院校内订餐系统的设计与实现基于JAVA的学院校内订餐系统的实现(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于微信跑腿小程序的设计与实现基于springboot+微信小程序的跑腿小程序的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 小程序计算机毕设之基于springboot+微信小程序的餐厅预约系统设计与实现基于微信小程序的餐厅预约系统设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • torch报错:ibtorch_cpu.so: cannot enable executable stack as shared object requires: Invalid argument
  • 计算机小程序毕设实战-基于springboot+微信小程序的餐厅预约系统设计与实现基于SpringBoot的在线点餐系统微信小程序【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • 【课程设计/毕业设计】基于微信小程序跑腿平台的设计与实现代码基于springboot+微信小程序的跑腿小程序的设计与实现【附源码、数据库、万字文档】
  • jquery的基本使用(2)
  • HTML5结合Vue3实现超大文件分片上传的加密传输方案?
  • 基于增量动力分析方法IDA求解易损性曲线的Matlab代码探秘
  • mysql面试题整理
  • 瞄准科技特长生!3 大核心编程考级赛事(CTL/YCL/GESP)深度对比
  • day38打卡
  • JavaEE进阶——SpringBoot日志从入门到精通
  • 结构体简单题
  • 时间序列回归预测:LSTM、CNN - LSTM、PSO - CNN - LSTM、GAPSO - CNN - LSTM大比拼
  • 飞轮储能系统的建模与 MATLAB 仿真:永磁同步电机作为飞轮驱动电机
  • 车间进度总卡壳?生产小工单的3个必备功能,90%企业都用错了
  • 如何用 ShedLock 让 Spring Boot 的定时任务在多实例环境下只执行一次
  • 基于MPC的永磁同步电机非线性终端滑模控制仿真研究
  • ISSA - CNN - BiLSTM多输入单输出回归的Python实现与改进
  • Q学习(Q-learning)路径规划算法实战
  • ANSYS/LS - dyna防爆涂层砂浆砖框架结构爆破荷载损伤响应案例探索
  • 基于TOA/FOA的无源定位方法MATLAB仿真探索
  • 基于一致性算法改进的自适应虚拟阻抗控制:解决双机并联功率分布不均