第三章-SPI协议
3.1-协议概述
这是SPI的一种接线方式(多NSS方式)

- SCLK,时钟信号,时钟频率即SPI速率,和SPI模式有关
- MOSI,数据主机输出,数据从机输入
- MISO,数据主机输入,数据从机输出
- CS,从机设备选择,低电平有效
物理层的四种工作模式
那么要完成通信,就要规定主机什么时刻去读取从机数据,决定他们的主要是总线空闲是SCK的时钟状态 以及数据采样时刻 ,分别是"时钟极性CPOL "和"时钟相位SPHA"概念
时钟极性CPOL:总线空闲时候SCK的时钟状态
CPOL:0 表示SCK在空闲状态是为低电平
CPOL: 1 表示SCK在空闲状态是高电平
时钟相位SPHA:数据采样时刻
SPHA: 0 表示奇数边沿采样,及在SCK第一个边沿时输入 输出数据有效
SPHA: 1表示偶数边沿采样,及在SCK第二个边沿时输入输出数据有效
如图这是一种模式

所以根据时钟相位和极性共有四种组合--四种模式不需要记住

3.2-STM32的SPI外设
STM32SPI的特性

SPI的硬件接口

一般

这是举例的一种SPI通信方式
可以看出SPI必须是收发同时进行的,在收的时候必须要发出去数据,在发的时候也必须接收到数据
NSS引脚就使用普通的GPIO 就可以了

使用SPI 要注意按照从机的要求进行设置
- SPI的模式 是那个0-3
- MSB先行 还是LSB先行(高位在前还是低位在前)
- 通信速率是多少HZ,
- 数据帧长度是8位还是16位
3.3-PS2游戏手柄介绍
手柄引脚介绍:
引脚和直接介绍的功能都是相同的

通信协议--下面是PS2手柄的介绍,我看看如何分离出关键信息
通信时序图-如图

这是通信时序图,我们可以通过通信时序图获得一下信息
- 时钟线空闲时为高电平,所以时钟极性为1 (CPOL: 1 )
- 在时钟第一个边沿采样,是在奇数边沿采样,所以时钟相位为0(SPHA: 0 )
下面是具体协议内容介绍

通信过程解释:
-
每次通信都是9个字节,每个字节是八位,每个字节代表的意义如图
过程如下
单片机要读或者写手柄数据,先把CS线拉低
单片机发出命令"0x01",手柄现在回复空;表示意思单片机要发起通信
手柄回复ID(0x41绿灯模式,0x73红灯模式),单片机发送0x42;请求数据
手柄发出0x5A,单片机发空;表示数据来了
然后单片机发"WW"设置手柄电机,手柄发送data(这个data里面是一些按键状态)
然后单片机发送"YY"设置手柄电机,然后手柄发送data(这个data里面是一些按键状态)
然后单片机空,手柄发送data(这个data里面是一些按键状态,这个里面根据模式,可能是模拟值)
然后单片机空,手柄发送data(这个data里面是一些按键状态,这个里面根据模式,可能是模拟值)
然后单片机空,手柄发送data(这个data里面是一些按键状态,这个里面根据模式,可能是模拟值)
然后单片机空,手柄发送data(这个data里面是一些按键状态,这个里面根据模式,可能是模拟值)
下面是通信的其他部分

3.4-STM32-SPI

7.分频这个要根据从机设置如图,PS2的时钟频率为:

时钟来源为:


最大的速率18MHZ

然后我们初始化一个引脚设置为输出

顺便输出化串口一方便调试

添加一个PS2_SPI.h和PS2_SPI.c
实际数据是低位在前的也就是LSB先行
SPI 的先做到这里,目前进度
- 发现逻辑分析仪设置低位先行,才能正确解析单片机先手柄发送的命令,所以判断他们的通信是低位先行的,所以我已经更改了CUBMXS的设置。
- 还有分析逻辑分析仪,为什么不能解析到手柄发给单片机的 ID命令(比如红灯0X73)或者是命令0X5A 二是总是相差一个位,好像现在采集的向右移动就是了