1.15 SPI数码管实验

news2024/11/15 9:57:36

一.SPI总线

SPI是全双工三/四总线制串行总线,支持多主机多从机模式,常用单主机多从机模式
数据传输可以先传输高位也可以先传输低位。

四线(单主机多从机):    
    MOSI:主机输出,从机输入
    MISO:主机输入,从机输出
    SCLK:   时钟信号
    /SS:片选线,从器件使能信号
三线:(单主机单从机)
    MOSI:主机输出,从机输入
    MISO:主机输入,从机输出
    SCLK:   时钟信号

IIC和SPI的异同点

相同点:1.都采用同步串行总线的通信方式

               2.都采用主从模式

不同点:1.IIC总线采用半双工通信方式,SPI采用全双工通信方式

               2.IIC有应答机制,SPI没有应答机制

               3.IIC通过总线寻找从机,SPI通过片选线寻找从机

               4.IICSCL高电平读数据,低电平写数据

                SPI边缘采样,边缘触发

二.通信协议

通信协议
边缘触发,边缘采样
时钟极性    0:SCL空闲状态为低电平       1:SCL空闲状态为高电平
时钟相位      0:MOSI MISO 在奇数边采样        1:MOSI MISO 在偶数边采样

起始信号: NSS信号线由高变低,是SPI通讯的起始信号

结束信号:NSS信号由低变高,是SPI通讯的停止信号

数据传输:SPI使用MOSI及MISO信号线来传输数据,使用SCK信号线进行数据同步。 MOSI及MISO数据线在SCK的每个时钟周期传输一位数据,且数据输入输出是同时进行 的。SPI每次数据传输可以 8 位或 16 位为单位,每次传输的单位数不受限制

三.M74HC595芯片

工作原理:

        

 1.分析引脚作用

 

2.分析真值表

 四.代码

spi.c

#include "spi.h"
/* SPI4_NSS 	---->   PE11
 * SPI4_SCK     ---->   PE12
 * SPI4_MOSI    ---->   PE14
 * SPI4_MISO    ---->   PE13
 * */
 
/* 数码管的编码, 先发送低位,在发送高位
 * 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
 * */
void delay_us1(unsigned int us)
{
	int i,j;
	for(i = 0; i < us;i++)
		for (j = 0; j < 1;j++);
}
 
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->PUPDR &= (~(0x3 << 28));
	// MISO    PE13
	GPIOE->MODER &= (~(0x3 << 26));
	GPIOE->OSPEEDR &= (~(0x3 << 26));
	GPIOE->PUPDR &= (~(0x3 << 26));
	// SCK     PE12	
	GPIOE->MODER &= (~(0x3 << 24));
	GPIOE->MODER |= (0x1 << 24);
	GPIOE->OTYPER &= (~(0x1 << 12));
	GPIOE->OSPEEDR &= (~(0x3 << 24));
	GPIOE->PUPDR &= (~(0x3 << 24));
	// NSS     PE11
	GPIOE->MODER &= (~(0x3 << 22));
	GPIOE->MODER |= (0x1 << 22);
	GPIOE->OTYPER &= (~(0x1 << 11));
	GPIOE->OSPEEDR &= (~(0x3 << 22));
	GPIOE->PUPDR &= (~(0x3 << 22));
	NSS_OUTPUT_L();    // 595芯片的锁存引脚拉低
	SCK_OUTPUT_L();    // SPI的时钟线拉低
}
 
void SPI_write(unsigned char dat)
{
	//for循环
	//if判断条件,先发送低位
	//if成立MOSI线写高
	//else MOSI线写低
	//移位寄存器时钟从低到高的变化
	
	for( unsigned char i=0;i<8;i++){		
		delay_us1(100);
		if(dat & 0x01){	  //从低位到高位发送,从低位开始判断
			MOSI_OUTPUT_H();	1---写高电平
		}else{		
			MOSI_OUTPUT_L();    0----写低电平
		}
		SCK_OUTPUT_L();    //根据真值表,移位寄存器存储L,H,移位时钟寄存器需要由低电平到高电平
		delay_us1(100);
		SCK_OUTPUT_H();
		delay_us1(100);
 
		dat>>=1;
	}
}

main.c

#include "spi.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
	int i,j;
	for(i = 0; i < ms;i++)
		for (j = 0; j < 1800; j++);
}
 
 
 
int num[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6};
 
