STM32模拟IIC驱动OLED屏 原理+源码 您所在的位置:网站首页 sra-12vdc-al电路图 STM32模拟IIC驱动OLED屏 原理+源码

STM32模拟IIC驱动OLED屏 原理+源码

2023-08-04 16:14| 来源: 网络整理| 查看: 265

处理器和芯片间的通信可以形象的比喻成两个人讲话:1、你说的别人得能听懂:双方约定信号的协议。2、你的语速别人得能接受:双方满足时序要求。 一、IIC总线的信号类型 开始和停止信号 1、开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。

2、停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。 二、IIC数据传输过程 、IIC数据传输 1、在数据传输时,SDA的数据在SCL为高电平时,必须保持稳定,SCL高电平器件完成数据的传输。在SCL低电平器件,可以任意改变SDA的数据。数据写入过程是从最好为开始,高位在前,低位在后,即MSB。 2、响应信号(ACK):接收器在接收到8位数据后,在第9个时钟周期,拉低SDA电平。即接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。 三、数据写入的过程 写入数据过程 首先发送一个开始信号,接着发送从机地址,OLED的从机地址前7位为地址,最后一位表示读(1)或者写(0)。应答ACK信号表示有这个从设备存在。在接收到应答信号后,发送控制位,来区分之后所发送的数据是控制命令还是显示相关的数据。在发送控制位后,等待应答信号。然后发送相应的控制命令或者数据。最后发送停止信号,表示数据传输完成。

基本的时序就是以上内容,接下来是源码:

#include "stm32f10x.h" #include "iic.h" #include "delay.h" #include "codetab.h" /** ** 初始化IIC接口 **/ void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructer; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructer.GPIO_Pin=GPIO_Pin_6 | GPIO_Pin_7; //6--SCL 7--SDA GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructer); } /** ** 设置SDA为输出 **/ void SDA_OUT(void) { GPIO_InitTypeDef GPIO_InitStructer; GPIO_InitStructer.GPIO_Pin= GPIO_Pin_7; GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructer); } /** ** 设置SDA为输入 **/ void SDA_IN(void) { GPIO_InitTypeDef GPIO_InitStructer; GPIO_InitStructer.GPIO_Pin= GPIO_Pin_7; GPIO_InitStructer.GPIO_Speed=GPIO_Speed_50MHz; GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructer); } //开始信号 void IIC_Start(void) { SDA_OUT(); IIC_SDA=1; IIC_SCL=1; delay_us(2); IIC_SDA=0; delay_us(2); IIC_SCL=0; delay_us(2); } void IIC_Stop(void) { IIC_SCL=1; IIC_SDA=0; delay_us(2); IIC_SDA=1; delay_us(2); } /* * 返回1--应答出错 * 放回0--应答正确 */ u8 IIC_Wait_Ask(void) { int count=0; SDA_IN(); IIC_SCL=1; delay_us(2); while(READ_SDA) { count++; if(count>250) { IIC_Stop(); return 1; } } IIC_SCL=0; delay_us(2); return 0; } //写一个字节 void IIC_WriteByte(u8 data) { u8 i; SDA_OUT(); for(i=0;i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有