stm32实现软件spi

Driver_SPI.c

#include "Driver_SPI.h"void Driver_SPI_Init(void)
{/* 1. 开启GPIO时钟 PA和PC*/RCC->APB2ENR |= (RCC_APB2ENR_IOPCEN | RCC_APB2ENR_IOPAEN);/* 2. 设置引脚的工作模式 *//* 2.1 cs: 推挽输出 PC13*  CNF=00 MODE=11 */GPIOC->CRH &= ~GPIO_CRH_CNF13;GPIOC->CRH |= GPIO_CRH_MODE13;/* 2.2 sck: 推挽输出 PA5*//* 2.3 mosi: 推挽输出 PA7*/GPIOA->CRL &= ~(GPIO_CRL_CNF5 | GPIO_CRL_CNF7);GPIOA->CRL |= (GPIO_CRL_MODE5 | GPIO_CRL_MODE7);/* 2.4 miso: 浮空输入 PA6  CNF=01 MODE=00*/GPIOA->CRL &= ~(GPIO_CRL_CNF6_1 | GPIO_CRL_MODE6);GPIOA->CRL |= GPIO_CRL_CNF6_0;/* 3. spi的模式0  sck空闲状态是 0   */SCK_LOW;/* 4. 片选默认不选中 */CS_HIGH;/* 5. 延时 */SPI_DELAY;
}
void Driver_SPI_Start(void)
{CS_LOW;// SPI_DELAY;
}void Driver_SPI_Stop(void)
{CS_HIGH;// SPI_DELAY;
}uint8_t Driver_SPI_SwapByte(uint8_t byte)
{uint8_t rByte = 0x00;for (uint8_t i = 0; i < 8; i++){//(byte & 0x80) ? MOSI_HIGH : MOSI_LOW;/* 1. 先把数据放入到MOSI上 */if (byte & 0x80){MOSI_HIGH;}else{MOSI_LOW;}byte <<= 1;// SPI_DELAY;/* 2. 拉高时钟 (第一个跳变)*/SCK_HIGH;// SPI_DELAY;/* 3. 读取miso  (第一个跳变采样)*/rByte <<= 1;// MISO_READ ? rByte|= 0x01 : rByte;if (MISO_READ){rByte |= 0x01;}/* 4. 拉低时钟 */SCK_LOW;// SPI_DELAY;}return rByte;
}

Driver_SPI.h

#ifndef __DRIVER_SPI_H
#define __DRIVER_SPI_H#include "stm32f10x.h"
#include "Delay.h"#define CS_HIGH (GPIOC->ODR |= GPIO_ODR_ODR13)
#define CS_LOW (GPIOC->ODR &= ~GPIO_ODR_ODR13)#define SCK_HIGH (GPIOA->ODR |= GPIO_ODR_ODR5)
#define SCK_LOW (GPIOA->ODR &= ~GPIO_ODR_ODR5)#define MOSI_HIGH (GPIOA->ODR |= GPIO_ODR_ODR7)
#define MOSI_LOW (GPIOA->ODR &= ~GPIO_ODR_ODR7)#define MISO_READ (GPIOA->IDR & GPIO_IDR_IDR6)#define SPI_DELAY Delay_us(5)void Driver_SPI_Init(void);void Driver_SPI_Start(void);void Driver_SPI_Stop(void);uint8_t Driver_SPI_SwapByte(uint8_t byte);#endif

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

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

相关文章

N32G45XVL-STB之lvgl的应用实例

目录 概述 1 硬件介绍 1.1 ST7796-LCD 1.2 MCU IO与LCD PIN对应关系 1.3 MCU IO与Touch PIN对应关系 2 N32G45x移植 LVGL 2.1 移植步骤 2.2 注意点 2.2.1 UI刷新函数 2.2.2 主函数中调用 3 LVGL的应用Demo 3.1 功能描述 3.2 代码实现 3.3 测试 N32G45XVL-STB之lv…

基于RK3588的NPU案例分享!6T是真的强!

RK3588 NPU简介 作为瑞芯微新一代旗舰工业处理器&#xff0c;RK3588 NPU性能可谓十分强大&#xff0c;6TOPS设计能够实现高效的神经网络推理计算。这使得RK3588在图像识别、语音识别、自然语言处理等人工智能领域有着极高的性能表现。 此外&#xff0c;RK3588的NPU还支持多种…

JDK-CompletableFuture

归档 GitHub: JDK-CompletableFuture 使用示例 https://github.com/zengxf/small-frame-demo/blob/master/jdk-demo/simple-demo/src/main/java/test/new_features/jdk1_8/juc/TestCompletableFuture.java基础方法使用测试&#xff1a;testThenApply2() JDK 版本 openjdk …

C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用

C# 异步编程Invoke、beginInvoke、endInvoke的用法和作用 一、Invoke Invoke的本质只是一个方法&#xff0c;方法一定是要通过对象来调用的。 一般来说&#xff0c;Invoke其实用法只有两种情况&#xff1a; Control的Invoke Delegate的Invoke 也就是说&#xff0c;Invoke前…

C++:创建线程

在C中创建线程&#xff0c;最直接的方式是使用C11标准引入的<thread>库。这个库提供了std::thread类&#xff0c;使得线程的创建和管理变得简单直接。 以下是一个简单的示例&#xff0c;展示了如何在C中使用std::thread来创建和启动线程&#xff1a; 示例1&#xff1a;…

Python基础教学之五:异常处理与文件操作——让程序更健壮

Python基础教学之五&#xff1a;异常处理与文件操作——让程序更健壮 一、异常处理概念 1. 理解异常 异常是程序运行中发生的错误或意外情况&#xff0c;比如除以零、访问不存在的列表元素等。如果不进行处理&#xff0c;异常会导致程序终止运行。在编程过程中&#xff0c;我…

【YOLOv8】 用YOLOv8实现数字式工业仪表智能读数(二)

上一篇圆形表盘指针式仪表的项目受到很多人的关注&#xff0c;咱们一鼓作气&#xff0c;把数字式工业仪表的智能读数也研究一下。本篇主要讲如何用YOLOV8实现数字式工业仪表的自动读数&#xff0c;并将读数结果进行输出&#xff0c;若需要完整数据集和源代码可以私信。 目录 &…

android 消除内部保存的数据

在Android中&#xff0c;有多种方式可以消除应用内部保存的数据。这些数据可能存储在SharedPreferences、SQLite数据库、文件&#xff08;包括缓存文件&#xff09;或Content Providers中。以下是几种常见的方法来消除这些数据&#xff1a; SharedPreferences&#xff1a; 要删…

Spring AOP的几种实现方式

1.通过注解实现 1.1导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.1.6.RELEASE</version></dependency> 1.2定义注解 import java.lang.annotation.*;Targ…

初识Laravel(Laravel的项目搭建)

初识Laravel&#xff08;Laravel的项目搭建&#xff09; 一、项目简单搭建&#xff08;laravel&#xff09;1.首先我们确保使用国内的 Composer 加速镜像&#xff08;[加速原理](https://learnku.com/php/wikis/30594)&#xff09;&#xff1a;2.新建一个名为 Laravel 的项目&a…

简过网:“三支一扶”这些政策你知道吗?

你好小编&#xff0c;我最近打算备考三支一扶&#xff0c;能介绍一些关于三支一扶的相关知识吗&#xff1f; 为了让大家更好的了解三支一扶&#xff0c;下面这篇文章&#xff0c;小编以问答的方式给大家介绍&#xff0c;希望能够帮助到你&#xff01; 1、什么是三支一扶&#…

电脑 DNS 缓存是什么?如何清除?

DNS&#xff08;Domain Name System&#xff0c;域名系统&#xff09;是互联网的重要组成部分&#xff0c;负责将人类易记的域名转换为机器可读的 IP 地址&#xff0c;从而实现网络通信。DNS 缓存是 DNS 系统中的一个关键机制&#xff0c;通过临时存储已解析的域名信息&#xf…

第一讲 基础算法

#快速排序 #include <iostream> using namespace std; const int N 1e610; int n; int q[N]; void quick_sort(int q[],int l,int r){ if(l>r)return ; int x q[l],i l-1,j r1; while(i<j){do i ;while(q[i]<x);do j--;while(q[j] > x);if(i<j)swap(…

消息队列必知必会-RabbitMQ

文章目录 RabbitMQ是什么&#xff1f;有什么特点&#xff1f;RabbitMQ架构RabbitMQ消息消费过程如何保证消息不丢失&#xff1f;可靠性传输&#xff1f;生产者丢失了数据RabbitMQ&#xff08;broker&#xff09;丢失了数据消费端丢失数据 顺序消息错乱场景解决方案 高可用普通集…

通过SSH和VNC远程连接Centos7(转载)解决linux远程SSH连接

学习笔记&#xff0c;请支持原作者 原作&#xff1a; 通过SSH和VNC远程连接Centos7-腾讯云开发者社区-腾讯云 如下附上我的远程工具putty 链接&#xff1a;https://pan.baidu.com/s/1bOhhn8uXLb9pNr-pUKcK-w?pwdnzxy 提取码&#xff1a;nzxy 学习笔记&#xff0c;请支持原…

Oracle透明数据加密:数据泵文件导出

不带加密的数据泵导出 先给hr用户赋予DATA_PUMP_DIR的读写权限&#xff1a; SQL> grant read, write on directory DATA_PUMP_DIR to hr;Grant succeeded.expdp导出配置文件&#xff1a; $ cat exp.par DIRECTORYDATA_PUMP_DIR DUMPFILEdataonly.dmp CONTENTDATA_ONLY导出…

【vueUse库Reactivity模块各函数简介及使用方法--下篇】

vueUse库是一个专门为Vue打造的工具库,提供了丰富的功能,包括监听页面元素的各种行为以及调用浏览器提供的各种能力等。其中的Browser模块包含了一些实用的函数,以下是这些函数的简介和使用方法: vueUse库Sensors模块各函数简介及使用方法 vueUseReactivity函数1. refWith…

手写函数柯里化示例

今天记录一个经典的手写面试题&#xff0c;手写函数的柯里化示例。 先说一下函数的柯里化是什么样的效果&#xff0c;举个例子&#xff0c;对于计算长方体体积的函数&#xff0c;需要传长、宽、高三个变量&#xff0c;那么可以通过&#xff08;fun为函数名&#xff09; fun(a,…

git提交大文件服务500

错误如图 需保证git服务端能接收大文件 修改项目下.git文件中的config文件&#xff0c;加入 [http] postBuffer 524288000

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意&#xff0c;while循环的退出条件是AB指针指向同一个&#xff0c;如果没有相交&#xff0c;仍然可以退出 当AB都为NULLPTR时退出