STM32——I2C和SPI波形分析

波形分析

I2C波形

//写命令

void OLED_WR_CMD(uint8_t cmd)

{

    HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x00,I2C_MEMADD_SIZE_8BIT,&cmd,1,0x100);

}

//写数据

void OLED_WR_DATA(uint8_t data)

{

    HAL_I2C_Mem_Write(&hi2c1 ,0x78,0x40,I2C_MEMADD_SIZE_8BIT,&data,1,0x100);

}

//开启OLED显示   

void OLED_Display_On(void)

{

    OLED_WR_CMD(0X8D);  //SET DCDC命令

    OLED_WR_CMD(0X14);  //DCDC ON

    OLED_WR_CMD(0XAF);  //DISPLAY ON

}

以写入0X14为例,分析I2C信号的波形。

黄色的是SCL时钟线,蓝色的是SDA数据线。

  1. 空闲电平:SCL和SDA都是高电平。
  2. 起始信号:SCL高电平,SDA拉低。
  3. 结束信号:SCL高,SDA拉高。
  4. ACK应答信号:在第9个时钟,SDA为低电平。
  5. NACK应答信号(异常应答):在第9个时钟,SDA为高电平。

上图是,地址为0x78的设备地址0x00寄存器,写入0x14的数据

①起始信号

②地址位:SCL时钟信号,上升或下降沿对应的SDA信号高低。依次为 0 1 1 1 1 0 0 0。转换为十六进制即0X78,和程序中写的地址相符合。

③应答信号

④寄存器地址:0 0 0 0 0 0 0 0(OLED中的写功能寄存器)

⑤应答信号

⑥数据DATA:依次为 0 0 0 1 0 1 0 0。转换为0X14。

⑦应答信号

⑧结束信号

SPI波形分析

/* SPI1 init function */

void MX_SPI1_Init(void)

{

  /* USER CODE BEGIN SPI1_Init 0 */

  /* USER CODE END SPI1_Init 0 */

  /* USER CODE BEGIN SPI1_Init 1 */

  /* USER CODE END SPI1_Init 1 */

  hspi1.Instance = SPI1;

  hspi1.Init.Mode = SPI_MODE_MASTER;

  hspi1.Init.Direction = SPI_DIRECTION_2LINES;

  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;

  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;

  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;

  hspi1.Init.NSS = SPI_NSS_SOFT;

  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_128;

  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;

  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;

  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;

  hspi1.Init.CRCPolynomial = 10;

  if (HAL_SPI_Init(&hspi1) != HAL_OK)

  {

    Error_Handler();

  }

  /* USER CODE BEGIN SPI1_Init 2 */

  /* USER CODE END SPI1_Init 2 */

}

根据代码中标红的部分,可以得知CLK的极性是LOW(或者说是0),CLK的相位是第一个跳变沿(也就是0)。对于CPOL和CPHA都是0的情况,推出SPI工作在模式0上。

  按程序中配置,波形应该对应上图中CPHA=0和CPOL=0。

uint16_t W25QXX_ReadID(void)

{

    volatile uint16_t Temp = 0;    //volatile调试时不会被优化掉

    W25QXX_CS_ON();               

    SPI_ReadWriteByte(0x90);//发送读取ID命令      

    SPI_ReadWriteByte(0x00);        

    SPI_ReadWriteByte(0x00);        

    SPI_ReadWriteByte(0x00);                   

    Temp|=SPI_ReadWriteByte(0xFF)<<8; 

    Temp|=SPI_ReadWriteByte(0xFF); 

    W25QXX_CS_OFF();              

    return Temp;

}

以SPI_ReadWriteByte(0x90)为例

黄色--------SCK--------PA5

深蓝--------MOSI--------PA7--------D1

粉色--------MIS0--------PA6--------D0

浅蓝--------CS

SPI的8个时钟周期读写一次数据。在CLK的上升沿,数据写入(和蓝色的线交叉)分别是 1 0 0 1 0 0 0 0 ,转换成0X90

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

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

