spi_2024.1.2

spi.h

#ifndef __SPI_H__
#define __SPI_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"#include"uart4.h"
#include"key_it.h"
// MOSI对应的引脚输出高低电平的信号PE14
#define  MOSI_OUTPUT_H()    do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)// 对应595芯片的锁存引脚输出高低电平  PE11
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)// 时钟信号对应的引脚输出高低电平  PE12
#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);
void delay_ms(int ms);
void bian();
#endif

spi.c

#include"spi.h"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)
{//1.使能GPIOE时钟RCC->MP_AHB4LPENSETR |=(0X1<<4);//2.MOSI管脚PE14 设置输出的属性GPIOE->MODER &=(~(0X3<<28));GPIOE->MODER |=(0X1<<28);GPIOE->OTYPER &=(~(0X1<<14));GPIOE->OSPEEDR &=(~(0X3<<28));GPIOE->PUPDR &=(~(0X3<<28));//3.MISO管脚PE13 设置输入的属性GPIOE->MODER &=(~(0X3<<26));  GPIOE->OSPEEDR &=(~(0X3<<26));GPIOE->PUPDR &=(~(0X3<<26));//4.SCK管脚PE12  设置输出的属性GPIOE->MODER  &=(~(0x3<<24));GPIOE->MODER  |=(0x1<<24);GPIOE->OTYPER &=(~(0X1<<12));GPIOE->OSPEEDR &=(~(0X3<<24));GPIOE->PUPDR &=(~(0X3<<24));//5.RCK(NSS)管脚PE11 设置输出的属性GPIOE->MODER  &=(~(0X3<<22));GPIOE->MODER  |=(0X1<<22);GPIOE->OTYPER &=(~(0X1<<11));GPIOE->OSPEEDR &=(~(0X3<<22));GPIOE->PUPDR &=(~(0X3<<22));//默认PE12和PE11输出低电平,方便产生上升沿NSS_OUTPUT_L();SCK_OUTPUT_L();}void SPI_write(unsigned char dat)
{int 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++);}   void bian(){NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();delay_ms(1000);}//保存0-9编码的数组int main(void){//unsigned char i;SPI_init();while(1){// 发送数码管的位 SPI_write(0X80);SPI_write(0XFC);bian();SPI_write(0X40);SPI_write(0XF2);bian();SPI_write(0X20);SPI_write(0X3e);bian();SPI_write(0X10);SPI_write(0XF6);bian();}return 0;}

spi.h(加了key_it.h)

#ifndef __SPI_H__
#define __SPI_H__#include "stm32mp1xx_gpio.h"
#include "stm32mp1xx_rcc.h"#include"uart4.h"
#include"key_it.h"
// MOSI对应的引脚输出高低电平的信号PE14
#define  MOSI_OUTPUT_H()    do{GPIOE->ODR |= (0x1 << 14);}while(0)
#define  MOSI_OUTPUT_L()    do{GPIOE->ODR &= (~(0x1 << 14));}while(0)// 对应595芯片的锁存引脚输出高低电平  PE11
#define  NSS_OUTPUT_H()     do{GPIOE->ODR |= (0x1 << 11);}while(0)
#define  NSS_OUTPUT_L()     do{GPIOE->ODR &= (~(0x1 << 11));}while(0)// 时钟信号对应的引脚输出高低电平  PE12
#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);
void delay_ms(int ms);
void bian();
#endif

main.c

#include "spi.h"#include"key_it.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++);}   //保存0-9编码的数组int main(void){SPI_init();key1_it_config();key2_it_config();key3_it_config();//unsigned char i;while(1){// 发送数码管的位 printf("do_main.....\n");delay_ms(1000);}return 0;}

spi.c

同上

do_irq.c

#include"led.h"
#include"spi.h"
extern void printf(const char *fmt, ...);
unsigned int i = 0;
void bian()
{NSS_OUTPUT_L();delay_ms(1);NSS_OUTPUT_H();delay_ms(1000);
}
void do_irq(void) 
{int irqno=(GICC->IAR &0X3FF);switch(irqno){case 99:{printf("im key1\n");SPI_write(0X80);SPI_write(0XFC);bian();SPI_write(0X20);SPI_write(0X3e);bian();GICD->ICPENDR[3] |=(0X1<<3);EXTI->FPR1 |=(0X1<<9);led1_off();}break;case 98:{printf("im key3\n");SPI_write(0X40);SPI_write(0XF2);bian();GICD->ICPENDR[3] |=(0X1<<2);EXTI->FPR1 |=(0X1<<8);}break;case 97: {printf("im key2\n");SPI_write(0X10);SPI_write(0XF6);bian();GICD->ICPENDR[3] |=(0X1<<1);EXTI->FPR1 |=(0X1<<7);}break;}GICC->EOIR=irqno;
}

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

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

相关文章

怎么设计一个简单又直观的接口?

文章目录 问题的开端为什么从问题开始&#xff1f;自然而来的接口 一个接口一件事情减少依赖关系使用方式要“傻” 小结 开放的接口规范是使用者和实现者之间的合约。既然是合约&#xff0c;就要成文、清楚、稳定。合约是好东西&#xff0c;它可以让代码之间的组合有规可依。但…

KBDNO1.DLL文件缺失,软件或游戏无法启动运行,怎样快速修复

不少小伙伴&#xff0c;求助电脑报错“KBDNO1.DLL文件缺失&#xff0c;软件或游戏无法启动或运行”&#xff0c;应该怎么办&#xff1f; 首先&#xff0c;我们先来了解“KBDNO1.DLL文件”是什么&#xff1f; KBDNO1.DLL是Windows操作系统中的一个动态链接库文件&#xff0c;主…

创建VLAN及VLAN间通信

任务1、任务2、任务3实验背景&#xff1a; 在一家微型企业中&#xff0c;企业的办公区域分为两个房间&#xff0c;一个小房间为老板办公室&#xff0c;一个大房间为开放办公室&#xff0c;财务部和销售部的员工共同使用这个办公空间。我们需要通过VLAN的划分&#xff0c;使老板…

kubeadm来快速搭建一个K8S集群

二进制搭建适合大集群&#xff0c;50台以下的主机 kubeadm更适合中下企业的业务集群 我们采用了二进制包搭建出的k8s集群&#xff0c;本次我们采用更为简单的kubeadm的方式来搭建k8s集群。 二进制的搭建更适合50台主机以上的大集群&#xff0c;kubeadm更适合中小型企业的集群…

Vmware Centos 7 NAT网络配置(可上网,互相可ping)

本人最近在学习Docker&#xff0c;奈何没钱买服务器&#xff0c;只能使用虚拟机。结果在配置虚拟机的网络时一直出错&#xff01;&#xff01;&#xff01;&#xff01;很生气&#xff01;&#xff01;&#xff01;&#xff01;不过好在最终还是解决了。&#xff01; 直接上干货…

干洗店洗鞋店小程序核心功能有哪些?

在繁忙的生活中&#xff0c;我们的鞋子常常承载着风尘仆仆的故事。而洗鞋小程序&#xff0c;就是那个让您的鞋子焕然一新的魔法师。通过这个小程序&#xff0c;您可以在线预约、支付&#xff0c;查询洗鞋订单&#xff0c;并与洗鞋店铺进行互动&#xff0c;轻松享受专业的洗鞋服…

Python内置库os和sys的常用方法汇总

更多Python学习内容&#xff1a;ipengtao.com Python是一门强大的编程语言&#xff0c;具有丰富的标准库&#xff0c;其中包括os和sys两个常用模块。os模块用于与操作系统交互&#xff0c;提供了许多文件和目录操作的方法&#xff0c;而sys模块用于与Python解释器进行交互&…

【微服务架构】Spring Cloud入门概念讲解

目录 一、单体架构VS微服务架构 1.1 单体应用 单体架构的优点 单体应用的缺点 1.2 微服务“定义” 微服务的特性 微服务的缺点 微服务的适用场景 二、微服务常见概念与核心模块 三、Spring Cloud 工作流程 一、单体架构VS微服务架构 1.1 单体应用 一个归档包&#x…

Swift爬虫使用代理IP采集唯品会商品详情

目录 一、准备工作 二、代理IP的选择与使用 三、使用Swift编写唯品会商品爬虫 四、数据解析与处理 五、注意事项与优化建议 六、总结 一、准备工作 在开始编写爬虫之前&#xff0c;需要准备一些工具和库&#xff0c;以确保数据抓取的顺利进行。以下是所需的工具和库&…

【Linux】进程控制深度了解

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;熟练掌握Linux下的进程控制 > 毒鸡汤&#xff…

【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】

文章目录 一.【计算机设计大赛作品】豆瓣电影数据挖掘可视化—信息可视化赛道获奖项目深入剖析【可视化项目案例-22】1.1 项目主题:豆瓣电影二.代码剖析2.1 项目效果展示2.2 服务端代码剖析2.3 数据分析2.4 数据评分三.寄语四.本案例完整源码下载一.【计算机设计大赛作品】豆瓣…

Redis数据删除策略(惰性删除+定期删除)

文章目录 Redis数据删除策略1. 惰性删除2. 定期删除3. Redis过期删除策略用的哪种&#xff1f; Redis数据删除策略 1. 惰性删除 设置key过期时间后&#xff0c;不管它&#xff0c;需要用该key时&#xff0c;再检查是否过期&#xff0c;过期就删掉她&#xff0c;没过期返回 set …