C语言 Cortex-A7核 SPI 实验

news2024/11/19 7:45:49

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 0
        for(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 //123
        for(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 实验效果


 

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

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

相关文章

ROS2 从头开始​​:第 2 部分 - 包、发布者和订阅者

一、说明 在这篇文章中,我们将重点关注 ROS 2 包、发布者和订阅者。具体来说,我们将涵盖以下主题:1. 什么是 ROS 2 包以及为什么它很重要?2.如何使用ros2 pkg create命令创建ROS 2包? 3. 如何使用该rclcpp库在ROS 2中创建发布者和订阅者? 让我们开始吧! 二、套…

世界第一ERP厂商SAP,推出类ChatGPT产品—Joule

9月27日&#xff0c;世界排名第一ERP厂商SAP在官网宣布&#xff0c;推出生成式AI助手Joule&#xff0c;并将其集成在采购、供应链、销售、人力资源、营销、数据分析等产品矩阵中&#xff0c;帮助客户实现降本增效。 据悉&#xff0c;Joule是一款功能类似ChatGPT的产品&#xf…

HONEYWELL 05704-A-0144 端子模块

HONEYWELL 05704-A-0144 端子模块用于连接电缆、导线或连接器&#xff0c;以便将电信号或电源引出到不同的部件或设备中。这些模块在各种工业和电子应用中都有广泛的用途&#xff0c;通常具有以下特点&#xff1a; 连接性&#xff1a;HONEYWELL 05704-A-0144 端子模块提供可靠的…

[C++ 网络协议] I/O流分离所带来的半关闭问题

1.问题和解决方法 根据所学内容&#xff0c;I/O流分离现如今有如下2种方法&#xff1a; 1.调用进程fork函数&#xff0c;分离出子进程&#xff0c;主进程和子进程分别进行输入流的读和输出流的写。 2.用FILE指针按读模式和写模式将输入流和输出流进行区分。 第一种方法&#…

【word密码】为什么word设置只读模式之后,还能编辑?

Word文档设置了只读模式&#xff0c;是可以编辑的&#xff0c;但是当我们进行保存的时候就会发现&#xff0c;word提示需要重命名并选择新路径才能够保存。 这种操作&#xff0c;即使可以编辑文字&#xff0c;但是原文件是不会受到影响的&#xff0c;编辑之后的word文件会保存到…

外汇天眼:Patrick Wonsey挪用340万美元!涉嫌外汇和二元期权欺诈

美国衍生品市场监管机构商品期货交易委员会&#xff08;CFTC&#xff09;宣布&#xff0c;已在佛罗里达州中区地区法院对佛罗里达州里维尤(Riverview)的Patrick Wonsey提起民事执法诉讼。 诉状指控Wonsey涉嫌欺诈和挪用资金&#xff0c;与一项涉及杠杆或保证金的零售外汇&…

变电站无人值守方案:提升效率与增强安全性

随着信息技术、人工智能、大数据的发展进步&#xff0c;电力行业正逐步向智能化转型。其中&#xff0c;无人值守变电站成为了现代电力系统的明显趋势。这种新型的运营模式不仅提高了效率&#xff0c;还极大地增强了电力系统的安全性。 无人值守变电站的核心概念是在没有人类现场…

探索UML类图:软件建模的关键概念和Visual Paradigm的优势

引言&#xff1a; 在软件开发领域&#xff0c;UML&#xff08;统一建模语言&#xff09;是一种广泛使用的建模语言&#xff0c;用于可视化和描述软件系统的结构和行为。其中&#xff0c;UML类图是最常用的一种图表类型之一&#xff0c;用于表示系统中的类、对象和它们之间的关系…

SI3262—高度集成的低功耗SOC芯片

Si3262是一款高度集成的低功耗SOC芯片&#xff0c;其集成了基于RISC-V核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 MCU模块具有低功耗、Low Pin Count、宽电压工作范围&#xff0c;集成了13/14/15/16位精度的ADC、LVD、UART、SPI、I2C、TIMER、WUP、IWDG、RTC、TSC等…

【力扣每日一题】2023.9.27 餐厅过滤器

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 题目挺长&#xff0c;估计中等难度是给在了阅读理解上。 简单来说就是给我们一堆餐厅的信息&#xff0c;每个餐厅拥有五个属性&#xff…

大采购3.0荣膺中国软件行业协会“2023年度优秀软件产品”

近日&#xff0c;中国软件行业协会公布“2023年度优秀软件产品”名单&#xff0c;北京筑龙潜心打造的基于云原生、微服务、中台化的B-PaaS云私一体化采购供应链平台--大采购3.0荣膺“2023年度优秀软件产品”。本次获奖&#xff0c;充分表明北京筑龙在采购供应链领域数字化转型成…

【node】发送邮件及附件简要使用说明

Nodemailer是一个用于Node.js应用程序的模块&#xff0c;可以轻松发送电子邮件。该项目始于2010年&#xff0c;当时没有合理的选项来发送电子邮件消息&#xff0c;如今它是大多数Node.js用户默认选择的解决方案。 一、环境配置 安装模块&#xff1a;nodemailer npm i nodema…

酷开系统 | 酷开科技抓好OTT大屏营销投放质与量

近日&#xff0c;QuestMobile发布的《2023年全景生态流量半年报告》数据显示&#xff0c;随着营销场景边界的拓展&#xff0c;越来越多的品牌方开始将阵地由移动端转移到大屏端。OTT及智能硬件营销占中国互联网营销市场规模比例已经从2020年的3.8%升至2022年的7.6%。 同时&…

​中秋夜我读《乡村振兴战略下传统村落文化旅游设计》许少辉八月新书

​中秋夜我读《乡村振兴战略下传统村落文化旅游设计》许少辉八月新书 ​中秋夜我读《乡村振兴战略下传统村落文化旅游设计》许少辉八月新书

深眸科技基于AI机器视觉实现应用部署,构建铝箔异物检测解决方案

异物的定义指的是影响到产品的外观质量或使用性能的外来或产品内部的物质&#xff0c;其产生的原因有很多种&#xff0c;包括在产品生产使用过程中的污染、腐蚀、氧化&#xff0c;以及由于生产工业控制不规范或人为疏忽等。而异物的产生&#xff0c;是导致产品的不良率增加的根…

C# DeOldify 黑白照片 老照片上色

效果 项目 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Imaging; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System…

美摄美颜SDK:您的一站式美颜解决方案

在当今的数字化时代&#xff0c;美颜技术已经成为了社交媒体、直播、虚拟现实等众多在线平台的重要部分。不论是个人还是企业&#xff0c;我们都希望能够通过使用高质量的美颜SDK来提升我们的产品和服务。那么&#xff0c;如何找到最合适的美颜SDK呢&#xff1f;哪家的美颜SDK最…

C++常见设计模式

设计模式 设计模式的六大原则&#xff1a;https://zhuanlan.zhihu.com/p/110130347 适配器模式 假设Client想要一个正方形&#xff08;client Interface&#xff09;&#xff0c;但是提供的服务&#xff08;service&#xff09;是个圆形&#xff0c;那么我就把这个圆通过适配…

数据结构与算法(C语言版)P7---串、数组、广义表

串、数组、广义表大体了解 我们知道前面学过的__顺序表、链表、栈、队列__&#xff0c;这些都属于线性表。 其中__栈、队列__是操作受限的线性表。 比如&#xff1a; 栈&#xff0c;先进后出&#xff0c;只能在栈顶插入和删除数据。队列&#xff1a;先进先出&#xff0c;只…

TensorFlow入门(八、TensorBoard可视化工具的应用)

TensorBoard常用函数和类http://t.csdn.cn/Hqi9c TensorBoard可视化的过程: ①确定一个整体的图表,明确从这个图表中获取哪些数据的信息 ②确定在程序的哪些节点、以什么样的方式进行汇总数据的运算,以记录信息,比如在反向传播定义以后,使用tf.summary.scalar记录损失值的变…