int main(void){
	//for循环条件
	//内容:先发送位,在发送段
	//0xF0 num[i]
	SPI_init();
while(1){
		
	for(int i=0;i<4;i++){
		
		
		//SPI_write(0xF0);
		SPI_write(0x80>>i);    //发送位
		SPI_write(num[i+1]);   //发送段
		NSS_OUTPUT_L();      //根据真值表,移位寄存器中数据锁存到锁存寄存器中,锁存时钟寄存器需要由低电平到高电平
		delay_ms(100);
		NSS_OUTPUT_H();
		delay_ms(100);
 
	}
}
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

9. 垃圾收集器与内存分配策略

整体思路 先考虑3个问题 哪些内存需要收集 堆和方法区需要收集&#xff1b;程序计数器、虚拟机栈、本地方法栈都不需要做垃圾回收&#xff08;按照其功能很容易理解&#xff09; 什么时候收集 对象已死。引申出另一个问题&#xff0c;怎么判断对象已死呢&#xff1f;当程序内…

外部链接<a>

创建外部链接 HTML 通过使用 标签在 HTML 中创建链接。 注意&#xff1a;移除 target“_blank” 属性避免点击链接会打开新的元素页。 使用a元素实现页面内跳转 a元素也可以用在网页内不同区域的跳转。 设置a元素的 href 属性值为井号#加上想跳转区域对应的id属性值&…

ASP.NET Core 3.1系列(28)——ASP.NET Core中使用Autofac替换内置IoC容器

1、前言 前面的博客主要介绍了一些Autofac的使用方法&#xff0c;示例代码都是基于控制台程序。本文就来介绍一下如何在ASP.NET Core中使用Autofac代替内置的IoC容器。 2、创建接口和类 这里搭建了一个简易的项目&#xff0c;如下图所示&#xff1a; Service层代码如下&…

长安汽车推动新伙伴变革重塑供应链模式发布长安智电iDD技术

1月12日&#xff0c;以“携手勇进一路有你”为主题的2023长安汽车全球伙伴大会在重庆大剧院举行。此次大会&#xff0c;是长安汽车总结过往生产经营良好态势&#xff0c;研判行业未来发展趋势&#xff0c;发布最新企业发展战略&#xff0c;与全球合作伙伴共谋新未来&#xff0c…

【JavaEE】网络编程基础之Socket套接字

✨哈喽&#xff0c;进来的小伙伴们&#xff0c;你们好耶&#xff01;✨ &#x1f6f0;️&#x1f6f0;️系列专栏:【JavaEE】 ✈️✈️本篇内容:网络编程基础之Socket套接字。 &#x1f680;&#x1f680;代码存放仓库gitee&#xff1a;JavaEE初阶代码存放&#xff01; ⛵⛵作者…

机器学习:公式推导与代码实现-概率模型

最大信息熵模型 根据最大信息熵原理,信息熵最大时得到的模型是最优模型,即最大信息熵模型。 最大信息熵原理 信息论的开创者香农将信息的不确定程度称为熵,为了与热力学中熵的概念区分,这种信息的不确定程度又称信息熵。 最大信息熵原理认为在所有可能的概率模型中,熵…

【Python从入门到进阶】4、pycharm的安装及使用

接上篇《3、运行python代码》 上一篇我们学习了如何使用终端和执行文件运行python代码&#xff0c;本篇我们来学习python编程工具pycharm的安装及基本使用。 一、IDE的概念 上一篇我们介绍了使用命令行指令执行和文件编译的方法进行python代码的解释执行&#xff0c;但是仍然…

总之2022,我的研发、直播、软文触达13W+人的成果打包拿走,展望2023一起加油

导读 | 2022年勇哥算是正是进入写作圈&#xff0c;在小伙伴们的支持下&#xff0c;勇哥也是每日每夜的肝&#xff0c;真心和小伙伴们分享技术前沿路上的系列故事&#xff0c;大家相互鼓励与支持&#xff0c;勇哥也是收获满满&#xff01;现在勇哥通过这边文章整理一下本年度&am…

重装系统win11服务器未响应怎么修复操作

最近网友问小编win11服务器未响应怎么修复?最近有用户询问这个问题&#xff0c;在使用电脑的时候遇到了服务器无响应的情况&#xff0c;今天小编来教大家win11服务器未响应怎么修复操作&#xff0c;希望能帮到各位。 工具/原料&#xff1a; 系统版本&#xff1a;Windows11 品…

Koa 真解

1. 前言 昨天花费了比较多的时间将Koa的源码阅读了一遍&#xff0c;主要是项目中用到了Koa&#xff0c;为了做的更加得心应手所以先将源码看一下&#xff0c;总体上源码还是非常简单的&#xff0c;没啥难度。一方面为了总结另一方面也是为了不太看懂源码的同学们&#xff0c;今…

代码审计-7 ThinkPHP框架代码审计

ThinkPHP框架目录 applocation&#xff1a;此目录为应用目录&#xff0c;网站主要的文件控制器都放在applocation目录下 view&#xff1a;此目录在applocation下&#xff0c;为视图层 extend&#xff1a;为扩展类库目录 public&#xff1a;为网站对外访问目录&#xff0c;也就…

汽车路径尽头放一个点图像验证

文章目录前言一.图片二.大致思路2.1 小车位置识别2.2 采用轮廓算法得到路径的坐标2.3 采用断点续连的方法&#xff0c;将轮廓算法得到点组成直线&#xff0c;并寻找到最后的坐标三 缺陷四.如果大佬有其他的好的方法欢迎大佬们留言交流前言 提示&#xff1a;文章写完后&#xf…

坑多路难走,学数据分析转行前要知道培训机构不会说的事情

想要转行做数据分析师&#xff1f;那就要做好迎接坑多路难走的准备。虽然培训机构可以教你如何使用工具和算法&#xff0c;但它们很少会告诉你真正的行业现状。在这个竞争激烈的领域中&#xff0c;需要知道的不仅仅是如何处理数据&#xff0c;还有如何在企业中应用它。 跟着我…

CMMI之配置管理

配置管理&#xff08;Configuration Management, CM&#xff09;的目的是通过执行版本控制、变更控制等规程&#xff0c;以及使用配置管理软件&#xff0c;来保证所有配置项的完整性和可跟踪性。配置管理是对工作成果的一种有效保护。配置管理过程域是SPP模型的重要组成部分。本…

42. 【农产品溯源项目前后端Demo】后端-区块链连接服务

本节介绍后端代码是如何与区块链网络连接的。 1.在后端代码里fabric包 负责与区块链网络连接,并发送交易。 2.fabric.Const文件 定义 区块链网络拓扑结构,请查看注释。 public final class Const {//区块链网络中organizations的配置目录,从配置文件读取证书目录public stat…

【JavaEE】单例模式如何保证在多线程环境下线程安全高可用?

文章目录1 单例模式回顾2 饿汉式单例模式的实现3 懒汉式单例模式的实现4 单例模式的线程安全问题分析5 线程安全的懒汉式实现6 总结1 单例模式回顾 单例模式是设计模式的一种。而设计模式就是针对我们实际开发中写代码所遇到的不同场景所设立的解决方案。在笔者JavaSE阶段的文章…

Vue组件化编程需要注意的命名规则

在Vue组件化编程过程中&#xff0c;开始接触的不太注意命名规则&#xff0c;比如对于组件的内部参数命名以及在父组件中使用命名感到模糊&#xff0c;犯一些错误&#xff0c;就感觉在踩坑。 其实&#xff0c;这是对Vue组件化编程中的命名规则没有留意&#xff0c;稍加学习就可以…

java伪随机数生成器

关于随机数的基本概念 1、对随机数性质分类&#xff1a; 随机性&#xff1a;符合该性质的叫弱伪随机数。这种随机数仅可以用于一般应用&#xff0c;无法用在密码学&#xff0c;例如java中的java.util.Random类不可预测性&#xff1a;符合该性质的叫强伪随机数。在密码学中&am…

学习记录660@项目管理一般知识

看了项目管理一般知识这一章的知识&#xff0c;最开始觉得这些内容&#xff0c;觉得太过于书面化&#xff0c;比如关于什么是项目管理&#xff0c;都要用一段正式定义&#xff0c;充满了国内教育的繁琐感&#xff0c;但是细细品味觉得这些定义是很有道理的&#xff0c;并不是多…

保障接口数据安全的十种方案

视频介绍 数据加密 --主要针对网络抓包 AES 对称加密 RES 非对称加密 实践中直接使用 HTTPS 对于用户个人信息及密码等敏感信息 可额外进行加密 &#xff08;如密码会进行md5加密防止撞库&#xff09; 加签验签 --甄别数据在传输过程中被篡改 通常通过哈希算法 进行验证 需…