STM32——I2C和SPI波形分析

news2024/9/22 4:04:11

波形分析

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.coloradmin.cn/o/2051207.html

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

相关文章

【Linux线程】线程的深度解析(线程是什么?线程与进程区别是什么?)

目录 一、前言 二、 什么是线程 &#x1f4a7;线程的引入&#x1f4a7; &#x1f4a7;线程的基本概念 &#x1f4a7; &#x1f4a7;线程的理解 &#x1f4a7; &#x1f4a7;进程与线程的关系&#x1f4a7; &#x1f4a7;程序如何划分&#xff08;重拾页表、见一下LWP&…

行业分析---AI时代是不断更新自身技术还是会利用新技术?

1 背景 最近有两个热点新闻&#xff0c;&#xff08;1&#xff09;“孟晚舟建议不要选和机器竞争的职业&#xff0c;根本不是它的对手”&#xff1b;&#xff08;2&#xff09;“周鸿祎建议萝卜快跑把无人出租车卖给司机&#xff0c;可实现三赢”。 技术的变革在互联网领域是比…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

音频剪辑用什么工具?试试这三款

音乐&#xff0c;是情感的传递者&#xff0c;是灵魂的慰藉。作为一名音乐人&#xff0c;我一直在探索如何更好地捕捉和表达音乐的精髓。在这个数字化的时代&#xff0c;音频剪辑软件成为了我们表达创意的重要工具。今天&#xff0c;我想从一个音乐人的角度&#xff0c;分享我使…

C语言每日好题(3)

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 #define _CRT_SECURE_NO_WARNING #include <stdio.h> #include <string.h> int main(void) {if ((strlen("abc") - strlen("abcdef")) > 0)printf(">\n")…

CentOS 7 下载/安装

下载 centos安装包下载_开源镜像站-阿里云centos安装包是阿里云官方提供的开源镜像免费下载服务&#xff0c;每天下载量过亿&#xff0c;阿里巴巴开源镜像站为包含centos安装包的几百个操作系统镜像和依赖包镜像进行免费CDN加速&#xff0c;更新频率高、稳定安全。https://mir…

SpringBoot(一)

1.Spring Boot概要 1.1 SpringBoot介绍 随着动态语言的流行&#xff08;Ruby、Scala、Node.js&#xff09;, Java的开发显得格外的笨重&#xff1b;繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术整合难度大。 在上述环境下&#xff0c;Spring Boot由此诞生&#…

每天五分钟计算机视觉:搭建人脸识别的Siamese深度神经网络模型

本文重点 前面的一篇文章中介绍了关于一次学习的问题,解决一次学习问题的关键在于学习到一个函数d,这个d可以计算出两张图片中的人脸是不是同一个人。那么我们需要搭建什么样的神经网络才可以让模型学习出这样的函数d呢?本文我们介绍一下Siamese神经网络结构,它可以帮助我…

快速上手体验MyPerf4J监控springboot应用(docker版快速开始-本地版)

使用MyPerf4J监控springboot应用 快速启动influxdb时序数据库日志收集器telegrafgrafana可视化界面安装最终效果 项目地址 项目简介: 一个针对高并发、低延迟应用设计的高性能 Java 性能监控和统计工具。 价值 快速定位性能瓶颈快速定位故障原因 快速启动 监控本地应用 idea配…

BeagleBone Black 上手

芯片特性 板级功能 资源内存 SDRAM 512MB DDR3L 800MHZ A single 256Mb x16 DDR3L 4Gb (512MB) memory device is used. The memory used is one of two devices: MT41K256M16HA-125 from Micron D2516EC4BXGGB from Kingston It will operate at a clock frequency of 400M…

DDD领域驱动设计的原理与实践

目录 什么是DDD领域驱动设计&#xff1f; 定义与概念&#xff1a; 核心思想&#xff1a; 核心概念&#xff1a; 核心原则&#xff1a; 优势与应用&#xff1a; 与微服务架构和传统三层架构的关系&#xff1a; 理解领域模型 举例 统一语言&#xff08;Ubiquitous Langu…

【C++11】入门基础

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;C从入门至进阶 这里将会不定期更新有关C/C的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目录…

基于Kotlin Multiplatform实现静态文件服务器(三)

Expect 和 Actual expect 关键字用于定义一个多平台通用的声明&#xff0c;即该声明在所有平台上都可用&#xff0c;并且需要在特定平台上实现。actual 关键字通常与 expect 关键字配合使用&#xff0c;用于定义多平台通用的接口和函数&#xff0c;从而允许在不同的平台上使用…

PyTorch--深度学习

onux部署功能 cpu运行时间 3. 自动求导 求导结果为&#xff1a;2 1 1

在java中前后端进行交互使用的内容

前言 本文将讲解在java前后端进行交互时会使用的内容, 过滤器 , 前后端交互时: 同步请求(了解)与异步请求, 后端响应json格式数据, 后端标准响应数据格式 过滤器 首先需要了解什么是过滤器: 过滤器是javaEE中在前向后端发送请求时进行拦截的技术,作用…

Linux系统编程(10)线程资源回收和互斥锁

一、pthread_cancel函数 pthread_cancel 函数用于请求取消一个线程。当调用 pthread_cancel 时&#xff0c;它会向指定的线程发送一个取消请求。 #include <pthread.h>int pthread_cancel(pthread_t thread);thread&#xff1a;要发送取消请求的线程标识符。 成功时&a…

函数递归,匿名、内置行数,模块和包,开发规范

一、递归与二分法 一&#xff09;递归 1、递归调用的定义 递归调用&#xff1a;在调用一个函数的过程中&#xff0c;直接或间接地调用了函数本身 2、递归分为两类&#xff1a;直接与间接 #直接 def func():print(from func)func()func() # 间接 def foo():print(from foo)bar…

mac安装ipd包【金铲铲为例】

mac安装ipd包 安装PlayCover 链接&#xff1a;https://github.com/PlayCover/PlayCover 1、点最新Releases 2、cmd ↓&#xff0c;拉到最下面下载dmg 3、安装 图标拖拽到Applications里 IPA下载 以金铲铲为例&#xff0c;良心砸壳包站点&#xff0c;有能力可以支持一下…

系列:水果甜度个人手持设备检测-行业法律法规

系列:水果甜度个人手持设备检测 --行业法律法规 背景 由于我们目标是制作针对水果的便携或手持式检测仪器&#xff0c;既然是民用产品&#xff0c;必然受一系列法律法规的约束&#xff0c;产品在上市之前将会受各种国家标准和地方标准的检验。本篇章中我们采用启发性搜索的方…

Python自动化:解锁高效工作与生产力的密钥

在当今快节奏的数字时代&#xff0c;自动化已成为提升工作效率、优化流程、减少人为错误的不可或缺的工具。Python&#xff0c;作为一种功能强大、易于学习且应用广泛的编程语言&#xff0c;在自动化领域扮演着举足轻重的角色。无论是数据处理、Web自动化、软件测试&#xff0c…