学习记录11-SPI通信(软件)

目录

前言

一、引脚定义

二、代码

1.初始化

2.操作代码

三、验证

前言

对SPI进行结构封装,方便使用。方便讲解,用W25Q64芯片进行讲解


一、引脚定义

#define SPI_CS_PROT			GPIOB	//CS接线引脚通道,
#define SPI_CS_PIN			GPIO_Pin_11

#define SPI_DO_PROT			GPIOB	//D0接线引脚通道,
#define SPI_DO_PIN			GPIO_Pin_10

#define SPI_SLK_PROT		GPIOB	//CL接线引脚通道,
#define SPI_SLK_PIN			GPIO_Pin_0

#define SPI_DI_PROT			GPIOB	//DI接线引脚通道,
#define SPI_DI_PIN			GPIO_Pin_1

#define MYSPI_W_CS(x) 		GPIO_WriteBit(SPI_CS_PROT,SPI_CS_PIN,(BitAction)(x))//对CS线进行操作
#define MYSPI_W_DI(x) 		GPIO_WriteBit(SPI_DI_PROT,SPI_DI_PIN,(BitAction)(x))//对DI线进行操作
#define MYSPI_W_SLK(x) 		GPIO_WriteBit(SPI_SLK_PROT,SPI_SLK_PIN,(BitAction)(x))//对SLK线进行操作

二、代码

1.初始化

void MySPI_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Pin = SPI_CS_PIN|SPI_SLK_PIN|SPI_DI_PIN;
 	GPIO_Init(SPI_CS_PROT, &GPIO_InitStructure);

 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;		//DO输入引脚为上拉输入,其他均为推挽输出
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		
	GPIO_InitStructure.GPIO_Pin = SPI_DO_PIN;
 	GPIO_Init(SPI_CS_PROT, &GPIO_InitStructure);
	
	MYSPI_W_CS(1);
	MYSPI_W_SLK(0);
}

注意:

在最后对CS拉高,SLK拉低。

2.操作代码

1.开始和结束代码

如图进行开始结束代码封装:

void MySPI_Start(void)
{
	MYSPI_W_CS(0);		//拉低为开始信号
}

void MySPI_Stop(void)
{
	MYSPI_W_CS(1);		//拉高为结束信号
}

2.交换字节操作

uint8_t MySPI_SwapByte(uint8_t ByteSend)	//
{
	uint8_t i;
	for(i = 0;i < 8;i ++)
	{
	MYSPI_W_DI(ByteSend & 0x80 );		//
	ByteSend <<= 1;
	MYSPI_W_SLK(1);
	if(MySPI_Read_MISO() == 1){ByteSend |= 0x01;}	//接受值为从机发送值
	MYSPI_W_SLK(0);		
	}
	
	return ByteSend;
}

注意:

ByteSend值在最后已经改变为输入的值,切记在此时值已经改变 

三、验证

1.在此对W25Q64芯片进行ID读取

读取函数:

void W25Q64_ReadID(uint8_t *MID,uint16_t *DID)
{
	MySPI_Start();
	MySPI_SwapByte(0x9F);					//进行读取ID命令
	*MID = MySPI_SwapByte(0xFF);			//将厂商ID 进行读取赋值
	*DID = MySPI_SwapByte(0xFF);
	*DID <<= 8;
	*DID |= MySPI_SwapByte(0xFF);
	MySPI_Stop();
}

显示函数:

uint8_t MID;
uint16_t DID;


int main(void)
{
	OLED_Init();
	W25Q64_Init();
	
	W25Q64_ReadID(&MID,&DID);
		
	
	OLED_ShowHexNum(1, 1, MID, 2);
	OLED_ShowHexNum(3, 1, DID, 4);
}

在此对SPI的时序进行了简单的介绍

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CAN总线记录仪在车企服务站的应用

CAN总线记录仪在车企服务站的应用 CAN总线记录仪在车企服务站中有着广泛的应用。这种设备可以记录车上的CAN总线数据&#xff0c;方便工程师进行分析&#xff0c;以找出可能存在的问题。CAN记录仪一般采用TF卡来存储数据&#xff0c;实现离线脱机实时存储。数据存储完毕后&…

【python】12.字符串和正则表达式

使用正则表达式 正则表达式相关知识 在编写处理字符串的程序或网页时&#xff0c;经常会有查找符合某些复杂规则的字符串的需要&#xff0c;正则表达式就是用于描述这些规则的工具&#xff0c;换句话说正则表达式是一种工具&#xff0c;它定义了字符串的匹配模式&#xff08;…

node各个版本的下载地址

下载地址&#xff1a; https://nodejs.org/dist/ 可以下载多个版本&#xff0c;使用nvm控制切换&#xff08;需要先安装nvm再安装node&#xff09; nvm下载地址&#xff08;访问的是github&#xff0c;请科学上网&#xff0c;下载后解压安装exe即可&#xff09;&#xff1a;h…

照片删除了还有救,19 款最佳免费照片恢复软件方法分享!

如果您曾经丢失过数字文件&#xff0c;那将是一种熟悉的感觉。也许您不小心删除了照片。或者&#xff0c;也许某些文件只是消失了。不管结果如何&#xff0c;都令人心碎。 不过&#xff0c;这个故事不需要有一个悲伤和遗憾的结局。现在有许多不同品牌的照片恢复软件可以挽救局…

《吐血整理》保姆级系列教程-玩转Fiddler抓包教程(7)-Fiddler状态面板-QuickExec命令行