相关文章

第三届IEEE云计算、大数据应用与软件工程国际学术会议 (IEEE-CBASE 2024,10月11-13)

第三届IEEE云计算、大数据应用与软件工程国际学术会议 ( CBASE 2024 &#xff09;将于2024年10月11—13日在中国杭州举办。 该会议在连续两届成功举办的基础上&#xff0c;本届将由浙江水利水电学院、浙江省自动化学会、浙江省科协智能制造学会联合体主办&#xff0c;浙江水利水…

【轻松拿捏】设计模式六大基本原则(一)单一职责原则(SRP - Single Responsibility Principle)

&#x1f388;边走、边悟&#x1f388;迟早会好 一. 概述 单一职责原则&#xff08;SRP - Single Responsibility Principle&#xff09;是面向对象设计中的一个基本原则。它的核心思想是&#xff1a;一个类只应有一个引起它变化的原因&#xff0c;也就是说&#xff0c;一个类…

git clone报错unable to access

网页能够访问github.com和外网&#xff0c;git 也是安装了最新版&#xff0c;但是在使用 git clone xxx 时就报错&#xff1a; $ git clone https://github.com/XXX.git Cloning into XXX... fatal: unable to access https://github.com/XXXc.git/: OpenSSL SSL_connect: SSL…

C ++初阶:C++入门级知识点

目录 &#x1f31e;0.前言 &#x1f688;1.C输入输出 &#x1f688;2.缺省参数 &#x1f69d;2.1全缺省参数 &#x1f69d;2.2半缺省参数 &#x1f688;3.函数重载 &#x1f69d;3.1参数类型不同 &#x1f69d; 3.2参数个数不同 &#x1f69d;3.3参数类型顺序不同 ​…

相似度计算方法-编辑距离 (Edit Distance)

定义 编辑距离&#xff08;Edit Distance&#xff09;&#xff0c;也称为Levenshtein距离&#xff0c;是一种衡量两个字符串相似度的方法。它定义为从一个字符串转换为另一个字符串所需的最少单字符编辑操作次数&#xff0c;这些操作包括插入、删除或替换一个字符。 计算方法 …

Mysql(三)---增删查改(基础)

文章目录 前言1.补充1.修改表名1.2.修改列名1.3.修改列类型1.4.增加新列1.5.删除指定列 2.CRUD3.新增(Create)3.1.单行插入3.2.指定列插入3.3.多行插入 4.数据库的约束4.1.约束的分类4.2.NULL约束4.3.Unique约束4.4.Default 默认值约束4.5.PRIMARY KEY&#xff1a;主键约束4.6.…

CSS的:in-range和:out-of-range伪类:增强输入验证的视觉反馈

在Web表单设计中&#xff0c;输入验证是确保用户提交有效数据的关键环节。HTML5引入了<input>元素的min和max属性&#xff0c;使得在前端就可以对数值输入进行范围限制。CSS3进一步扩展了这一功能&#xff0c;通过:in-range和:out-of-range伪类&#xff0c;开发者可以为处…

typedef std::function与回调函数

参考typedef function&#xff1c;int (int,int)&#xff1e; func_t&#xff1b;-CSDN博客 typedef std::function <void(int, int)> func1; 这段代码是C中用于创建函数类型别名&#xff08;function type alias&#xff09;的语法。让我们来逐步解释它&#xff1a; …

Linux 系统进程

一、进程介绍 进程含义&#xff1a;进行中的程序&#xff0c;就叫进程 对于一个普通的用户进程&#xff0c;它的父进程就是执行它的哪个Shell&#xff0c;对于Linux而言&#xff0c;Shell就是bash。 [root10 bin]# cd /bin | ls bash bash [root10 bin]# 1、所有进程追溯其祖先…

谷哥剪映助手实操,批量自动化制作左右分屏视频

我给大家介绍如何用谷哥剪映助手&#xff0c;配合剪映批量制作左右分屏或上下分屏视频。 首先我们准备好剪映参考草稿&#xff0c;草稿里有主轨和复轨两条素材。一般情况下&#xff0c;副轨比主轨时长更长。剪映助手将根据主轨时长裁切副轨。 这里需要注意的是&#xff0c;在批…

docker容器引用glibc库

Alpine使用的不是正统的glibc&#xff0c;对于一些强依赖glibc的系统建议不要使用Alpine&#xff0c;如果一定要使用&#xff0c;可以通过挂载离线库文件来实现。 1、通过docker-compose.yml解决 vim docker-compose.yml core: container_name: core image: /app/co…

十五年以来 — 战略性云平台服务的演进路径之全面呈现(含亚马逊、微软和谷歌)

Gartner每年都发布对全球IaaS平台进行评估的魔力象限报告。2023年底&#xff0c;Gartner将此项评估的名称改为“战略性云平台服务”&#xff08;Strategic cloud platform services&#xff09;&#xff0c;尽管其核心仍为IaaS&#xff0c;但是&#xff0c;毫无疑问&#xff0c…

90. UE5 RPG 实现技能的装配

在上一篇里&#xff0c;我们实现了在技能面板&#xff0c;点击技能能够显示出技能的相关描述以及下一级的技能的对应描述。 在这一篇里&#xff0c;我们实现一下技能的装配。 在之前&#xff0c;我们实现了点击按钮时&#xff0c;在技能面板控制器里存储了当前选中的技能的相关…

ZooKeeper工作原理

1. ZooKeeper工作原理 1.1 ZooKeeper角色 领导者&#xff08;Leader&#xff09;&#xff1a;在Zookeeper集群中&#xff0c;Leader是负责管理集群事务的节点。它负责处理所有的写请求&#xff0c;并将这些请求转化为事务&#xff0c;并提交事务日志。Leader节点还负责发起和决…

天池工业AI-第10名思路分享

关联比赛: 天池工业AI大赛-智能制造质量预测 赛题分析 本次比赛提供了1000余个包含8000维特征的TFT-LCD&#xff08;薄膜晶体管液晶显示器&#xff09;生产样本数据&#xff0c;属于典型的小样本、多特征回归问题。 该问题有如下痛点与挑战&#xff1a; 1&#xff09;TFT-…

用C#写一个随机音乐播放器

form1中namespce里的代码如下 public partial class Form1 : Form {public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){string folder textBox1.Text;string folderPath folder; // 指定音频文件所在的文件夹路径OpenRandomFi…

vue项目上线打包后出现的问题

1、出现空白页 1.1 打包路径&#xff1a; module.exports {publicPath:./, //修改为绝对路径 } 修改完打包路径后build可以展示页面 1.2 路由模式&#xff1a; 项目上线要求是history模式&#xff0c;需要后端做重定向 前端自测可以使用h…

JavaWeb笔记_FilterListener

一.过滤器 1.1 过滤器概述 过滤器主要用来拦截目标资源&#xff08;静态资源或动态资源&#xff09;的请求和响应 &#xff08;类似地铁的安检&#xff09; 我们访问动态或静态资源都要通过URL访问&#xff1a;http://localhost:8080/... 所以过滤器本质上拦截的是URL 1.2 过滤…

详解Qt事件过滤器

文章目录 前言什么是事件过滤器事件过滤器的作用为什么要使用事件过滤器事件过滤器的基本用法示例代码一&#xff1a;基本事件过滤器示例代码二&#xff1a;过滤键盘事件示例代码三&#xff1a;多对象事件过滤 总结 前言 Qt 提供了一个强大的机制来处理和管理事件&#xff0c;…

Git 使用与问题解决指南20240729

Git 使用与问题解决指南 引言 Git 是一个强大的分布式版本控制系统&#xff0c;用于跟踪项目中的更改。它在协作开发、代码管理和版本控制中发挥着至关重要的作用。本文将总结常见的 Git 问题及其解决方案&#xff0c;并提供一些最佳实践&#xff0c;以帮助开发者更高效地使用…