【铁头山羊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状态会自动和之前相同

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

相关推荐
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11013 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元3 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133973 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315203 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书3 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang3 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟3 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126913 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315203 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机