STM32 | IIC OLED源码实战(第九天)

点击上方"蓝字"关注我们

01、IIC概述

I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备

它是由数据线SDA时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps

IIC是半双工通信方式,可实现一对多。

  • SDA:数据线,用于传输数据;可主机到从机,也可以从从机到主机。

  • SCL:时钟线,只能由主机发送 

  • ,用于数据同步,一个脉冲发送/接收一位数据

02、I2C通信原理/协议

l空闲状态

l开始信号

l停止信号

l应答信号

l数据的有效性

空闲状态

I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。此时各个器件的输出级场效应管均处在截止状态,即释放总线,由两条信号线各自的上拉电阻把电平拉高。

起始信号(主机发出,起始信号是针对所有的从机)

起始信号:当SCL为高期间,SDA由高到低的跳变;启动信号是一种电平跳变时序(上升沿或者下降沿)信号,而不是一个电平信号(高电平或者低电平)。

注意看启动信号的时序是由左到右进行查看。

停止信号(主机发出)

停止信号:当SCL为高期间,SDA由低到高的跳变;停止信号也是一种电平跳变时序信号,而不是一个电平信号。

注意看停止信号的时序是由左到右进行查看。

数据有效性

I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。

即:数据在SCL的上升沿到来之前就需准备好。并在在下降沿到来之前必须稳定。

注意:在主机接受数据时,使用是的上面相同的时序,只不过SCL由主机发出,SDA由从机发出,那么主机要做为输入,进行接受数据。同样的道理,在SCL为低电平区间,从机在这区间可改变数据,在SCL为高电平区间保持数据的稳定。所以主机在SCL为高电平区间判断引脚的电平从而得到对应的数据。

应答信号ACK

    发送器(STM32或者是从机)每发送一个字节,就在时钟脉冲9(前面8个脉冲周期用来发8位)期间释放数据线,由接收器反馈一个应答信号(反馈:发送一位数据,做为应答)。 应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器已经成功地接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。 

    对于反馈有效应答位ACK的要求是,接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。如果接收器是主控器,则在它收到最后一个字节后,发送一个NACK信号,以通知被控发送器结束数据发送,并释放SDA线,以便主控接收器发送一个停止信号P。

结论:

(1)每发送(主机与从机都适用)一个字节,则会(主机与从机都适用)接受一个应答信号(信号其实就是一位数据);每接收(主机与从机都适用)一个字节,则会(主机与从机都适用)发送一位应答信号(信号其实就是一位数据);

(2)规定低电平为有效应答,表示成功接受字节;规定高电平为无效应答,表示没有成功接受字节。

(3)假设主机接受数据,如果不想再接受,则发送一个无效应答(非应答)来通知从机不要再进行传输数据。

总结

天局,以自己为棋子,以写代码为代价,特别天真,英雄!!!工具!!!英雄在权力面前是拗不过的。

01、AT24C02

02、简介

l24C02是一个2K位串行CMOS 的EEPROM,内部含有256个8位字节(大小:256字节)。

l与 400KHz I2C 总线兼容

l1.8 到 6.0 伏工作电压范围

l低功耗 CMOS 技术

l写保护功能 当 WP 为高电平时进入写保护状态

l页写缓冲器

l自定时擦写周期

l1,000,000 编程/擦除周期

l可保存数据 100 年

l8 脚 DIP SOIC 或 TSSOP 封装

l温度范围 商业级 工业级和汽车级

03、引脚

04、地址查找

开发板址址:A2 = 0, A1 = 0, A0 = 0;

1、LSB的意思是:全称为Least Significant Bit,在二进制数中意为最低有效位,一般来说,MSB位于二进制数的最左侧,LSB位于二进制数的最右侧。

2、MSB的意思是:全称为Most Significant Bit,在二进制数中属于最高有效位,MSB是最高加权位,与十进制数字中最左边的一位类似。

05、读写时序

写时序

读时序

06、技术应用

一、技术应用

智能手环当中的心率传感器采用IIC协议通信

平衡车上的MPU6050

1、移植STM32103平台OLED显示代码到STM32F407平台。

a.参考图示中的OLED连接图.jpg连接好OLED

b.修改相文件的头文件为STM32F407平台的头文件

#include "stm32f10x.h"头文件修改为 #include "stm32f4xx.h"

