目录
[2.比特位传输顺序(MSB First/LSB First)](#2.比特位传输顺序(MSB First/LSB First))
一、总线结构

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状态会自动和之前相同
有时候出现问题,将这串代码写两编就可以了:

