SPI通讯协议

---------------------SPI--------------------------
1.标准SPI通信
IO口模拟时序
2.STM32F411 SPI控制器原理
3.SPI模块的配置---寄存器

---------------------------------------------------

1.标准SPI通信
SPI:串行外部设备接口----通信接口
特点:高速同步串行全双工通信 40M
硬件连线: 4线制
SCL :时钟线--------------------由主机发出
MOSI:主机输出从机输入
MISO:主机输入从机输出
CS :片选线,拉低有效--------起始信号
数据传输:
片选低 +数据位 +片选
MCU控制: 片选、时钟
数据位:8 /16位 //取决于从器件支持
MSB 在前 LSB 在前 //取决于从器件支持
传输过程:
1、MCU选中芯片
2、传输数据
3、MCU释放芯片

四种不同的模式: //取决于从器件支持
时钟极性:时钟线空闲状态电平 高 低
时钟相位:
0:表示在时钟线的第一个跳变沿数据采样(第二个跳变沿写数据)
1:表示在时钟线的第二个跳变沿数据采样(第一个条边沿写数据)

①时钟极性为0,时钟相位为0 ---------------上升沿采样
②时钟极性为0,时钟相位为1 ---------------下降沿采样
③时钟极性为1,时钟相位为1 ---------------上升沿采样
④时钟极性为1,时钟相位为0 ---------------下降沿采样

时序:
对于SPI通信:
发送一位数据一定会接收到一个位数据; //接收到数据可以不要
接收一位数据一定要先发出去一位数据 //可以随便发数据

①时钟极性为0,时钟相位为0 //SCL_L
先发高位
时钟线出现上升沿时,数据线保持稳定,此时是数据采样
时钟线出现低电平沿时,数据线发生改变,此时写数据
SCL_L; //时钟线拉低 为了改变数据线
if(data & 0x80) MOSI_H;else MOSI_L;
SCL_H; //出现上升沿从机读数据
data <<= 1;
if(MISO) data |= 0x01;
②时钟极性为0,时钟相位为1 //SCL_L
SCL_H; //时钟线拉高 为了改变数据线
if(data & 0x80) MOSI_H;else MOSI_L;
SCL_L;
data <<= 1;
if(MISO) data |= 0x01;
③时钟极性为1,时钟相位为1 //SCL_H
SCL_L;
if(data & 0x80) MOSI_H;else MOSI_L;
data <<= 1;
SCL_H;
if(MISO) data |= 0x01;
④时钟极性为1,时钟相位为0 //SCL_H
SCL_H;
if(data & 0x80) MOSI_H;else MOSI_L;
data <<= 1;
SCL_L;
if(MISO) data |= 0x01;

注意:
因为发一位数据同时也会收一位数据,收一位数据之前一定是发一位数据
所以将收发写为一个函数
u8 spi_byte(u8 data)
{
for(i = 0;i < 8;i++)
{
SCL_L;
if(data & 0x80) MOSI_H;else MOSI_L;
SCL_H;
data <<= 1;
if(MISO) data |= 0x01;
}
SCL_L;
return data;
}
收一个数据时要在参数发一个数据;具体发什么根据器件要求(W25Q64随便发数据)
发一个数据是,一定会返回一个数据,但是不需要接收。






2.STM32F411 SPI模块原理


2.SPI框图
MOSI
MISO
SCK: 时钟线
发出:当此设备为主机模式时发送时钟信号
速度:通过SPI_CR1寄存器的BR0~BR2位配置
接收:当此设备为从机模式时接收时钟脉冲
NSS:动态切换主从模式操作, //不是片选线
多路选择器: 配置主模式还是从模式
有两种配置方式:
软件配置:通过SSI位写1 为主模式,写0为从模式
硬件配置:通过NSS引脚高电平为主模式,低电平为从模式
方式的选择由SSM这位来决定
写1:选择软件方式
写0:选择硬件方式 -----NSS管脚


3.相关寄存器
CR1:
15位: 全双工-----------0
14位: 跟上一位有关系,如果上一位选择1,需要配置此位,上一位选择0,此位无意义
13位: 禁止-------------0
11位: 数据帧格式8位----0 //w25q64数据帧格式是8位的
10位: 全双工-----------0
9位 : 软件从器件-------1
8位 : 主机模式 -------1 //相当于NSS管脚 NSS输出1为主机模式
7位 : 先发高位---------0
6位 : SPI使能----------1 //放在最后
5 4 3 配置速度--------4分频 //根据通信对象
2位 : 主模式-----------0
1位 : 时钟极性 4个模式 //
0位 : 时钟相位

CR2:
4位 : 摩托罗拉格式&TI格式-------0 //以前没有TI格式
2位 :多主模式使用 //我们暂不需要
SR :
7位 :忙标志 //由硬件清零置1
6位 :来的数据没有读走
1位 :如果为1,说明发完了
0位 :如果为1,说明收到了数据
DR :
如果配置的八位数据,就低八位有效,
如果配合的十六位数据帧格式,就16位有效
CFGR:
11位: 选择SPI模式---------0


3.SPI模块的配置
IO口配置
时钟使能
模式------复用功能
//记得配置片选线
SPI控制器配置
模块时钟使能 //总线提供时钟源
CR1
CR2
CFGR:
------------------------------

通过原理图可知:
SCK :
MOSI:
MISO:



SPI初始化函数:
SPI发送接收字节函数
u8 SPI_byte(u8 data)
{
//等待发送完成状态寄存器1位置1
while((SPI1->SR & 1 << 1) == 0);
//把数据给DR寄存器
SPI1->DR = data;
//检测接收完成状态寄存器的0位置1
while((SPI1->SR & 1 << 0) == 0);
return SPI1->DR;
}

















 

posted @ 2019-03-15 23:07  一人之下冯宝宝  阅读(637)  评论(0编辑  收藏  举报