GD32系列笔记三:模拟SPI通信

目录

一、项目需求

二、SPI简介与通信原理

三、XL74HC165介绍

四、程序设计

五、总结


一、项目需求

GD32F150RCT6与PC的几十个按键通信,查询按键状态,当有按键被按下时触发蜂鸣器,并把按键的状态和编号返回给PC。为了节省IO口,把所有按键的信号通过XL74HC165芯片转成串行信号,用spi的协议传输给GD32。托硬件设计方案的福,一会用硬件SPI一会用模拟SPI,来回变动几次,于是把软、硬SPI都测试写了。这里先放出模拟SPI的配置。

二、SPI简介与通信原理

1. SPI介绍:SPI 是英语 Serial Peripheral interface 的缩写,顾名思义就是串行外围设备接口。是一种高速、全双工,同步的通信总线。

2. 提供时钟的为主设备(Master),接收时钟的设备为从设备(Slave)。

3. SPI通信有4条线,单向通信时3条线,少了一条数据线,分别是:

MOSI: 主设备数据输出,从设备数据输入

MISO: 主设备数据输入,从设备数据输出

SCLK: 时钟,由主设备发出

CS: 片选,使能片选时,主机对从机的操作才有效。一般情况片选信号为低电平有效,具体要看通信芯片的规格书。

4. 物理接线图

5. SPI通信原理

(1)主机使能片选CS信号(一般是拉低),启动通信

(2)主机向从机发送时钟信号,告诉从机开始读写操作

(3)主机将要发送的数据写到发送缓冲区memory,缓冲区经过移位寄存器(缓存长度不一定,看单片机配置)串行移位寄存器通过MOSI线将字节一位一位的传给从机,同时MISO也将接收到的数据经过移位寄存器一位一位的移到接收缓冲区

(4)从机(Slave)也将自己的串行移位寄存器(缓存长度不一定,看单片机配置)中的内容通过MISO信号线返回给主机。同时通过MOSI信号线接收主机发送的数据,这样,两个移位寄存器中的内容就被交换

(5)SPI只有主模式和从模式之分,没有读和写的说法,外设的写操作和读操作是同步完成的。若只进行写操作,主机只需忽略接收到的字节(虚拟数据);反之,若主机要读取从机的一个字节,就必须发送一个空字节来引发从机的传输。也就是说,你发一个数据必然会收到一个数据;你要收一个数据必须也要先发一个数据。

6. SPI的模式

(1)时钟极性:CKP或CPOL

  • CPOL= 0:表示当SCLK=0时处于空闲态,所以有效状态就是SCLK处于高电平时
  • CPOL= 1:表示当SCLK=1时处于空闲态,所以有效状态就是SCLK处于低电平时

(2)时钟相位:CKE或者PCHA

  • CPHA=0:在时钟的第一个跳变沿(上升沿或下降沿)进行数据采样。在第2个边沿发送数据
  • CPHA=1:在时钟的第二个跳变沿(上升沿或下降沿)进行数据采样。在第1个边沿发送数据

(3)根据时钟极性和时钟相位的排列组合,SPI的模式有四种

        Mode0:CPOL=0,PCHA=0:当空闲态时,SCK处于低电平,数据采样是在第1个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在上升沿(准备数据),(发送数据)数据发送是在下降沿。
        Mode1:CPOL=0,PCHA=1:当空闲态时,SCK处于低电平,数据发送是在第2个边沿,也就是SCK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。
        Mode2:CPOL=1,PCHA=0:当空闲态时,SCK处于高电平,数据采集是在第1个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。
        Mode3:CPOL=1,PCHA=1:当空闲态时,SCK处于高电平,数据发送是在第2个边沿,也就是SCK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

举例mode0:

7.参考​​​​​​
http://t.csdn.cn/y10M7

http://t.csdn.cn/b67yS

三、XL74HC165介绍

1.芯片数据手册信息提取

 

 

由数据手册可总结出的信息:

(1)时钟有效:时钟上升沿有效,且当SH/LD保持高,CLK INH为低;

(2)数据加载: SH/LD为低时,并行数据加载进A-H寄存器,此时不用管CLK、CLK INH的电平高低;当 SH/LD为高时,禁止并行数据加载;

