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

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

相关推荐
蓬荜生灰2 小时前
STM32(5)-- 新建寄存器版工程
stm32·单片机·嵌入式硬件
萧技电创EIIA2 小时前
基于stc12单片机的双轴舵机太阳能追光系统设计与实现
单片机·51单片机·硬件工程·pcb工艺
大神与小汪2 小时前
STM32上进行Unix时间戳转换
stm32·嵌入式硬件·unix
嗯嗯=2 小时前
STM32单片机学习篇1
stm32·单片机·嵌入式硬件
恶魔泡泡糖2 小时前
51单片机I-O扩展2
单片机·嵌入式硬件·51单片机
lohiecan3 小时前
SD2小电视真正产品级项目-梦丘MOS固件
单片机
梁洪飞3 小时前
kernel 内存知识
linux·arm开发·嵌入式硬件·arm
纳祥科技4 小时前
硬核拆解:一款DP转3VGA+音频输出分配器,3屏同步输出
单片机·嵌入式硬件·音视频·拆解
ElfBoard4 小时前
ElfBoard技术贴|如何在ELF-RK3506开发板上构建AI编程环境
c语言·开发语言·单片机·嵌入式硬件·智能路由器·ai编程·嵌入式开发