I2C总线原理结合STM32程序进行知识回顾

        回忆总是痛苦的,毕业这么多年,学校学到的知识毕业后没再用过的话,就95%都还给老师了,剩下的5%是在在看到这个知识的时候,下意识的会说一句:“嗯,有点印象,以前学过的。”

        废话不多说,先来个时序图,热下文章。

          I2C总线是Philips公司开发的一种简单、双向二线制同步串行总线,包含一条双向的串行数据线SDA,一条串行时钟线SCL。I2C支持多个设备,每个连接到总线的设备(后文用从机代表设备,以便于与主机对应)都有其独立的地址,主机可以通过地址来查找从机。图中从机地址为7位,后面紧跟着一个数据位用来表示数据传输方向,即图中第8位,也就是R/\overline{W}位。数据位为0时表示写数据为1时表示读数据。第9位为应答位,主机在发送一个字节数据给从机后,需要得到从机给出的相应是继续发送数据还是停止,此时发送端即主机释放SDA线控制权,将SDA电平拉高,,由接收方即从机控制。若希望继续,则给出“应答(ACK)”信号,即SDA为低电平;反之给出“非应答(NACK)”信号,即SDA为高电平。

        SCL为高电平时表示有效数据,SDA为高电平表示“1”,低电平表示“0”;SCL为低电平时表示无效数据,此时SDA会进行电平切换,为下次数据表示做准备。

        结合I2C理论知识和STM32与ssd1306 OLED屏幕I2C协议的代码实现过程来进一步了解。

  • START Condition(S):SCL为高电平,SDA从低电平到高电平转换。对应的程序代码如下:
#define OLED_SCLK_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_9)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(GPIOB,GPIO_Pin_9)

#define OLED_SDIN_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_8)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(GPIOB,GPIO_Pin_8)

void I2C_Start(void)
{
	OLED_SDIN_Set();
	OLED_SCLK_Set();
	OLED_SDIN_Clr();
	OLED_SCLK_Clr();
}
  • STOP Condition(S):SCL为高电平,SDA从高电平到低电平转换。对应的程序代码如下:
void I2C_Stop(void)
{
	OLED_SCLK_Set();
	OLED_SDIN_Clr();
	OLED_SDIN_Set();
}
  •  等待应答:SCL由高变低。
void I2C_WaitAck(void) 
{
	OLED_SCLK_Set();
	OLED_SCLK_Clr();
}
  •  发送一个字节的数据:数据由高到低发送
    void Send_Byte(u8 dat)
    {
    	u8 i;
    	for(i = 0; i < 8; i++)
    	{
    		OLED_SCLK_Clr();
    		if(dat & 0x80)
    		{
    			OLED_SDIN_Set();
            }
    		else
    		{
    			OLED_SDIN_Clr();
            }
    		OLED_SCLK_Set();
    		OLED_SCLK_Clr();
    		dat <<= 1;
        }
    }

            STM32与ssd1306的I2C完整的协议实现代码为:

    void OLED_WR_Byte(u8 dat, u8 mode)
    {
    	I2C_Start();
    	Send_Byte(0x78);//芯片地址
    	I2C_WaitAck();
    	if(mode)
        {
            Send_Byte(0x40);//发送数据
        }
        else
        {
            Send_Byte(0x00);//发送命令
        }
    	I2C_WaitAck();
    	Send_Byte(dat);
    	I2C_WaitAck();
    	I2C_Stop();
    }

    其中0x78,0x40和0x00分别为ssd1306设备地址(只写),发送数据和发送命令,这三个数据需要从ssd1306芯片手册查阅得知,不作为本文重点了解内容,有需要了解的同学,可以参考以下博客:

  • 关于0.96OLED的显示过程详解(I2C通信方式)_啤酒的博客-CSDN博客_oled从机地址

  • 参考博客:I2C协议(上)——基础介绍 - 知乎
  • 总结:学海无涯,加油吧少年。

版权声明:本文为CSDN博主「crl0303」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/crl0303/article/details/121845372

生成海报
点赞 0

crl0303

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

趣聊51之串口通信(概念篇)

对于刚刚接触单片机的同学们来说,串口通信似乎是一个神秘感十足的东西,笔者在刚刚开始学习51单片机时,读的是郭天祥先生的那本著名的《新概念51单片机教程》,贼厚的一本书,但是等

8522A+7段数码管显示实验

1、8255A简介 8255A是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,

嵌入式体系结构复习笔记

寄存器表示C语言的对应关系 R0: 存储C语言函数返回值R14 : 存储C的函数返回地址R15 : 当前执行程序的代码地址 ARM的常用指令 将数据加载到寄存器:MOV/LDR子程序调用指令: BL软中断调用指