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

基于STM32F103和OLED的波形显示是一种通过STM32F103微控制器驱动OLED屏幕显示波形的应用。STM32F103是一款基于ARM Cortex-M3内核的单片机,具有丰富的外设资源,包括GPIO、定时器、SPI等。OLED(有机发光二极管)是一种具有自发光和高对比度特点的显示技术。 首先,我们需要将STM32F103与OLED连接起来。通过SPI接口或I2C接口连接STM32F103和OLED屏幕。然后,在STM32F103的程序中,我们需要配置SPII2C的相关寄存器,设置通信参数和时钟频率,以确保STM32F103能够正确地与OLED通信。 接下来,我们需要准备波形数据。可以通过STM32F103的ADC模块进行模拟信号采样,或者通过其他方式获取数字化的波形数据。将获取的波形数据存储在STM32F103的存储器中,例如数组或缓冲区。 然后,在STM32F103的程序中,我们需要编写相应的代码来读取波形数据,并将其发送给OLED屏幕进行显示。根据OLED的驱动程序,我们可以通过SPII2C发送命令和数据来控制OLED的显示。通过逐点方式,将波形数据发送给OLED,以在屏幕上显示出波形。 为了实时显示波形,我们可以使用定时器中断来定时刷新屏幕上的波形数据。在每个定时器中断中,我们可以更新屏幕的显示,将新的波形数据发送给OLED进行更新。 此外,为了更好地显示波形,我们可以添加一些图形化的界面元素,例如坐标轴、刻度线等,以增强用户的可视化体验。 总而言之,基于STM32F103和OLED的波形显示是一种通过STM32F103微控制器驱动OLED屏幕显示波形的应用。通过合理的硬件连接和程序设计,我们可以实现波形的实时显示,并提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值