(3)芯片时钟使能:当CLK INH为低时,CLK使能;当CLK INH为高时,CLK失能。

(4)最后一张图片有两个信息:

          时芯片支持的时钟频率:根据项目实际工矿,vcc=3.3V, 工作温度70度左右,选择配置SPI的时钟频率小于18MHZ,模拟SPI不用考虑这一点。

         时序上各个信号的脉冲保持时间、相移时间有说明,这个模拟SPI需要看看,这种ns级别的延时一个_nop()即可,实测GD32F150C8T6的空指令周期为200ns,而表格数据结合实际项目只需100ns左右的延时,空指令完全满足需求。

四、程序设计

(1)明确一点,模拟SPI的意思是是要去模拟一个配合74HC165芯片的时序的单片机外设,恰好165芯片的时序用的是SPI,所以叫模拟SPI,如果与单片机通信的芯片是IIC协议,那就叫模拟IIC.

(2)程序流程图

(3)源码

 

 

(4)源码说明

         初始化IO口,使能时钟用的RCC_GPIOx和模式配置的GPIOx名字不能搞混,使能两个IO时不可以用RCC_GPIOA | RCC_GPIOB 的方式,否则编译有警告,实际执行也有问题,原因暂时没有去深究。

五、总结

         1. SPI是全双工、同步的通信总线,物理接口是四线制的,单向通信时只用到条三线,通信方式是主从模式,谁发出时钟谁是主机。

         2 .SPI可以选择2种时钟极性和2种时钟相位,可以组合出4种通信模式,不同模式之间有两种不同之处:一是时钟空闲电平的高低不同,二是开始采用和发送的时钟边沿不同,其实就是采样和发送的先后顺序不同。

        3. XL74HC165是并转串的芯片,每个芯片可以把8个物理按键信号进行并行写入,串行输出出到单片机,节省了大量IO口,该芯片时序采用SPI的协议。

        4. 为了提高程序的实时性,使用了定时器溢出计数+状态机的方式做蜂鸣器延时,而不是开发板DEMO里的delay()函数。这是第一次使用状态机emmmmmm.....

### 模拟 SPI 串行外设接口 #### 使用软件实现 SPI 接口的方式 当硬件资源有限或特定应用场景下无法使用专用的SPI控制器时,可以通过通用输入/输出(GPIO)来模拟SPI的操作。这种方式通常被称为Bit-Banging。 在STM32微控制器系列中,如果想要通过GPIO端口来仿真SPI通信,则需要手动控制MOSI(Master Out Slave In), MISO (Master In Slave Out),SCK(Serial Clock) 和NSS(Chip Select,也称为Slave Select)[^3]这四个信号线的状态变化以完成数据交换过程。 对于发送方而言,在每个时钟周期内改变SCK引脚电平的同时更新MOSI上的位值;接收方则是在检测到SCK边沿触发后读取当前时刻MISO线上所携带的信息比特。为了保持兼容性和可靠性,建议严格按照目标器件的数据手册规定的时间参数编程这些IO操作序列[^1]。 下面给出一段简单的C语言伪代码用于演示如何利用GPIO库函数构建一个基本版本的软件SPI写入功能: ```c void Soft_SPI_Write(uint8_t data){ uint8_t i; GPIO_SetBits(GPIOn, NSS_PIN); //拉高片选使能芯片 for(i=0;i<8;i++){ if(data & 0x80){ //判断最高位是否为1 GPIO_SetBits(GPIOn, MOSI_PIN); }else{ GPIO_ResetBits(GPIOn, MOSI_PIN); } GPIO_ToggleBits(GPIOn, SCK_PIN); //产生上升沿 data <<= 1; //左移准备处理下一个bit while(GPIO_ReadInputDataBit(GPIOn,SCK_PIN)); //等待时钟稳定 } GPIO_ResetBits(GPIOn,NSS_PIN); //结束通讯前关闭片选 } ``` 此段程序实现了向外部设备连续传送一字节命令的功能。实际应用过程中还需要考虑更多细节比如错误校验机制以及更复杂的帧格式定义等问题[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值