【学习记录】软件spi

本文介绍了基于软件模拟的SPI接口,包括SPI_Soft1选项、SPI四种工作模式的选择以及初始化和数据传输函数SPI_Init和SPI_WriteByte的实现。

已经有软件iic了,所以顺便把软件spi也做了
软件spi目前只支持了spi四种模式中的一种,后续用到会同步更改
以下是.h

#ifndef _M_SPI_SOFT_H
#define _M_SPI_SOFT_H
#include "M_io.h"
 
#define SPI_Soft   1    //是否启用软件
 
#define SPI_SCK    SPI1_SCK_PIN
#define SPI_MOSI   SPI1_SOUT_PIN
#define SPI_MISO   SPI1_SIN_PIN
#define SPI_CS     SPI1_PCS0_PIN

#define SPI_Mode   3   
/*备选值 0 1 2 3
0 时钟空闲为低 在第一个上升沿采样
1 时钟空闲为高 在第一个下降沿采样
2 时钟空闲为低 在第二个下降沿采样
3 时钟空闲为高 在第二个上升沿采样
*/

#
<think> 嗯,用户需要查找基于江科大教程的STM32 SPI学习笔记。从引用资料来看,用户提供的两份笔记目录都明确提到了SPI相关内容,特别是引用[2]的11章完整覆盖了从协议基础到硬件软件操作的全流程。 用户可能是嵌入式开发者或电子专业学生,正在学习STM32外设通信。ta特意强调"基于江科大教程",说明需要与视频课程配套的实践资料。考虑到SPI是嵌入式开发的核心总线之一,用户应该急于上手实操W25Q64这类经典存储器。 注意到引用[2]的11-1到11-5小节结构非常清晰:先讲协议理论,再介绍FLASH存储器,接着通过软件模拟SPI深化理解,最后过渡到硬件SPI提升效率。这种从理论到实践的递进结构正是学习者需要的。 需要重点提取的关键内容有:SPI四线制工作原理(特别注意MOSI/MISO的时序关系)、W25Q64的页编程指令序列、CubeMX配置时钟极性的要点。用户大概率会马上动手实验,所以代码示例要确保完整可验证——比如那个等待FLASH就绪的while循环就很重要。 突然想到用户可能遇到电平转换问题,补充了硬件连接注意事项。另外江科大教程的特色是用逻辑分析仪抓波形,这个调试技巧也应该保留。最后主动提供扩展方向(DMA和中断)作为学习延伸点。 相关问题的设计要层层递进:从基础(协议本质)到应用(多设备管理),最后落到具体器件(OLED屏驱动),这样覆盖不同学习阶段的需求。 </think> 以下是基于江科大STM32教程的**SPI通信协议**核心学习笔记整理,结合引用内容梳理关键知识点: --- ### 一、SPI通信基础 1. **协议特点** - **全双工同步串行通信**(1主多从) - **四线制**: $SCK$(时钟)、$MOSI$(主机输出从机输入)、$MISO$(主机输入从机输出)、$NSS$(片选) - **时钟极性(CPOL)与相位(CPHA)** 决定数据采样边沿[^2] 2. **工作流程** ```mermaid graph LR A[主机拉低NSS] --> B[SCK输出时钟] B --> C[MOSI发送数据] C --> D[从机通过MISO回应] D --> E[主机释放NSS] ``` --- ### 二、W25Q64 Flash存储器操作 1. **芯片特性** - 64M-bit存储容量(8MB),支持 **SPI Mode 0/3** - **页编程**(256字节/页),支持扇区擦除(4KB)和整片擦除 2. **关键指令码**(HEX): ```c #define W25X_WriteEnable 0x06 // 写使能 #define W25X_PageProgram 0x02 // 页编程 #define W25X_ReadData 0x03 // 读数据 #define W25X_SectorErase 0x20 // 扇区擦除 ``` --- ### 三、软件SPI vs 硬件SPI | **实现方式** | **优点** | **缺点** | **适用场景** | |--------------------|--------------------------|-----------------------|---------------------| | **软件SPI** | 引脚灵活,协议可控 | 占用CPU资源,速度慢 | 时序调试/引脚冲突时 | | **硬件SPI** | 自动时钟生成,DMA支持 | 引脚固定 | 高速稳定传输 | > 注:硬件SPI需配置`SPI_InitTypeDef`结构体,启用`SPI_Cmd(SPIx, ENABLE)` --- ### 四、代码示例(硬件SPI写W25Q64) ```c // STM32硬件SPI发送单字节 void SPI_SendByte(uint8_t data) { while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET); // 等待发送缓冲区空 SPI_I2S_SendData(SPI1, data); while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); // 等待接收完成 SPI_I2S_ReceiveData(SPI1); // 清除接收标志 } // 页编程函数 void W25Q64_PageProgram(uint32_t addr, uint8_t *data) { W25Q64_WriteEnable(); // 写使能 SPI_CS_LOW(); // 片选使能 SPI_SendByte(W25X_PageProgram); // 发送页编程指令 SPI_SendByte((addr >> 16) & 0xFF); // 发送地址高字节 SPI_SendByte((addr >> 8) & 0xFF); SPI_SendByte(addr & 0xFF); for (int i = 0; i < 256; i++) SPI_SendByte(data[i]); // 写入数据 SPI_CS_HIGH(); // 片选关闭 W25Q64_WaitBusy(); // 等待编程完成 } ``` --- ### 五、调试要点 1. **逻辑分析仪使用**:捕获SCK/MOSI/MISO波形验证时序 2. **易错点**: - **NSS片选信号**未及时释放导致通信锁死 - **CPOL/CPHA配置错误**使数据采样错位 - 未执行**写使能指令**直接编程 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值