I2C开始

根据如下图显示是I2C开始的的信号处理,从左到有的来看,在SCL为1高电平时候,SDA发生了由 1高电平0低电平 的转换。

void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}

I2C结束

在SCL为1高电平时候,SDA发生了由 0低电平1高电平 的转换。

SDA=0;
SCL=1;
SDA=1;

I2C接收的方法与波形对比

遵循上面的时序分析的思路,我们查看接收数据位的波形变化。

接收一个字节:SCL低电平期间,从机将数据位依次放到SDA线上(高位在前),然后拉高SCL,主机将在SCL高电平期间读取数据位,所以SCL高电平期间SDA不允许有数据变化,依次循环上述过程8次,即可接收一个字节(主机在接收之前,需要释放SDA)

下面的代码,假如byte发送的字节为0xFE = 1111 1110;采用的思想就是按位循环的把这些数字给出来,的方式就是用 1 分别 到最后一位(也就是 按位与 )。

void I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);I2C_SCL=1;I2C_SCL=0;}
}

代码每次按位与执行的操作。
第一次:
1111 1110 & 1000 0000 = 1000 0000

第二次:
1111 1110 & 0100 0000 = 0100 0000

第三次:
1111 1110 & 0010 0000 = 0010 0000

第四次:
1111 1110 & 0001 0000 = 0001 0000

第五次:
1111 1110 & 0000 1000 = 0000 1000

依次到最后一位

第八次:
1111 1110 & 0000 0001 = 0000 0000

下面是接收一个字节的代码逻辑

//用一个空的字节去接收,依次进行循环,如果收到SDA为1,移位到 `下标i` 的位置处。
unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA=1;for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;
}

接收应答的波形变化与对应的代码逻辑


注意上图的红框位置,表示的是电平信号发送变换的部分

如下是I2C接收应答,发送数据全部代码

#include <REGX52.H>sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;/*** @brief  I2C开始* @param  无* @retval 无*/
void I2C_Start(void)
{I2C_SDA=1;I2C_SCL=1;I2C_SDA=0;I2C_SCL=0;
}/*** @brief  I2C停止* @param  无* @retval 无*/
void I2C_Stop(void)
{I2C_SDA=0;I2C_SCL=1;I2C_SDA=1;
}/*** @brief  I2C发送一个字节* @param  Byte 要发送的字节* @retval 无*/
void I2C_SendByte(unsigned char Byte)
{unsigned char i;for(i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);I2C_SCL=1;I2C_SCL=0;}
}/*** @brief  I2C接收一个字节* @param  无* @retval 接收到的一个字节数据*/
unsigned char I2C_ReceiveByte(void)
{unsigned char i,Byte=0x00;I2C_SDA=1;for(i=0;i<8;i++){I2C_SCL=1;if(I2C_SDA){Byte|=(0x80>>i);}I2C_SCL=0;}return Byte;
}/*** @brief  I2C发送应答* @param  AckBit 应答位,0为应答,1为非应答* @retval 无*/
void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}/*** @brief  I2C接收应答位* @param  无* @retval 接收到的应答位,0为应答,1为非应答*/
unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA=1;I2C_SCL=1;AckBit=I2C_SDA;I2C_SCL=0;return AckBit;
}

图片资源来自 B站江科大自化协老师《51单片机入门教程-2020版 程序全程纯手打 从零开始入门》

I2C通信与解码笔记相关推荐

  1. STM32——stm32 I2C通信代码配置(2)(学习笔记)

    STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...

  2. OLED显示屏 IIC/I²C/I2C通信 128*64分辨率 SH1106 / SSD1306 驱动教程

    OLED显示屏 IIC/I²C/I2C通信 128*64分辨率 SH1106 / SSD1306 驱动教程 一.OLED液晶屏 二.SH1106 I2C 驱动 1.SH1106 简介 2.I2C 通信 ...

  3. linux stm32 主从,STM32F407和STM32F051主从I2C通信方法

    STM32F407和STM32F051主从I2C通信方法 作者:华清远见讲师 M4作为主机: int main(void) { HAL_Init(); SystemClock_Config(); MX ...

  4. i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记

    I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...

  5. Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包

    1.UDP通信编解码类 (1) 类 1 # ------------------UDP通信解码编码类------------------------ 2 3 from socket import * ...

  6. AT24C0X I2C通信原理

    /*********************************************************************** AT24C0X I2C通信原理* 说明:* 之前接触A ...

  7. 快速对比UART、SPI、I2C通信的区别与应用

    参考:带你快速对比SPI.UART.I2C通信的区别与应用! 作者:一口Linux 网址:https://mp.weixin.qq.com/s/4_RSM2jk2W6nTboO1W8HCw 电子设备之 ...

  8. python--字符/文本编码解码笔记

    字符/文本编码解码笔记 1.字符问题 编码和解码 2.字节概要 3.基本的编解码器 编码类型史 字符编码 ASCII码 GB2312以及其他编码 UNICODE标准编码 UTF-8编码 4.了解编解码 ...

  9. i2c通信的详细讲解_【博文连载】SCCB(I2C)初始化时序介绍

    在正式开始OV7725视频采集实现之前,Bingo不得不先讲解一下OV7725的寄存器配置接口.OV7725上电会默认输出YUV422格式的视频流,但我们希望传感器能够按照我们预期的模式工作,我们需要 ...

最新文章

  1. oracle怎么下载安装,Oracle数据库的下载和安装方法
  2. Decorator Pattern - C# 3.0 Design Patterns
  3. 2017百度之星初赛B场第一题Chess--简单杨辉三角问题
  4. webrtc服务器janus echotest学习
  5. .net开发中用BackgroundWorker实现多线程
  6. Julia:V0.3.0 正式发布,好消息!
  7. 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
  8. 全局唯一编码ID生成器
  9. 单片机万年历阴阳历c语言,51系列单片机的一种万年历优化算法源程序
  10. HFSS - 双频微带天线设计与仿真
  11. 深度学习之 RBF神经网络
  12. Makefile 编写规则
  13. linux 固态硬盘 分区工具,固态硬盘怎么分区?使用免费分区助手轻松搞定!
  14. 选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘
  15. python程序设计总结报告_把PPT 总结报告上传
  16. 华北电力大学计算机学科排名,2018年华北电力大学世界排名、中国排名、专业排名...
  17. day4-数字类型和列表基础
  18. html5水涟漪动画,CSS3水波涟漪动画定位样式制作教程
  19. 工具使用分享之爱思助手安装苹果APP
  20. 神奇宝贝/数码宝贝分类器笔记-机器学习-李宏毅2021

热门文章

  1. 幻想三国志 游戏流程详尽全攻略 1
  2. 北大计算机双证在职研究生,北京大学双证在职博士
  3. 19年6月23日足球推荐
  4. 生活中常见物联网实例_最常见的物联网安全威胁有哪些
  5. word出现无法加载加载项Please restart Word to load Mathtype addin properly或wps无法加载此加载项程序
  6. 让电脑崩溃的java代码_这些都是让程序员崩溃的瞬间...
  7. 微信公众号在线客服接入发方法和功能详解
  8. 通过log中的kill reson来定位应用是被谁杀掉的
  9. MavenFor this reason, future Maven versions might no longer support building such malformed projects
  10. 我为乘客服务 ——汉译英