当前位置: 首页 > news >正文

C语言 Cortex-A7核 SPI 实验

1 实验目的

1、数码管显示相同的值0000 1111 2222 .... 9999

2、数码管不同的值1234

2 代码

include/spi.h

#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__                                                     

src/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)                              
{                                                              unsigned char i;                                           for(i=0;i<8;i++)                                           {                                                          //先发送第一位,再发送高位                             //判断                                                 if(dat & 0x01)                                         MOSI_OUTPUT_H(); //向数据线上写入高电平            else                                                   MOSI_OUTPUT_L(); //向数据线上写入低电平            //移位                                                 dat >>= 1;                                             //时钟信号从低电平到高电平变化                         SCK_OUTPUT_L();                                        delay_us1(10);                                         SCK_OUTPUT_H();                                        delay_us1(10);                                         }                                                          
}                                                              

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()
{unsigned char i;SPI_init(); //SPI初始化while(1){
#if 0for(i=0;i<10;i++){SPI_write(0xF0);//先控制 位SPI_write(num[i]);//再控制 段//锁存时钟从低电平到高电平变化NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();delay_ms(1000);}
#else //123for(i=0;i<4;i++){SPI_write(0x80 >> i);//位SPI_write(num[i+1]);//段//锁存时钟从低电平到高电平变化NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();delay_ms(1000);}
#endif}return 0;
}                                                                         

3 实验效果


 

相关文章:

C语言 Cortex-A7核 SPI 实验

1 实验目的 1、数码管显示相同的值0000 1111 2222 .... 9999 2、数码管不同的值1234 2 代码 include/spi.h #ifndef __SPI_H__ #define __SPI_H__ #includ…...

Spring工具类--ReflectionUtils的使用

原文网址&#xff1a;Spring工具类系列--ReflectionUtils的使用_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring的ReflectionUtils的使用。 ReflectionUtils工具类的作用&#xff1a;便利地进行反射操作。 Spring还有一个工具类&#xff1a;ReflectUtils&#xff0c;它们在…...

zemax西德莫尔目镜

高性能的军用光学仪器 在两个双胶合透镜之间&#xff0c;增加了一块平凸透镜 半视场角增大到35度 入瞳直径4mm波长0.51、0.56、0.61半视场35焦距27.9mm 镜头参数&#xff1a; 成像效果&#xff1a;...

C++ 拷贝构造函数

介绍和示例 拷贝构造函数是一种特殊的构造函数&#xff0c;它在创建对象时&#xff0c;是使用同一类中之前创建的对象来初始化新创建的对象。拷贝构造函数通常用于&#xff1a; 通过使用另一个同类型的对象来初始化新创建的对象。 复制对象把它作为参数传递给函数。 复制对象…...

怎么使用 Flink 向 Apache Doris 表中写 Bitmap 类型的数据

Bitmap是一种经典的数据结构&#xff0c;用于高效地对大量的二进制数据进行压缩存储和快速查询。Doris支持bitmap数据类型&#xff0c;在Flink计算场景中&#xff0c;可以结合Flink doris Connector对bitmap数据做计算。 社区里很多小伙伴在是Doris Flink Connector的时候&…...

LeetCode 四数相加II 哈希

原题链接&#xff1a; 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题面&#xff1a; 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i,…...

python(自4) xpath下载 lxml安装 lxml语法 使用方式

&#xff08;一&#xff09;安装 搜索xpath 讲解 XPath 教程 (w3school.com.cn) 一&#xff0c;下载地址 &#xff1a; https://chrome.zzzmh.cn/info/hgimnogjllphhhkhlmebbmlgjoejdpjl 二 &#xff0c;拖拽 &#xff08;二&#xff09;lxml安装 cmd 打开终端 cd pythond…...

05-Zookeeper典型使用场景实战

上一篇&#xff1a;04-Zookeeper集群详解 1. Zookeeper 分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下&#xff0c;性能会下降的比较厉害&#xff0c;主要原因是&#xff0c;所有的连接都在对同一个节点进行监听&#xff0c;当服务器检测到删除事件时&#xff0c…...

stl格式-3D三角形

文章目录 什么是stl文件?格式首选stl的语法1.这是一个stl格式的文件:2.下面先举个例子(难度略微提示)补充:关于\<\<我试了一下:这个法线你随便写好像也没问题\>> 3.来个立方体4.最后再写一个由三个直角形组成的立方体 什么是stl文件? 首先说一下,这个stl不是cpp…...

基于微信小程序的高校暑期社会实践小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...

ARM-day2

1、 .text .global _start_start:MOV r0, #0x1ADDS r1,r0, #0x1cmp r1, #100bl funstop:b stopfun:ADD r2,r1,r1.end2、思维导图...

macOS Sonoma 14 正式版(23A344)发布,附黑/白苹果镜像下载地址

系统介绍&#xff08;系统下载地址&#xff1a;http://www.imacosx.cn/115300.html&#xff09; 黑果魏叔9 月 27日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS Sonoma 14 正式版&#xff08;23A344&#xff09;。 macOS 14正式版系统发布&#xff1a;全新功能与改…...

HarmonyOS开发:封装一个便捷的Log工具类

前言 日志打印&#xff0c;没什么好说的&#xff0c;系统已给我们提供&#xff0c;且调用也是非常的简单&#xff0c;我们封装的目的&#xff0c;一是扩展&#xff0c;打印一些不常见的类型&#xff0c;比如格式化json&#xff0c;使得日志看起来比较好看&#xff0c;二是&…...

第十章_祖冲之_圆周率

倒数1又2/3章&#xff0c;keep_writting的一天&#xff1a; 第十章10.1.7 运行程序资源下载网站为何打不开呢&#xff1f;...

FVM管理Flutter 环境

开发中&#xff0c;会经常切换不同版本的 Flutter 环境。使用 FVM&#xff08;Flutter Version Manager &#xff09;来进行 Flutter 版本切换是一个很不错的选择。 下面从安装FVM、环境配置、切换Flutter这几个主要步骤总结下 FVM 的使用 一、安装 homebrew 网址&#xff1…...

vue | 样式隔离scoped的原理 样式穿透deep的原理

文章目录 vue中的样式穿透scoped 样式隔离父组件可以修改子组件根节点样式 deep 样式穿透:deep(.el-col)的原理 vue中的样式穿透 scoped 样式隔离 一个style标签拥有scoped属性时&#xff0c;css样式就只能作用于当前的组件&#xff0c;这样就可以使得组件之间的样式不互相污…...

UML,集合框架

1.什么是UML UML是统一建模语言的简称&#xff0c;它是一种由一整套图表组成的标准化建模语言。UML用于帮助系统开发人员阐明&#xff0c;展示&#xff0c;构建和记录软件系统的产出。UML代表了一系列在大型而复杂系统建模中被证明是成功的做法&#xff0c;是开发面向对象软件…...

如何快速轻松自动添加微信好友?

有些客需要换新的微信号&#xff0c;想把以前微信号上的好友全部加回来&#xff0c;但是因为微信系统的规定&#xff0c;频繁加好友容易被封号&#xff0c;而且手动添加好友太费时费力&#xff0c;还要控制加好友的间隔时间。那么有没有什么方法可以快速轻松自动添加好友呢&…...

MySQL高级语句(第一部分)

MySQL高级语句(第一部分)一、MySQL进阶查询1、select ----显示表格中一个或数个字段的所有数据记录2、distinct ----不显示重复的数据记录3、where ----有条件查询4、and or ----且 或5、in ----显示已知的值的数据记录6、between ----显示两个值范围内的数据记录7、通配符8、l…...

Perl区分文件换行符类型

背景 在Windows上使用Perl判断文件时何种换行符时&#xff0c;处理CR LF类型的换行符时&#xff0c;也识别成了LF。 思路 Windows上的换行是 CRLF , Unix上是 LF , Mac CR在Windows平台使用Perl读取文件创建文件句柄时&#xff0c;未对file handler设置binmode&#xff0c;了…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...