【铁头山羊STM32】HAL库 5.SPI部分

目录

一、总线结构

1.MOSI

2.MISO

3.SCK

4.NSS

比如让主机和从机1通信:

二、5个参数

1.波特率

[2.比特位传输顺序(MSB First/LSB First)](#2.比特位传输顺序(MSB First/LSB First))

3.数据位长度(8位/16位)

4.时钟的极性

5.时钟的相位

三、按钮实验

我们要实现:

代码实现:

实验操作:

最终编译的代码如下:

四、外部flash实验

Flesh模块介绍:

我们进行实验,

SPI的工作模式:

在配置界面,我们可以发现:

五、flash数据存取

学习三个接口:

​编辑

1.发送数据​编辑

2.接收数据

3.发送数据同时接收数据

Flesh

写代码

1.写使能

2.扇区擦除

4.页编程


一、总线结构

SPI是I2C总线的富哥版本,I2C是半双工,SPI是全双工,

常用于摄像头模块、外接flesh模块这些需要高速、双向传输数据的模块。

1.MOSI

2.MISO

3.SCK

时钟频率决定着通信速度的快慢

4.NSS

比如让主机和从机1通信:

(此例中,MOSI和MISO传输的数据均为假设,且相互间没有联系)


二、5个参数

1.波特率

(在手册里看)

2.比特位传输顺序(MSB First/LSB First)

3.数据位长度(8位/16位)

上下两条波形完全一致,但发送过程有所区别

一般用上面

4.时钟的极性

5.时钟的相位


三、按钮实验

我们要实现:

当按下按钮时刻,LED没有反应,

当松开按钮时刻,LED发生变化。

因此我们应该捕获的是按钮发生变化的瞬间。

代码实现:

设置两个变量,

cur和pre,

一前一后记录电位的变化,

当per不等于cur时,即为按钮发生变化的时刻,

cur为0、 pre为1时则表示按下瞬间,

cur为1、pre为0时则表示松开瞬间:

实验操作:

依次在CubeMX中点击:型号------设置调试接口------设置PC13板载LED------

PA0------input------pullup(输入上拉)

如何实现LED的亮灭?

有时候按按钮时,会发现操作失灵,这是按键抖动引起的:

最终编译的代码如下:

烧录完成后可以得到按钮最后一次改变,带动了灯的改变。


四、外部flash实验

Flesh模块介绍:

Flesh模块相当于一块移动硬盘,存储在这里的数据,掉电后不会丢失。

我们进行实验,

将LED的亮灭状态保存在flesh中,

使得开发板断电再重新上电后,

灯的亮灭状态不改变。

模块的接口及其接线方式如下:

(其实可以发现这个接线有一个有趣的地方:双方接口名的最后一个字母均相同)

打开上次的inc文件:

可以发现,我们的单片机有两个SPI接口:

随便选择一个,有一个

SPI的工作模式:

通常从机编程比主机更加复杂,绝大多数情况下,选择第一种

此时,下面出现一个新选项:

选择Disable。

右侧可以看到已经被分配好的三个引脚DI、CLK、DO:

但还有一个CS没有配置,我们需要手动的将PA4设置为NSS:

按照接线图接线:

在配置界面,我们可以发现:

在flash手册中,随便点开一张图可以看到:

它总是以一字节传输数据,

所有我们进行如下设置:


五、flash数据存取

学习三个接口:

1.发送数据

在keil的c代码中可以看到Cube已经给我们生成了一个句柄:

例:

向NSS发送低电压,表明选中1号从机

2.接收数据

为什么要给dataRcvd赋初值?

让MOSI一直保持高电压,

MISO接收到的数据又会缓存到dataRcvd。

3.发送数据同时接收数据

Flesh

写代码

这里有私有函数声明,所有我们要把我们的函数声明写入这对begin、and间:

然后我们要把上面函数的实现,写在下面这个位置:

打开我们的flesh芯片手册,查找我们每一步的命令:

1.写使能

在第20页,我们可以看到写使能的指令码是0x06,我们只需要向从机发送0x06即可

2.扇区擦除

手册35页

可知扇区擦除的指令码为0x20

4.页编程

手册33页

可以看到页编程的指令码是0x02(02h)

当按钮抬起时,切换LED灯的亮灭状态后,我们还需要保存LED灯的亮灭状态

每当单片机上电时,我们需要从flesh中读出它,恢复LED之前状态

然后要对函数进行实现,

手册23页

单品机上电------从flesh读数据------恢复LED状态

烧录-复位-重新上电

之后就会发现重新上电后,LED状态会自动和之前相同

有时候出现问题,将这串代码写两编就可以了:

相关推荐
半杯咖啡半行码13 小时前
STM32之ARM通用汇编指令详解:从指令格式到寻址方式
汇编·arm开发·stm32
创界工坊工作室14 小时前
22-基于STM32的汽车防盗系统设计
stm32·单片机·嵌入式硬件·proteus
雨田言炎16 小时前
STM32之RCC系统时钟控制(芯片的心脏控制器)
stm32·单片机·嵌入式硬件
李永奉16 小时前
日常使用的锂电池上,新、旧锂电池的差异分析
单片机·嵌入式硬件·物联网·智能手机·电脑
额额额对了17 小时前
IMX6ULL 杂项设备 LED 驱动
stm32·单片机·嵌入式硬件
长春的KAKA18 小时前
Proxmark3 Iceman分支CLI命令总表
嵌入式硬件
半杯咖啡半行码18 小时前
STM32开发之IIC通信详解:从协议基础到FM24CL04实战
stm32·单片机·嵌入式硬件
硅基手札19 小时前
【I2C 技术系列 05】I2C 多主仲裁与时钟同步
驱动开发·stm32·单片机·嵌入式硬件·mcu·计算机外设
szxinmai主板定制专家19 小时前
面向虚拟电厂协调控制:RK3588+FPGA+AI边缘控制器设计思路与算力评估
人工智能·嵌入式硬件·fpga开发·机器人·jetson·zynq·振动采集
Zw-awa19 小时前
DO 和 AO 到底怎么选:比较器替你决定了什么
stm32