SPI总线通信——基于STM32MP157A

article/2025/9/18 13:39:13

SPI总线概念

        SPI总线是Motorola首先提出的全双工三线/四线同步串行总线,采用主从模式(Master Slave)架构;支持多从机(slave)模式应用,一般仅支持单主机,多从机。

        时钟由主机控制,在时钟移位脉冲下,数据按位传输,高位在前,低位在后(MSB first)

        SPI接口有2根单向数据线,为全双工 通信,目前应用中的数据速率可达几Mbps的水平,所以,SPI总线被广泛地使用在FLASH、ADC、LCD等设备与MCU间,要求通讯速率较高的场合。

SPI硬件连接

1.SPI接口共有4根信号线,

        分别是:设备选择线(片选线):NSS nsc

                       时钟线:SCK CLK 串行输出数据线:MOSI

                       串行输入数据线:MISO

                       M:master主机 O:output输出 S:slave从机 I:input输入

2.作用:

• (1)MOSI:主器件数据输出,从器件数据输入(M out S in)

• (2)MISO:主器件数据输入,从器件数据输出(M in S out)

• (3)SCLK :时钟信号,由主器件产生

• (4)/SS:从器件使能信号,由主器件控制(片选)

 

 三线制

四线制

通信协议

起始信号: NSS信号由高到低

结束信号:NSS信号由低变高

数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线同步数据。MOSI以及

                  MISO数据线在SCK每一个时钟周期内传输一位数据,且数据输入输出是同时进行

                  的。SPI每次数据传输可以8或16位为单位,每次传输的单位数不受限制。

 通信模式

         在SPI操作中,最重要的两项设置是时钟极性(CPOL)以及时钟相位(CPHA)。这两项是主从设备间数据采样的约定方式。

• 时钟极性CPOL:设置时钟空闲时的电平

        当CPOL = 0时,SCK引脚在空闲状态保持低电平

        当CPOL = 1时,SCK引脚在空闲状态保持高电平

• 时钟相位CPHA:设置数据采样时的时钟沿

        当CPHA = 0时,MOSI或MISO数据线上的信号将会在SCK时钟线的奇数边沿被采样

        当CPHA = 1时,MOSI或MISO数据线上的信号将会在SCK时钟线的偶数边沿被采样

 相对应的,在CPOL和CPHA的变化组合中,诞生了2×2种通信模式

通信模式

 

SPI模式CPOLCPHA空闲时SCK时钟采样时刻
0(00)00低电平奇数边沿
1(01)01低电平偶数边沿
2(10)11高电平奇数边沿
3(11)10高电平偶数边沿

分析电路

 

由此可知:

是GPIO章节 

* SPI4_NSS     ---->   PE11
 * SPI4_SCK     ---->   PE12
 * SPI4_MOSI    ---->   PE14
 * SPI4_MISO    ---->   PE13

数码管驱动原理

 

一个a~g分别控制一根数码管的亮灭字母组合控制数码管亮起,比如,数字2,就是abged。将它们转化为二进制,即使我们需要按位调整的代码。

分析芯片手册

翻看芯片手册《M74HC595》

引脚描述

 工作原理

 

 数码管真值表

《STM32MP157-datasheet》的GPIO章节

首先需要RCC给GPIOE使能

这个是RCC章节的

 

其次设置成通用输出模式

 然后设置成推挽输出模式

接着再是低速模式

 最后设置为禁止上下拉

代码实现

数码管数字对应值,最终的结果为:四个数码管会同时从0~9循环

/* 数码管的编码, 先发送低位,再发送高位
 * A B C D E F G DP
 * 1 1 1 1 1 1 0 0    0xFC   0
 * 0 1 1 0 0 0 0 0    0x60   1
 * 1 1 0 1 1 0 1 0    0xDA   2
 * 1 1 1 1 0 0 1 0    0xF2   3
 * 0 1 1 0 0 1 1 0    0x66   4
 * 1 0 1 1 0 1 1 0    0xB6   5 
 * 1 0 1 1 1 1 1 0    0xBE   6
 * 1 1 1 0 0 0 0 0    0xE0   7
 * 1 1 1 1 1 1 1 0    0xFE   8
 * 1 1 1 1 0 1 1 0    0xF6   9
 * */

头文件

#ifndef __SPI_H__
#define __SPI_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"
// MOSI对应的引脚输出高低电平的信号
#define  MOSI_OUTPUT_H()	do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)// 对应595芯片的锁存引脚输出高低电平
#define  NSS_OUTPUT_H()	    do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)// 时钟信号对应的引脚输出高低电平
#define  SCK_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 12);}while(0)
#define  SCK_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 12));}while(0)/** 函数功能: SPI初始化函数,推挽输出,高速,禁止上拉和下拉* 函数参数:无* 函数返回值:无
*/
void SPI_init(void);
/** 函数功能:SPI发送数据的函数* 函数参数:dat : 要发送的数据* 函数返回值:无*
*/
void SPI_write(unsigned char dat);#endif  // __SPI_H__

