STMCU小助手
发布时间:2022-5-8 18:00
|
前言 SPI 是Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是 Motorola 首先在其 MC68HCXX 系列处理器上定义的。SPI 接口主要应用在 EEPROM,FLASH,实时时( _4 Q6 P1 ?5 x& I0 L: e7 G! Y 钟,AD 转换器,还有数字信号处理器和数字信号解码器之间。SPI,是一种高速的,全双工, 同步的通信总线。( A7 ^' E) M) O+ j0 K Y3 t8 b 本文参考正点原子SPI实验,使用STM32自带SPI来实现对外部FLASH(W25Q64)的读写。 SPI 接口一般使用 4 条线通信: MISO 主设备数据输入,从设备数据输出。 MOSI 主设备数据输出,从设备数据输入。 SCLK 时钟信号,由主设备产生。 CS 从设备片选信号,由主设备控制。 ) k; Y( Z0 F; w9 O
1 ]5 S+ J7 r1 s3 `: Y7 I SPI 时钟最多可以到 18Mhz,支持 DMA,可以配置为 SPI 协议或者 I2S 协议(仅大容量型号支持)。 特点9 a0 ~4 j: a: I, Y* r) G. o; d 可以同时发出和接收串行数据;可以当作主机或从机工作;提供频率可编程时钟;发送结束中断标志;写冲突保护;总线竞争保护等。7 s2 _. `3 C+ j* b& o8 E+ f , W) N; |( j( `4 R3 n. w 配置步骤 SPI 相关的库函数和定义分布在文件 stm32f10x_spi.c 以及头文件 stm32f10x_spi.h 中 - v c4 d; b" Q9 v2 T 1)配置相关引脚的复用功能,使能 SPI1 时钟! |$ j9 L" C2 _% H 6 d) {- m+ Y( e3 [; ? C0 H 第一步使能SPI1时钟,SPI1 的时钟通过 APB2ENR 的第 12 位来设置。设置 SPI1 的相关引脚为复用输出,这样才会连接到 SPI1 上否则这些 IO 口还是默认的状态,也就是标准输入输出口。! S! t1 b+ M" C, `9 V! k 2)初始化 SPI1,设置 SPI1 工作模式# {7 P0 O% Y0 [ 设置 SPI1 为主机模式,设置数据格式为 8 位,然设置 SCK 时钟极性及采样方式。并设置 SPI1 的时钟频率(最大 18Mhz),以及数据的格式(MSB 在前还是LSB 在前)。, H F/ P" S' t* I: E ! l3 W* S% H0 ]* k+ {5 J" a4 W void SPI_Init(SPI_TypeDef* SPIx, SPI_InitTypeDef* SPI_InitStruct);* w6 n7 \" h& R( h, g 3)使能 SPI1& M: C2 ]2 B- x1 J2 G t/ Z) K 5 T5 j% b1 B1 S; K" D7 v( v, g SPI_Cmd(SPI1, ENABLE); //使能 SPI 外设. ^$ c- q6 ]5 V2 [" C' d U 4)SPI 传输数据 6 f. f6 {4 Y3 E! L: Z0 k void SPI_I2S_SendData(SPI_TypeDef* SPIx, uint16_t Data); 5)查看 SPI 传输状态 ) p- n1 V" x0 Y SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE);- D3 N7 u) N6 y! z5 W$ |8 A3 \/ c . c7 t% P% m0 S SPI特征 ● 3线全双工同步传输( w1 |1 X3 p! S% n ● 带或不带第三根双向数据线的双线单工同步传输. [6 F+ p u8 ^0 V% e7 J" h ● 8或16位传输帧格式选择 ● 主或从操作 ● 支持多主模式2 i/ U/ }6 h/ u) K- E$ D5 r ● 8个主模式波特率预分频系数(最大为fPCLK/2)+ W5 ?* m, @$ V' F, a ● 从模式频率 (最大为fPCLK/2) ● 主模式和从模式的快速通信4 d4 U7 W; l* N4 N2 m! l9 o ● 主模式和从模式下均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变 ● 可编程的时钟极性和相位 ● 可编程的数据顺序,MSB在前或LSB在前 ● 可触发中断的专用发送和接收标志, r+ ^) |8 w4 ^8 ~0 f I1 _ ● SPI总线忙状态标志 ● 支持可靠通信的硬件CRC- W; J @5 s0 H ─ 在发送模式下,CRC值可以被作为最后一个字节发送SPI接口! m: U5 b( x, S9 Y* g& _& d: o+ X- e ─ 在全双工模式中对接收到的最后一个字节自动进行CRC校验' s) e) G; w4 G6 x9 m& z/ D( d, N; m ● 可触发中断的主模式故障、过载以及CRC错误标志% c# V, `" V, ] ● 支持DMA功能的1字节发送和接收缓冲器:产生发送和接受请求3 b" v5 i% t. T6 x: t ( s+ b1 {% D: ^1 Y& I# R I2S功能 ● 单工通信(仅发送或接收) ● 主或者从操作 ● 8位线性可编程预分频器,获得精确的音频采样频率(8KHz到96kHz) ● 数据格式可以是16位,24位或者32位( k2 T0 O3 L1 r ● 音频信道固定数据包帧为16位(16位数据帧)或32位(16、24或32位数据帧) ● 可编程的时钟极性(稳定态) ● 从发送模式下的下溢标志位和主/从接收模式下的溢出标志位 ● 16位数据寄存器用来发送和接收,在通道两端各有一个寄存器6 t: } E& Q' e F5 } t ● 支持的I2S协议:; L0 H% J0 Y) p$ Z- s- o ─ I2S飞利浦标准. @$ ^1 v, B0 j5 }4 v ─ MSB对齐标准(左对齐)) I1 r u4 ]" |0 w; e ─ LSB对齐标准(右对齐) ─ PCM标准(16位通道帧上带长或短帧同步或者16位数据帧扩展为32位通道帧)% w9 O/ c' M6 S8 V5 I O ● 数据方向总是MSB在先9 a: D% [& g/ ^ ● 发送和接收都具有DMA能力 ● 主时钟可以输出到外部音频设备,比率固定为256xFs(Fs为音频采样频率)5 I1 C2 m( D. _: d$ ^* X5 w ● 在互联型产品中,两个I2S模块(I2S2和I2S3)有一个专用的PLL(PLL3),产生更加精准得时钟4 ?) a5 m/ M7 x
{% }2 M2 q; t, l5 e |
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
SPI 32位宽DMA方式收发失败问题
SPI 高温读错最后一位?STM32F42xx 官方根治方案
经验分享 | LAT1470 SPI传输长度超过1024时出现异常的问题分析
经验分享 | 使用EXIT0同步触发SPI的DMA发送话题
经验分享 | STM32H723 SPI 通讯异常排查:实时观察窗口的 “隐形干扰” 解决方案
【STM32C0评测】4、驱动Lorasx126x,实现透传
经验分享 | STM32 SPI半工单线通信示例
经验分享 | 多个SPI的DMA传输为何仅1个有效?
经验分享 | STM32C0 HAL 库的 SPI 驱动导致的 Hardfault 问题分析
微信公众号
手机版