SPI总线通信——基于STM32MP157A

news/2024/5/22 9:28:31/文章来源:https://blog.csdn.net/laoKdx/article/details/127186116

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://www.luyixian.cn/news_show_19436.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java培训技术处理模型数据之 ModelAndView

处理模型数据之 ModelAndView 1 ModelAndView介绍 控制器处理方法的返回值如果为 ModelAndView, 则其既包含视图信息&#xff0c;也包含模型 数据信息。 2&#xff09;添加模型数据: MoelAndView addObject(String attributeName, Object attributeValue) ModelAndView…

C#-设计模式学习笔记

目录前言&#xff1a;最近得到师傅指点&#xff0c;建议我多学习下设计模式&#xff0c;简单记录下学习过程中的一些知识点1.设计模式&#xff08;创建型&#xff09;1.单例模式&#xff1a;1. 单例模式的主要作用2.单例模式能解决的问题3.单例模式的使用场景4.怎么实现单例模式…

Charles安装和抓包原理

进行APP服务器开发&#xff0c;接口测试、bug定位&#xff0c;抓取移动端请求数据包在所难免&#xff0c;公司使用的Charles&#xff0c;后面有机会使用了其它软件再做对比。Charles并不是安装即可用&#xff0c;涉及一些参数配置&#xff0c;特此记录分享。 1 安装、破解Char…

C51之温湿度检测系统(自动开关风扇)

目录 DHT11 温湿度传感器 产品概述 特点 检测模块是否存在 温湿度数据管理系统 uart.c文件 uart.h文件 lcd1602.c文件 lcd1602.H文件 dht11.c文件 dht11.h文件 delay.c文件 delay.h文件 config.h文件 main.c文件 DHT11 温湿度传感器 产品概述 DHT11数字温湿度传感…

2022/10/6——基于stm32mp157a的SPI实验

SPI总线是Motorola首先提出的全双工三线/四线同步串行总线 采用主从模式架构&#xff0c;支持多从机模式应用&#xff0c;但一般仅支持单主机&#xff0c;多从机 时钟由主机控制&#xff0c;在时钟移位脉 冲下&#xff0c;数据按位传输&#xff0c;高位在前&#xff0c;低位在…

网课查题系统-题库量全网最多

网课查题系统-题库量全网最多 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#x…

React源码分析4-深度理解diff算法

上一章中 react 的 render 阶段&#xff0c;其中 begin 时会调用 reconcileChildren 函数&#xff0c; reconcileChildren 中做的事情就是 react 知名的 diff 过程&#xff0c;本章会对 diff 算法进行讲解。 diff 算法介绍 react 的每次更新&#xff0c;都会将新的 ReactElem…

Learning With Error(LWE)问题学习

概念 又称误差还原&#xff0c;容错学习问题&#xff0c;即已知一个矩阵AAA以及一个向量&#xff0c;求解 b^Axe\hat{b}A xe b^Axe 这里eee是一个固定数值范围内随机采集的一个随机噪音向量&#xff0c;所以这个问题就转化为通过AAA和b^\hat{b}b^来还原最初的未知向量xxx 可以…

android studio2021.3.1 最新xposed模块编写指南

前言 最新的xposed框架已经从xposed到Edxposed再到Lsposed&#xff0c;虽然xposed的api依然是通用的82版本&#xff0c;但现在网上大多数的在android studio上配置xposed的教程已经有点落后了&#xff0c;因此写下这篇来记录自己安装的流程。lsposed如何安装可以看我之前的小米…

CPU 和 CPU Core 有啥区别?多核 CPU?多个 CPU?单核 CPU 为何也支持多线程呢?

由于现在大多计算机都是多核CPU&#xff0c;多线程往往会比单线程更快&#xff0c;更能够提高并发&#xff0c;但提高并发并不意味着启动更多的线程来执行。更多的线程意味着线程创建销毁开销加大、上下文非常频繁&#xff0c;你的程序反而不能支持更高的TPS。 CPU 组成 CPU 全…

JavaSE --- 学Java你应该知道的历史

目录 一. Java的历史 1. Java的发明人詹姆斯高斯林 2. Java的logo 3. java的发展 二. Java 语言的特性 &#x1f416;&#x1f416;&#x1f416;&#x1f416;如果喜欢&#xff01;&#xff01;&#x1f402;&#x1f402;&#x1f402;&#x1f402; &#x1f416;&#x1f4…

创建PyQt项目需要配置三个的External Tools

1. Qt Designer&#xff1a;Qt设计器 Qt Designer D:\PyQtLearning\venv\Lib\site-packages\QtDesigner\designer.exe $ProjectFileDir$ 2. PyUIC&#xff1a;将.ui文件转换为.py文件 PyUIC D:\PyQtLearning\venv\Scripts\pyuic5.exe -o $FileNameWithoutExtension$.py $Fi…

Apache HBase API及备份与还原

一、Apache HBase API Apache HBase也适用于多个外部API。有关更多信息&#xff0c;请参阅Apache HBase外部API&#xff08;将在下一节的内容中介绍&#xff09;。 有关使用本机HBase API的信息&#xff0c;请参阅User API Reference和HBase API章节。 示例&#xff1a; 使…

JVM-2.垃圾回收

目录 一、如何判断对象可以回收 1.1 引用计数法 1.2 可达性分析算法 二、五种引用 2.1 强引用 2.2 软引用&#xff08;SoftReference&#xff09; 2.3 弱引用&#xff08;WeakReference&#xff09; 2.4 虚引用&#xff08;PhantomReference&#xff09; 2.5 终结器引…

07 hook学习01

hook学习01Hooks理解useStateuseEffect自定义hook函数Hooks理解 react组件分为类组件和函数组件 函数组件是一个更加匹配react的设计理念UI f(data)&#xff0c;利于逻辑拆分与重用的组件表达形式&#xff0c;而之前的函数组件是不可以有自己的状态的&#xff0c;为了能让函…

第二章:微服务架构构建

第二章&#xff1a;微服务架构构建 2.1&#xff1a;IDEA新建project工作空间 父工程步骤 New Project 聚合总父工程名字 Maven版本选择 字符编码 注解生效激活 Java编译版本选择8 父工程pom文件 <?xml version"1.0" encoding"UTF-8"?&g…

谷粒商城 nacos

下载nacos&#xff1a;https://github.com/alibaba/nacos/releases启动 startup.cmd -m standalone依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></depende…

(附源码)计算机毕业设计ssm大学生健康系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Vue学习第37天——.sync修饰符、$attrs和$listeners属性的使用场景和案例

目录一、.sync修饰符作用使用场景使用方法案例.sync修饰符的优势二、$attrs作用使用场景使用方法案例$attrs注意点三、$listeners作用使用场景使用方法案例$listeners注意点一、.sync修饰符 作用 之前组件进行双向绑定时&#xff0c;需要通过proos进行父传子&#xff0c;再通…

Python 实现DNS查询放大攻击

查询放大攻击的原理是&#xff0c;通过网络中存在的DNS服务器资源&#xff0c;对目标主机发起的拒绝服务攻击&#xff0c;其原理是伪造源地址为被攻击目标的地址&#xff0c;向DNS递归服务器发起查询请求&#xff0c;此时由于源IP是伪造的&#xff0c;固在DNS服务器回包的时候&…