c.使用移植核心文件中的代码(路径:D:\STM32\009\移植核心文件),移植程序

DelayInit();修改为STM32F407平台Delay_Init();

I2C_Configuration();里面的初始化修改为模拟IIC初始化(PE8 PE10)

OLED_Init();函数里面的延时函数修改为STM32F407的延时函数

d.修改函数

void WriteCmd(unsigned char I2C_Command)与void WriteDat(unsigned char I2C_Data)中的    I2C_WriteByte( ..... );      void I2C_WriteByte(uint8_t addr,uint8_t data)  {
             //启动信号    I2C_GenerateSTART(I2C1, ENABLE);//开启I2C1    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*/    //发送设备地址(一个字节)    I2C_Send7bitAddress(I2C1, OLED_ADDRESS, I2C_Direction_Transmitter);//器件地址 -- 默认0x78    //等待应答    while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));    //发送寄存器地址(一个字节)    I2C_SendData(I2C1, addr);//寄存器地址    //等待应答    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));    //发送数据(一个字节)    I2C_SendData(I2C1, data);//发送数据    //等待应答    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));            //停止信号    I2C_GenerateSTOP(I2C1, ENABLE);//关闭I2C1总线  }

e.修改主函数当中的延时函数

移植核心文件

codetab.h

/*************************************************************************************  Copyright (c), 2015, HelTec Automatic Technology co.,LTD.*            All rights reserved.** Http:    www.heltec.cn* Email:   cn.heltec@gmail.com* WebShop: heltec.taobao.com** File name: OLED.h* Project  : OLED* Processor: STC89C52* Compiler : Keil C51 Compiler* * Author : Aaron Lee* Version: 1.00* Date   : 2014.3.24* Email  : hello14blog@gmail.com* Modification: none* * Description:* 1. 128*64点整OLED模块功能演示程序的字表,仅适用heltec.taobao.com所售产品;* 2. 字表由打包资料中的“取字软件”计算得出;* 3. 取字方式 -- 共阴、列行式、逆向输出** Others: none;** Function List: none;** History: none;**************************************************************************************//***************************16*16的点阵字体取模方式:共阴——列行式——逆向输出*********/unsigned char F16x16[] ={
    0x00,0x02,0x02,0xFA,0xFA,0xAA,0xAA,0xFF,0xFF,0xAA,0xAA,0xFA,0xFA,0x02,0x02,0x00,  0x00,0x42,0x72,0x72,0x3A,0x7A,0x42,0x4B,0x5B,0x52,0x62,0x62,0x13,0x77,0x66,0x00,/*"惠",0*/  0x20,0x3C,0x1C,0xFF,0xFF,0xB0,0xB4,0x24,0x24,0x3F,0x3F,0xE4,0xE4,0x24,0x24,0x20,  0x02,0x02,0x03,0xFF,0xFF,0x00,0x01,0x05,0x1D,0x59,0xC1,0xFF,0x7F,0x01,0x01,0x01,/*"特",1*/  0x00,0x00,0x00,0xF8,0xF8,0x48,0x4C,0x4F,0x4B,0x4A,0x48,0x48,0xF8,0xF8,0x00,0x00,  0x00,0x00,0x00,0xFF,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0xFF,0x00,0x00,/*"自",2*/  0x20,0x24,0x24,0xE4,0xE4,0x24,0x24,0x24,0x30,0x10,0xFF,0xFF,0x10,0xF0,0xF0,0x00,  0x08,0x1C,0x1F,0x0B,0x0C,0x0D,0x4F,0x6E,0x34,0x1C,0x0F,0x23,0x60,0x7F,0x3F,0x00,/*"动",3*/  0x80,0xC0,0x60,0xF8,0xFF,0x07,0x02,0x00,0xFF,0xFF,0xE0,0x70,0x3C,0x1C,0x08,0x00,  0x00,0x00,0x00,0x7F,0x7F,0x04,0x06,0x03,0x3F,0x7F,0x40,0x40,0x40,0x78,0x78,0x00,/*"化",4*/};/************************************6*8的点阵************************************/const unsigned char F6x8[][6] ={
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00,// sp  0x00, 0x00, 0x00, 0x2f, 0x00, 0x00,// !  0x00, 0x00, 0x07, 0x00, 0x07, 0x00,// "  0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14,// #  0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12,// $  0x00, 0x62, 0x64, 0x08, 0x13, 0x23,// %  0x00, 0x36, 0x49, 0x55, 0x22, 0x50,// &  0x00, 0x00, 0x05, 0x03, 0x00, 0x00,// '  0x00, 0x00, 0x1c, 0x22, 0x41, 0x00,// (  0x00, 0x00, 0x41, 0x22, 0x1c, 0x00,// )  0x00, 0x14, 0x08, 0x3E, 0x08, 0x14,// *  0x00, 0x08, 0x08, 0x3E, 0x08, 0x08,// +  0x00, 0x00, 0x00, 0xA0, 0x60, 0x00,// ,  0x00, 0x08, 0x08, 0x08, 0x08, 0x08,// -  0x00, 0x00, 0x60, 0x60, 0x00, 0x00,// .  0x00, 0x20, 0x10, 0x08, 0x04, 0x02,// /  0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E,// 0  0x00, 0x00, 0x42, 0x7F, 0x40, 0x00,// 1  0x00, 0x42, 0x61, 0x51, 0x49, 0x46,// 2  0x00, 0x21, 0x41, 0x45, 0x4B, 0x31,// 3  0x00, 0x18, 0x14, 0x12, 0x7F, 0x10,// 4  0x00, 0x27, 0x45, 0x45, 0x45, 0x39,// 5  0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30,// 6  0x00, 0x01, 0x71, 0x09, 0x05, 0x03,// 7  0x00, 0x36, 0x49, 0x49, 0x49, 0x36,// 8  0x00, 0x06, 0x49, 0x49, 0x29, 0x1E,// 9  0x00, 0x00, 0x36, 0x36, 0x00, 0x00,// :  0x00, 0x00, 0x56, 0x36, 0x00, 0x00,// ;  0x00, 0x08, 0x14, 0x22, 0x41, 0x00,// <  0x00, 0x14, 0x14, 0x14, 0x14, 0x14,// =  0x00, 0x00, 0x41, 0x22, 0x14, 0x08,// >  0x00, 0x02, 0x01, 0x51, 0x09, 0x06,// ?  0x00, 0x32, 0x49, 0x59, 0x51, 0x3E,// @  0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C,// A  0x00, 0x7F, 0x49, 0x49, 0x49, 0x36,// B  0x00, 0x3E, 0x41, 0x41, 0x41, 0x22,// C  0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C,// D  0x00, 0x7F, 0x49, 0x49, 0x49, 0x41,// E  0x00, 0x7F, 0x09, 0x09, 0x09, 0x01,// F  0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A,// G  0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F,// H  0x00, 0x00, 0x41, 0x7F, 0x41, 0x00,// I  0x00, 0x20, 0x40, 0x41, 0x3F, 0x01,// J  0x00, 0x7F, 0x08, 0x14, 0x22, 0x41,// K  0x00, 0x7F, 0x40, 0x40, 0x40, 0x40,// L  0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F,// M  0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F,// N  0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E,// O  0x00, 0x7F, 0x09, 0x09, 0x09, 0x06,// P  0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E,// Q  0x00, 0x7F, 0x09, 0x19, 0x29, 0x46,// R  0x00, 0x46, 0x49, 0x49, 0x49, 0x31,// S  0x00, 0x01, 0x01, 0x7F, 0x01, 0x01,// T  0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F,// U  0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F,// V  0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F,// W  0x00, 0x63, 0x14, 0x08, 0x14, 0x63,// X  0x00, 0x07, 0x08, 0x70, 0x08, 0x07,// Y  0x00, 0x61, 0x51, 0x49, 0x45, 0x43,// Z  0x00, 0x00, 0x7F, 0x41, 0x41, 0x00,// [  0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55,// 55  0x00, 0x00, 0x41, 0x41, 0x7F, 0x00,// ]  0x00, 0x04, 0x02, 0x01, 0x02, 0x04,// ^  0x00, 0x40, 0x40, 0x40, 0x40, 0x40,// _  0x00, 0x00, 0x01, 0x02, 0x04, 0x00,// '  0x00, 0x20, 0x54, 0x54, 0x54, 0x
  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Qt历险记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值