ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

spi通信及硬件实现

spi通信及硬件实现 STM32‑SPI 外设简介F103逐点解析STM32F103C8T6SPI1、SPI2 两个硬件 SPI 外设SPI1 挂载在 APB2 总线最大时钟 72MHzSPI2 挂载在 APB1 总线最大时钟 36MHz硬件收发电路减轻 CPU 负担硬件自动生成 SCK 时钟、移位收发比特不需要 CPU 循环翻转 IO对比软件模拟 SPI。CPU 只读写SPI-DR寄存器即可。可配置 8 位 /16 位数据帧、高位先行 / 低位先行W25Q64 Flash8 位帧高位先行 MSB由 CR1 寄存器DFF位控制 8/16bitLSBFIRST控制比特顺序。主机时钟频率\(f_{PCLK}/(2,4,8,16,32,64,128,256)\)只有主机模式有效从机 SCK 由外部输入分频设置无效。 SPI1PCLK272MHzSPI2PCLK136MHz。 例SPI1 分频 128 → SCK 72M /128 562.5kHz。支持多主机模型、主机 / 从机操作MSTR 位切换主机 / 从机。多主机模式多个 STM32 都可当主机硬件自带冲突检测实际工程极少用大多单主机。通信模式全双工、半双工、单工全双工MOSI、MISO 两根线同时收发最常用半双工 BIDI 模式只用一根 IO 线分时收发单工只接收不发送。支持 DMA可以 DMA 搬运数据数据收发不需要 CPU 干预大数据传输效率高CR2 寄存器 TXDMAEN、RXDMAEN 使能。硬件外设复用SPI / I2S同一个硬件外设既可以做 SPI也可以切换成 I2S 音频协议二选一不能同时用。考试 / 实验高频考点总结SPI1 在 APB2 (72M)SPI2 在 APB1 (36M)最大 SCK 时钟不一样。波特率分频只对主机生效从机不受 BR 分频位影响。W25Q64 配置8bitMSB 高位先行SPI 模式 0CPOL0CPHA0。硬件 SPI 对比软件 SPI软件 SPI 全部 GPIO 手动翻转硬件 SPI 外设接管 SCK/MOSI/MISO。同一个外设可切换 SPI/I2S二者互斥。容易混淆TDR、RDR 对外共用同一个地址SPI-DR写 填发送缓存读 拿接收缓存。标志位 SR 寄存器坑很多人只判断 TXE 就认为发送完成此时移位寄存器还在输出数据没发完。完整结束要看 BSY0。3. 控制寄存器 CR1 / CR2SPI_CR1主配置SPI_CR2中断、DMA 使能波特率发生器对 APB 总线时钟分频生成 SCK 串行时钟只有主机有效从机 SCK 由外部输入。4. 主机发送 1 字节完整流程写 DR 发送SPI 主机发送一个字节必然会收到一个字节。哪怕从机什么都不输出也会读到一个 dummy 哑字节。5. 高频易错考点6. 和软件模拟 SPI 对比SPII2C完整对比表格表格对比项USART (异步串口)SPII2C通信类型异步通信无时钟线约定波特率同步通信主机输出 SCK 时钟同步通信主机输出 SCL 时钟主从关系无主从对等通信两端各自生成时钟严格主‑从主机输出 SCK从机被动跟随严格主‑从主机输出 SCL靠 7/10 位地址寻址从机移位硬件发送移位、接收移位两套独立硬件收发共用同一个移位寄存器硬件内部集成移位逻辑不直接暴露给 CPU自动生成起始、停止、ACK 应答收发行为可只发不收、只收不发收发互不绑定发送必然伴随接收即使不需要接收也要读 DR 清标志否则 OVR 溢出SDA 双向一根线分时收发主机发地址从机应答多设备靠地址区分信号线TX、RX、GND最少 2 根交叉对接MOSI、MISO、SCK、NSS软件 NSS 最少 3 根SDA、SCL GND仅 2 根线必须上拉电阻帧格式8/9 位数据带起始位、停止位、校验位8/16 位高位 / 低位可选无起始停止位起始信号、从机地址 读写位、应答 ACK、数据字节、停止信号通信速率较低常用 9600‑115200最高数 Mbps很高SPI1 最高 72MHzSPI2 最高 36MHz标准 100kHz快速 400kHz高速模式最高几 MHz多设备扩展原生不支持多设备需要 RS485 等外部芯片NSS 片选线一主机挂多个从机依靠 I2C 地址一条总线最多挂载数十个从机电气特性推挽输出推挽输出开漏输出必须外接上拉电阻典型标志位TXE (发送寄存器空)、TC (发送完成)、RXNETXE (发送缓冲区空)、BSY (移位忙‑传输完成看 BSY)、RXNE无 DR 移位标志靠 EV 事件标志EV5/EV6/EV7 等典型外设GPS、蓝牙模块W25Q Flash、OLED 显示屏AT24C02 EEPROM、OLED、传感器考试 / 做题高频坑点总结简单记忆硬件 SPI vs 软件模拟 SPI重点坑点你之前记录软件 NSS 模式下拉高 PA4SS 片选硬件 SPI 不会自动把 MOSI (PA7) 置高电平。 MOSI 电平由 SPI 外设内部状态决定SS 引脚不控制 MOSI 引脚电平。 如果需要空闲时 MOSI 为高代码要手动处理不要指望拉高 NSS 自动完成。寄存器对应配置完之后两步必做W25Q 关键点记忆W25Q64SPI 模式 08bitMSB 高位先行软件 NSS。易错点SPI全双工一定同时收发写一个字节必然收到一个哑字节就算不需要接收也要读 DR 清除 RXNE 标志否则 OVR 溢出错误。串口是低位线行发送的是0X55的数据它读数据是从右往左SPI和I2C大多都是高位先行STM32 SPI 内部框图解析F1 系列这是 STM32 硬件 SPI 外设内部结构图全双工收发同时发生重点把数据流、寄存器、引脚梳理清楚。1. 外部 4 个引脚表格引脚作用MOSI主机输出从机输入MISO主机输入从机输出SCK串行时钟主机输出时钟从机接收时钟NSS片选硬件片选也可以软件 SSM 位用普通 GPIO 模拟片选左上角那个二选一开关主模式用 MOSI 输出、MISO 输入从模式两个引脚功能互换。2. 数据流向核心发送缓冲区、移位寄存器、接收缓冲区CPU写DR寄存器 → 发送缓冲区TDR → 移位寄存器 → MOSI引脚输出 同时 MISO引脚输入 → 移位寄存器 → 接收缓冲区RDR → CPU读DR寄存器⚠️ SPI全双工强制同步只要 SCK 输出 N 个时钟脉冲就一定同时发 N 位、收 N 位。不存在单纯 “只发不收”。发送缓冲区 TDRCPU 写SPI-DR就写入 TDR移位寄存器 Shift Reg真正一位一位往外挪比特的硬件LSBFIRST 控制低位先行还是高位先行接收缓冲区 RDR外部进来比特全部移入CPU 读SPI-DR读取 RDRTXE发送缓冲区空。发送缓冲区已经空可以写新数据进去。⚠️注意TXE 只代表缓冲区空移位寄存器可能还在往外发通信没结束RXNE接收缓冲区非空收到数据可以读 DR。BSY忙标志移位寄存器正在工作整个通信还没完成。BSY0 代表完整收发完成。SPESPI 使能开关硬件 SPI 总开关。MSTR1 主机模式0 从机模式。CPOL、CPHASPI 四种模式时钟极性、相位。BR[2:0]波特率分频APB 时钟分频生成 SCK 时钟。LSBFIRST0 高位先行1 低位先行。W25Q64 Flash 是高位先行。SSM软件从机管理SSM1打开软件 NSSNSS 引脚可以用作普通 GPIO。TXEIETXE 中断RXNEIERXNE 中断TXDMAEN / RXDMAEN发送、接收 DMA 使能。等待TXE 1发送缓冲区为空SPI-DR data把数据写入发送缓冲区 TDR硬件自动把 TDR 搬运到移位寄存器波特率发生器输出 SCK 时钟移位寄存器逐位从 MOSI 输出同时 MISO 逐位采样外部数据。8 个时钟脉冲结束移位寄存器收到外部字节搬运进接收缓冲区置RXNE1。如果要确认整个帧彻底发完等待BSY 0。读SPI-DR把收到的数据读走哪怕你不需要接收也要读清 RXNE 标志。TXE 仅仅代表发送缓冲区空移位寄存器还在发送BSY 才代表硬件是否正在传输。只写 DR 不读 DRRXNE 标志一直置 1溢出错误 OVR。W25Q 系列 FlashCPOL0,CPHA0高位先行。SSM 软件片选打开之后 NSS 引脚不再被 SPI 硬件接管完全交给 GPIO 代码控制高低电平。全双工模式 MOSI/MISO 同时工作半双工 BIDI 模式只用单根线收发。硬件 SPI移位寄存器、SCK 时钟硬件自动生成CPU 只读写 DR 寄存器软件模拟 SPI全部 IO 口电平由 CPU 循环翻转没有移位寄存器硬件。发送缓存区向一位寄存器发送数据一位一位从MOSI转出去发出去的同时从MISO接收数据等移位寄存器接收完整了再发到接收缓存区里至标志位为1然后再读取接收缓存区的数据USART / SPI / I2C 完整对比硬件框图核心特点USART发送CPU 写 DR → TDR 发送寄存器 →发送移位寄存器→ TX接收RX →接收移位寄存器→ RDR 接收寄存器 → CPU 读 DR收发两套移位硬件完全独立可以只发不收、只收不发。发送CPU 写 DR → 发送缓冲区 →共用移位寄存器→ MOSI接收MISO →共用移位寄存器→ 接收缓冲区 → CPU 读 DR单移位寄存器共用发 1bit 必然收 1bit不能只发不收。SDA双向数据线开漏输出SCL时钟线主机产生 SCL 时钟没有硬件移位寄存器暴露给 CPU硬件自动产生起始、停止、应答信号靠地址寻址从机。SDA 是双向同一根线既发又收开漏必须外部上拉电阻。USART发送完成看TCTXE 只是寄存器空不代表全部比特移出。收发硬件相互独立发送不会强制接收。SPI传输完成看BSY不要看 TXE发必收不读 DR 会 OVR 溢出推挽输出不需要上拉电阻。I2C只有两根线开漏必须上拉电阻靠地址区分从机不需要片选引脚硬件自动处理起始、停止、ACK 应答。USART异步、两根线、对等适合远距离。SPI高速、三四根线、共用移位寄存器发就必收适合板上高速外设。I2C两根开漏线、靠地址找设备速度慢适合多个传感器、EEPROM。补充 SPI每个从机需要单独 NSS 片选引脚I2C 不需要片选靠地址。 I2C 所有设备 SDA/SCL 并联在同一总线上。非连续传输时它在传完字节后会先等RXNE也置为一再读下一个连续的是当它TXE1后直接向发送寄存器存入下一个硬件spi的接线情况SPI1软件 NSS 模式SSM1引脚配置梳理硬件 SPI1PA4‑NSSPA5‑SCKPA6‑MISOPA7‑MOSI软件片选模式引脚模式PA4 SS(NSS)普通推挽输出GPIO_Mode_Out_PP不归 SPI 硬件管理完全软件手动拉低 / 拉高做片选对应寄存器CR1‑SSM1软件从设备管理开启PA5 SCK、PA7 MOSI复用推挽输出GPIO_Mode_AF_PP交给 SPI 外设硬件接管硬件自动输出 SCK 时钟、MOSI 串行比特。PA6 MISO上拉输入GPIO_Mode_IPU外部从机的数据送到 MISO 引脚SPI 硬件内部自动采样读取电平。软件模拟 SPI4 根引脚全部配置普通 GPIO所有时序、高低电平全部由 CPU 代码手动翻转。CPU 负担大。硬件 SPI软件 NSSSCK/MOSI/MISO 交给外设复用模式只有 NSS (PA4) 保留普通 GPIO软件手动控制。时钟、移位、采样全部硬件自动完成。CR1‑SSM 1软件 NSS 模式NSS 引脚变成普通 GPIO硬件不再接管 NSS 功能。CR1‑MSTR 1主机模式。CR1‑SPE 1SPI 使能打开。SPI_InitTypeDef SPI_InitStructure; SPI_InitStructure.SPI_Mode SPI_Mode_Master; // 主机模式 MSTR1 SPI_InitStructure.SPI_Direction SPI_Direction_2Lines_FullDuplex;// 双线全双工 MOSIMISO SPI_InitStructure.SPI_DataSize SPI_DataSize_8b; // 8位数据帧 SPI_InitStructure.SPI_FirstBit SPI_FirstBit_MSB; // **高位先行MSB**W25Q要求 SPI_InitStructure.SPI_BaudRatePrescaler SPI_BaudRatePrescaler_128; // PCLK2/128SPI1时钟72M/128 SPI_InitStructure.SPI_CPOL SPI_CPOL_Low; // CPOL0空闲时SCK低电平 SPI_InitStructure.SPI_CPHA SPI_CPHA_1Edge; // CPHA0**第一个时钟边沿采样数据 → SPI模式0** SPI_InitStructure.SPI_NSS SPI_NSS_Soft; // ✅软件NSS模式SSM1NSS引脚交给普通GPIO软件控制 SPI_InitStructure.SPI_CRCPolynomial 7; // CRC多项式不用CRC时该值无效随便写 SPI_Init(SPI1, SPI_InitStructure);结构体的初始化每个成员含义SPI_Mode_Master主机模式内部波特率发生器工作输出 SCK 时钟。SPI_Direction_2Lines_FullDuplex双线全双工MOSI、MISO 都启用最常用。SPI_DataSize_8b每次传输 8bit 字节可选 16b。W25Q Flash 固定 8bit。SPI_FirstBit_MSB高位先发送W25Q 必须 MSBLSB 为低位先行。SPI_BaudRatePrescaler_128波特率分频仅主机生效。SPI1 挂载 APB2 (72MHz)72M/128。可选2,4,8,16,32,64,128,256。CPOL CPHA→ 决定 SPI4 种模式CPOL_Low(0)SCK 空闲为低CPHA_1Edge(0)第一个边沿采样→SPI 模式 0Mode0W25Q64、大部分 SPI Flash 使用。SPI_NSS_Soft软件 NSS 模式对应寄存器SSM1。NSS (PA4) 不再由 SPI 硬件接管由你代码手动置 0 / 置 1 做片选。如果写SPI_NSS_Hard就是硬件 NSS 模式硬件自动驱动 NSS 引脚工程很少用。SPI_CRCPolynomialCRC 校验多项式不用 CRC 功能该字段不起作用。SPI_Cmd(SPI1,ENABLE);使能 SPI 外设SPE 位置 1初始化 GPIOPA4 (NSS)普通推挽输出PA5 (SCK)、PA7 (MOSI)复用推挽输出 AF_PPPA6 (MISO)上拉输入 IPUSPI_NSS_Soft只是把 NSS 交给软件不会自动操作 PA4 引脚电平需要你自己写GPIO_SetBits / ResetBits。CRC 那个参数不用管即使填 7 也不会开启 CRC需要另外寄存器开启 CRCEN。波特率分频只对主机生效从机此配置无效等待数据txe是1写入数据等待rxne是1读取数据。不需要手动清除标志位
返回列表