先根据GPIO章节的分析,写好初始化部分

void SPI_init(void)
{RCC->MP_AHB4ENSETR |= (0x1 << 4);// MOSI    PE14 GPIOE->MODER &= (~(0x3 << 28));GPIOE->MODER |= (0x1 << 28);GPIOE->OTYPER &= (~(0x1 << 14));GPIOE->OSPEEDR &= (~(0x3 << 28));
//	GPIOE->OSPEEDR |= (0x2 << 28);GPIOE->PUPDR &= (~(0x3 << 28));// MISO    PE13GPIOE->MODER &= (~(0x3 << 26));GPIOE->OSPEEDR &= (~(0x3 << 26));
//	GPIOE->OSPEEDR |= (0x2 << 26);GPIOE->PUPDR &= (~(0x3 << 26));// SCK     PE12	GPIOE->MODER &= (~(0x3 << 24));GPIOE->MODER |= (0x1 << 24);GPIOE->OTYPER &= (~(0x1 << 12));GPIOE->OSPEEDR &= (~(0x3 << 24));
//	GPIOE->OSPEEDR |= (0x2 << 24);GPIOE->PUPDR &= (~(0x3 << 24));// NSS     PE11GPIOE->MODER &= (~(0x3 << 22));GPIOE->MODER |= (0x1 << 22);GPIOE->OTYPER &= (~(0x1 << 11));GPIOE->OSPEEDR &= (~(0x3 << 22));
//	GPIOE->OSPEEDR |= (0x2 << 22);GPIOE->PUPDR &= (~(0x3 << 22));NSS_OUTPUT_L();    // 595芯片的锁存引脚拉低SCK_OUTPUT_L();    // SPI的时钟线拉低
}

然后是写函数

