首页 > 其他分享 >I2C总线(模拟)

I2C总线(模拟)

时间:2022-10-01 16:12:18浏览次数:49  
标签:RESET SCL SET 总线 地址 SDA I2C 模拟

本次实验I2C总线传输

I2C分为硬件I2C和模拟I2C。其中硬件I2C是单独的I2C硬件驱动,有固定的引脚,和一般芯片驱动使用一样需要操作其寄存器进行数据收发而不用知道I2C的协议内容,灵活度较低但效率高;而模拟I2C是根据I2C协议、时序图,自定义引脚按照协议进行传输,较为灵活但效率较低。

使用HAL库+Proteus进行硬件I2C仿真时失败,所以选择更加普适的模拟I2C。

 

工具

  软件:Keil、CUBEMX、Proteus 、文字取模器     *注意:需要在魔法棒那勾选MicroLIB,不然会错位(目前不知道为什么)

  硬件:单片机---STM32F103C6T6A、OLED+SSD1306---UG-2864HSWEG01   

 

原理图:

  UG-2864HSWEG01:网上教程提示:总线接口需要标注

    

 

总图:PA6作为时钟线、PA7作为数据线,全部为开漏输出,外接上拉电阻

  

 

模拟I2C原理

  时序图

 

 

 

   如图所示:

  开始信号为SCL高电平时SDA由高到低,完成后SCL需要拉到低电平,让SDA的下一个数据改变做好准备,具体操作是:SCL_SET、SDA_SET、SDA_RESET、SCL_RESET

  结束信号为SCL高电平时SDA由低到高,由于此时数据传送结束,所以SCL无需拉到低电平。具体操作是:SCL_SET、SDA_RESET、SDA_SET

  ACK应答信号的接收时为SCL高电平接收信号,然后再拉到低电平。具体操作是:SCL_SET、SCL_RESET

  数据发送时为SCL拉低电平,SDA准备数据电平(拉高拉低看具体数据),然后SCL拉高电平输出,然后再拉回低电平。具体操作是:SCL_RESET、SDA_SET/SDA_RESET、SCL_SET、SCL_RESET

 

SSD1306芯片驱动原理

  寄存器介绍

    器件地址:0x78

    命令地址:0x00

    数据地址:0x40

    驱动过程简单地概括为,发送器件地址、发送寄存器地址(命令地址或数据地址)、数据内容

  初始化:查询手册可以得到初始化命令集,发送到命令地址

    命令集:0xAE,0x00,0x10,0x40,0xB0,0x81,0xFF,0xA1,0xA6,0xA8,0x3F,0xC8,0xD3,0x00,0xD5,0x80,0xD8,0x05,0xD9,0xF1,0xDA,0x12,0xDB,0x30,0x8D,0x14,0xAF

  OLED写入原理:

    如图OLED(128X64)按页、列分开书写,64行分为8页,每一页有8行,如页0xB0为8X128

    

 

 

    写入时是将8位数据写入某一页的某一列整列8位,如下图为某页的第一列写入0x47即0b01000111,高位在下

 

      

 

   所以正确的写入程序是,写入命令:起始页地址、起始列高位、起始列低位;写入数据。

     *其中,列地址高位为0x1X,低位为0x0X,实际上取高位的最后三位,取低位的最后四位组成七位即2^7=128位列序号:0~127。

   例:0x13,0x04,取高位后三位即(0x13)&(0b0111) = (0b0011)&(0b0111) = 0b0011,取低位后四位即(0x04)&(0b1111) = (0b0100)&(0b1111) = 0b0100,组成七位0b00110100 = 0d52,第52列

 

 

 

 

实验:输出文字

  取模器参数设置如下

 

 

 

 效果

 

标签:RESET,SCL,SET,总线,地址,SDA,I2C,模拟
From: https://www.cnblogs.com/toriyung/p/16744583.html

相关文章

  • 51单片机下实现软件模拟IIC通信
    1、IIC协议简易概述IIC全称Inter-IntegratedCircuit(集成电路总线),是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信......
  • 信迈AM5728 CAN总线测试及SDK升级,linux can 调试命令
    一、AM5728CAN总线测试开发板文件系统下执行如下指令,配置CAN0总线(软件上的CAN0对应为硬件上的CAN1)比特率为1MHz,并启动CAN总线:Target#canconfigcan0bitrate10000......
  • postman 模拟form Post 测试传入List<String>参数方式
    1.postman测试传入List<String>参数方式  http://www.zzvips.com/article/206812.html 2.关于postman的form-data如何传递数组形式 https://blog.csdn.net/chrispaul......
  • LIN总线帧结构及各场干扰
    一、LIN总线帧结构  一个完整的LIN总线报文帧“MessageFrame”包含报头“Header”和响应“Response”,主任务发送报头,从任务用响应来补充报头形成完整的报文。截......
  • Java 模拟Terminal连接 Linux Console 源代码
    代码和效果如下,已经转换java文件为exe文件,注意要在Pom文件里面添加依赖。  packagecom.javassh3.javassh3;/*-*-mode:java;c-basic-offset:2;indent-tabs-mode:n......
  • Vue中EventBus(事件总线)的基本用法
    vue组件中最常见的数据传递就是父子组件之间的传递,父组件可以通过props向下传数据给子组件,子组件可以通过$emit事件携带数据给父组件。然而当两个页面没有任关系,该如......
  • 模拟退火(SA)算法求解容量受限的车辆路径(CVRP)问题MATLAB代码
    SA求解CVRP问题的目标函数是车辆行驶总距离最小,输入数据是solomon算例中的rc208,因为求解的是CVRP问题,所以将rc208中的后三列全部删除,剩余4列,每一列含义如下:[序号X坐标Y坐......
  • 面试题 01.09. 字符串轮转【暴力模拟】【尾插】
    题目字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。难度:简单提示:字符串长度在[0,100000]范围内......
  • 模拟退火算法通俗讲解
    编辑:连吃十三碗校正:随心目录1. 模拟退火算法基本概念2. 模拟退火算法基本流程3. 遗传模拟退火算法matlab代码1.模拟退火算法基本概念自然凝结的、不受外界干扰而形成的......
  • CSP模拟14
    据joke3579说明,lyin做过今天的题但是给机会了。而且题目名称不管怎样都很吊。T1三分理论不对但是能过。但是场上把所有端点扒下来排序三分炸了。#include<cstdio>#inc......