STM32——I2C和SPI波形分析

news/2024/9/22 13:48:32/

波形分析

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.ppmy.cn/news/1511166.html

相关文章

Linux系统性能调优

Linux系统性能调优是一个复杂而细致的过程&#xff0c;它涉及到硬件、软件、内核参数以及进程管理等多个方面。通过合理的调优措施和持续的监控调整&#xff0c;可以显著提升Linux系统的运行效率和稳定性。以下将详细介绍Linux系统性能调优的技巧&#xff0c;涵盖硬件、软件、内…

js使用text/template制作模板

如果你想把模板内容放在HTML文件中&#xff0c;并通过JavaScript加载和渲染这些模板&#xff0c;你可以采用以下几种方法&#xff1a; 1. 使用 <script> 标签作为模板容器 可以使用 <script> 标签来存储模板内容&#xff0c;并设置 type 属性为一个特殊的值&…

Pytorch中transform的应用

在PyTorch中&#xff0c;transforms模块主要用于对图像进行预处理和数据增强&#xff0c;以便于训练深度学习模型。这些转换操作可以包括裁剪、缩放、旋转、翻转等&#xff0c;以及对图像进行标准化处理。下面将详细介绍一些常用的transforms操作及其应用。 1. 常用的transfor…

《AI视频类工具之十七——​ Fliki.ai》

一.简介 官网:https://fliki.ai/ Fliki.ai 是一个在线视频制作平台,它提供了一系列的功能来帮助用户快速创建专业级别的视频内容。 二.功能介绍 1、免费使用: Fliki.ai 是一个免费的在线视频制作工具,用户可以免费访问其基本功能。2、丰富的模板: 平台提供了多种视频模…

Operator 运算符 || 可调用对象

运算符重载 重载&#xff1a;在同一个作用域内定义多个同名函数&#xff0c;这些函数具有不同的参数列表或函数体。泛型&#xff1a;允许编写代码时不指定具体的数据类型重载运算符&#xff0c;可以重新定义运算符的行为几元运算符&#xff1a;包含几个运算对象&#xff0c;重…

FFmpeg源码:av_log2函数分析

一、av_log2函数的声明 av_log2函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0.1&#xff09;的头文件libavutil/common.h中&#xff1a; #ifndef av_log2 av_const int av_log2(unsigned v); #endif 该函数作用是&#xff1a;求形参v是2的多少次幂&#…

record 关键字

public record GetTemplateSettingsRequest(string SubjectUuid, SubjectType SubjectType) : IRequest<TemplateSettingsVO>; 使用了 C# 9 引入的新特性 record 来定义一个不可变的数据结构。以下是对这行代码的详细解释&#xff1a; 1. record 关键字 record 是 C# …

基于微信小程序地图实现点位标注、覆盖物、地图聊天

目录 小程序部分map标签的使用获取用户经纬度并转换地址地图点击事件覆盖物标注点击并实现弹窗交互数据库及接口部分数据库表结构设计API搭建小程序接口使用注意事项wx.getLocation深入控制地图小程序部分 map标签的使用 创建小程序的步骤这里不再重复赘述,在wxml页面中放一个…