波形分析
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数据线。
- 空闲电平:SCL和SDA都是高电平。
- 起始信号:SCL高电平,SDA拉低。
- 结束信号:SCL高,SDA拉高。
- ACK应答信号:在第9个时钟,SDA为低电平。
- 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。