本次实验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