1.简介 Fiddler成了网页调试必备的工具&#xff0c;抓包看数据。Fiddler自带命令行控制&#xff0c;并提供以下用法。Fiddler的快捷命令框让你快速的输入脚本命令。 除了输入默认命令&#xff0c;也可以自定义命令&#xff0c;你可以通过编辑 FiddlerScript 来增加新命令&…

Android-常用数据结构和控件

HashMap 的原理 HashMap 的内部可以看做数组链表的复合结构。数组被分为一个个的桶(bucket)。哈希值决定了键值对在数组中的寻址。具有相同哈希值的键值对会组成链表。需要注意的是当链表长度超过阈值(默认是8)的时候会触发树化&#xff0c;链表会变成树形结构。 把握HashMap的…

C练习——肇事卡车车牌号

题目&#xff1a; 一辆卡车违反交通规则&#xff0c;撞人后逃跑。现场有3人目击事件&#xff0c;但没有记住车牌号&#xff0c;只记住了车号的一些特征。 甲说&#xff1a;“牌照前两位数字是相同的”&#xff0c;乙说&#xff1a;“牌照的后两位数字是相同的&#xff0c;但与…

网络安全技术新手入门:利用Kali Linux生成简单的远程控制木马

目录 前言 一、生成远控木马 二、传播木马&#xff08;现实中通过免杀技术进行传播&#xff0c;此文章为新手入门教程&#xff0c;故通过关闭杀毒程序的方法让初学者熟悉流程&#xff09; 三、配置攻击模块 四、进行远程控制 五、建议 前言 相关法律声明&#xff1a;《中…

ERA5数据集解算Tm(水汽加权平均温度)

Part1 Tm&#xff08;代码获取方式在文章最后&#xff09; Tm 是 GNSS 反演 PWV 的关键性因素&#xff0c;由 Tm 可以求得转换因素 Π&#xff0c;Π*ZWD&#xff08;天顶湿延迟&#xff09;可以的得到 PWV。 Part 2Tm 的计算方法 Tm 的计算方法有两种&#xff0c;下面进行分…

C#编程-使用事件

使用事件 事件是一个动作或发生的事情,例如:鼠标点击、按键、鼠标移动或系统产生的通知。应用程序可以在事件发生的时候做出响应。通知的一个示例是中断。事件是对象发生的消息以表示事件的发生。事件是进程内通信的有效方法。它们对对象时有用的,因为它们标识了单个状态改…

swing快速入门(四十四)拖动、编辑JTree结点

注释很详细&#xff0c;直接上代码 新增内容&#xff08;源码细节知识点巨多&#xff0c;建议细看&#xff09; 1.设置JTree可编辑 2.使用JTree关联的数据模型实现节点的增删改 3.鼠标拖动节点事件设计及处理方法 4.手动刷新视图与自动刷新的方法区别 5.自定位节点视图方法 源码…

【Redis集群】docker实现3主3从扩缩容架构配置案例

一&#xff0c;集群规划及准备工作 架构实现&#xff1a;Redis3主3从 二&#xff0c;搭建命令 第一步&#xff0c;创建6台服务&#xff1a; docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --clust…

单表的查询练习

一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 显示所有职工的基本信息。 mysql8.0 [chap03]>select * from worker; 查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 mysq…

geemap学习笔记047:边缘检测

前言 边缘检测适用于众多的图像处理任务&#xff0c;除了上一节[[geemap046&#xff1a;线性卷积–低通滤波器和拉普拉斯算子|线性卷积]]中描述的边缘检测核之外&#xff0c;Earth Engine 中还有几种专门的边缘检测算法。其中Canny 边缘检测算法使用四个独立的滤波器来识别对角…

如何通过Burp Suite专业版构建CSRF PoC

Burp Suite是一款强大的渗透测试利器&#xff0c;可以利用它来高效的执行渗透攻击&#xff0c;接下来介绍如何通过Burp Suite Pro来构建CSRF PoC。 如果还没安装burp suite&#xff0c;请参阅【Burp Suite专业版本安装配置及使用指导 】 在Bupr中找到拦截的请求&#xff0c;右…

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解

时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解 目录 时序分解 | Matlab实现SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 SMA-CEEMDAN利用黏菌优化算法优化CEEMDAN Matlab语言…

【编码魔法师系列_构建型4】原型模式(Prototype Pattern)

学会设计模式&#xff0c;你就可以像拥有魔法一样&#xff0c;在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们&#xff08;GoF&#xff09;凝聚出来的最佳实践&#xff0c;可以提高代码的可读性、可维护性和可重用性&#xff0c;从而让我们的开发效率更高。通…

还没有自己的博客系统么 使用Docker Compose快速部署Typecho博客系统

1.准备 测试服务器ip:192.168.168.106 docker docker compose 这里不再赘述 不会的直接私信 或者直接翻历史博客 或者直接百度 2.创建目录 mkdir -p /data/Typecho 3.编写docker-compose.yaml文件 vim docker-compose.yaml文件内容如下 version: 3.7services:mysql:im…

九州金榜|15岁初三男孩抑郁休学摆烂打游戏,高压教育要不得!

有一次和朋友一块聚餐&#xff0c;邻座是一位妈妈、和她大概七八岁的儿子&#xff0c;小男孩长得很帅气&#xff0c;没有像同龄人那样调皮捣乱&#xff0c;而是和妈妈很温馨的就餐。 看的出来一家人的素质很高&#xff0c;就餐过程中桌面保持的很整洁&#xff0c;交流声音也不…