void SPI_write(unsigned char dat)
{unsigned char i;for(i = 0; i < 8; i++){if(dat & 0x01){MOSI_OUTPUT_H();  // MOSI线写高} else {MOSI_OUTPUT_L();  // MOSI线写低}dat >>= 1;// 时钟线从低电平到高电平的变化时,MOSI数据线上的数据// 被写到595芯片的移位寄存器中SCK_OUTPUT_L();   // SCK拉低delay_us1(10);SCK_OUTPUT_H();   // SCK拉高delay_us1(10);}//NSS_OUTPUT_L();//NSS_OUTPUT_H();}


http://chatgpt.dhexx.cn/article/CdpA0noS.shtml

相关文章

SPI总线传输的模式

SPI总线传输一共有4中模式&#xff0c;这4种模式分别由时钟极性(CPOL&#xff0c;Clock Polarity)和时钟相位(CPHA&#xff0c;Clock Phase)来定义&#xff0c;其中CPOL参数规定了SCK时钟信号空闲状态的电平&#xff0c;CPHA规定了数据是在SCK时钟的上升沿被采样还是下降沿被采…

SPI总线协议及SPI时序图详解

SPI&#xff0c;是英语Serial Peripheral Interface的缩写&#xff0c;顾名思义就是串行外围设备接口。SPI&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线&#xff0c;并且在芯片的管脚上只占用四根线&#xff0c;节约了芯片的管脚&#xff0c;同时为P…

SPI总线 通俗易懂讲解

转自&#xff1a;http://bbs.mydigit.cn/read.php?tid726343 SPI总线 MOTOROLA公司的SPI总线的基本信号线为3根传输线&#xff0c;即SI、SO、SCK。传输的速率由时钟信号SCK决定&#xff0c;SI为数据输入、SO为数据输出。采用SPI总线的系统如图8-27所示&#xff0c;它包含了一…

I2C和SPI总线以及通信

通讯属性 概括 Serial/parallel 串行/并行Synchronous/asynchronous 同步/异步Point-to-point / bus 点对点 总线Half-duplex/full-duplex 半双工/全双工Master-slave/ equal partners 主从/对等single-ending / differential 单端/差分 点对点和总线 点对点通讯 只有两个通…

Linux总线之SPI

文章目录 1.spi总线驱动1.1spi简介1.2spi时序解析1.3spi驱动框架1.4spi设备驱动的API1.5spi驱动的实例1.6m74hc595设备树的填充1.6.1m74hc595操作数码管的原理图1.6.2控制器的设备树1.6.3编写自己的设备树 1.7spi相关的结构体及函数1.8spi驱动的实例21.9让数码管流水显示0-f 1.…

SPI总线协议详解

目录 一.概述 二.特点 1.寻址方式 2.采用主-从模式(Master-Slave) 的控制方式 3.采用同步方式(Synchronous)传输数据 4.极性和相位 三.SPI总线传输的模式 四.SPI和I2C的区别 一.概述 SPI(serial peripheral interface)是一种同步串行通信协议&#xff0c;由一个主设备和…

SPI简介

SPI全称是Serial Perripheral Interface&#xff0c;也就是串行外围设备接口。SPI是Motorola公司推出的一种同步串行接口技术&#xff0c;是一种高速&#xff0c;全双工的同步通信总线。SPI时钟频率相比IIC要高很多&#xff0c;最高可以工作在上百MHZ。 SPI以主从方式工作&…

SPI通信总线基本概念

SPI总线概述 SPI总线介绍 SPI(Serial Peripheral interface)&#xff1a;是由Motorola公司开发的串行外围设备接口&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c;AD转换器&…

SPI通信总线

SPI通信总线 注意 常用的内部通信接口&#xff1a;UART、IIC、SPI&#xff0c;大多数是用于芯片之间的通信&#xff0c;特点是速度快&#xff0c;距离比较短 常用的外部通信接口&#xff1a;RS-232&#xff0c;RS-485&#xff0c;CAN&#xff0c;大多用于远距离传输&#xf…

FPGA——SPI总线详解(概念)

目录 SPI简介 SPI4种模式&#xff1a; SPI时序 使用SPI总线实现对flash的控制 flash芯片管脚&#xff1a; flash芯片存储 写使能模块 读状态模块 擦除模块 页读模块 页写模块 SPI简介 SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一…

SPI总线详解笔记

目录 1. 简介 1.1 概述 1.2 特征 1.3 操作模式 2. 外部信号说明 2.1 概述 2.2 信号详细说明 2.2.1 MOSI 2.2.2 MISO 2.2.3 SS 2.2.4 SCK 3. 存储器映射/寄存器定义 3.1 寄存器说明 3.1.1 SPI Control Register 1 3.1.2 SPI Control Register 2 3.1.3 SPI Baud R…

SPI总线规范

SPI是英文Serial Peripheral Interface的缩写&#xff0c;中文意思是串行外围设备接口&#xff0c;SPI是Motorola公司推出的一种同步串行通讯方式&#xff0c;是一种三线同步总线&#xff0c;因其硬件功能很强&#xff0c;与SPI有关的软件就相当简单&#xff0c;使CPU有更多的时…

SPI总线(一):基本原理篇

相关文章&#xff1a; SPI总线&#xff08;二&#xff09;&#xff1a;驱动分析篇 SPI总线&#xff08;三&#xff09;&#xff1a;驱动实例 1、什么是SPI&#xff1f; SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术&a…

关于IIC和SPI总线

IICvs SPI 现今&#xff0c;在低端数字通信应用领域&#xff0c;我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips&#xff08;for IIC&#xff09;和Motorola&#xff08…

I2C和SPI总线对比

最近2周一直在调试IIC和SPI总线设备&#xff0c;这里记录一下2种总线&#xff0c;以备后忘。 一 IIC总线 I2C--INTER-IC串行总线的缩写&#xff0c;是PHILIPS公司推出的芯片间串行传输总线。它以1根串行数据线&#xff08;SDA&#xff09;和1根串行时钟线&#xff08;SCL&#…

SPI总线介绍

一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现…

I2C总线和SPI总线的异同点

文章目录 1、内部总线、系统总线、外部总线的概念2、总线通信的基本概念3、I2C和SPI的经典物理层结构4、I2C总线与SPI总线的区别5、I2C总线和SPI总线的共同点 1、内部总线、系统总线、外部总线的概念 总线的分类方式是根据离芯片远近等级进行分类的&#xff1a;内部总线是外设…

SPI总线

【1】SPI总线相关的概念 1》SPI接口是Motorola 首先提出的全双工同步串行外围接口&#xff0c;采用主从模式&#xff08;Master Slave&#xff09;架构&#xff1b; 2》支持多slave模式应用&#xff0c;一般仅支持单Master。 3》时钟由Master控制&#xff0c;在时钟移位脉冲下…

1、SPI总线详解

概述 SPI&#xff08;Serial Peripheral interface&#xff09;串行外围设备接口&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。 SPI接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c;AD转换器&#xff0c;还有数字信号处理…

SPI协议及其工作原理详解

一、概述. SPI, Serial Perripheral Interface, 串行外围设备接口, 是 Motorola 公司推出的一种同步串行接口技术. SPI 总线在物理上是通过接在外围设备微控制器(PICmicro) 上面的微处理控制单元 (MCU) 上叫作同步串行端口(Synchronous Serial Port) 的模块(Module)来实现的…