I2C通信与解码笔记
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通信与解码笔记相关推荐
- STM32——stm32 I2C通信代码配置(2)(学习笔记)
STM32--I2C通信配置 I2C的系统框架 1.通讯引脚 2.时钟控制逻辑 3.数据控制逻辑 4.整体控制逻辑 通信过程 写入过程 读取过程 I2C代码配置 I2C的初始化结构体 几个重要的函数 ...
- 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 通信 ...
- linux stm32 主从,STM32F407和STM32F051主从I2C通信方法
STM32F407和STM32F051主从I2C通信方法 作者:华清远见讲师 M4作为主机: int main(void) { HAL_Init(); SystemClock_Config(); MX ...
- i2c hid 触摸板不能用_I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
I2C(Inter-Integrated Circuit)总线是由 PHILIPS(飞利浦) 公司开发的两线式串行总线,用于连接微控制器及其外围设备.是微电子通信控制领域广泛采用的一种总线标准.它是同 ...
- Python_编写UDP通信编解码类、文件的上传、远程执行命令、黏包
1.UDP通信编解码类 (1) 类 1 # ------------------UDP通信解码编码类------------------------ 2 3 from socket import * ...
- AT24C0X I2C通信原理
/*********************************************************************** AT24C0X I2C通信原理* 说明:* 之前接触A ...
- 快速对比UART、SPI、I2C通信的区别与应用
参考:带你快速对比SPI.UART.I2C通信的区别与应用! 作者:一口Linux 网址:https://mp.weixin.qq.com/s/4_RSM2jk2W6nTboO1W8HCw 电子设备之 ...
- python--字符/文本编码解码笔记
字符/文本编码解码笔记 1.字符问题 编码和解码 2.字节概要 3.基本的编解码器 编码类型史 字符编码 ASCII码 GB2312以及其他编码 UNICODE标准编码 UTF-8编码 4.了解编解码 ...
- i2c通信的详细讲解_【博文连载】SCCB(I2C)初始化时序介绍
在正式开始OV7725视频采集实现之前,Bingo不得不先讲解一下OV7725的寄存器配置接口.OV7725上电会默认输出YUV422格式的视频流,但我们希望传感器能够按照我们预期的模式工作,我们需要 ...
最新文章
- oracle怎么下载安装,Oracle数据库的下载和安装方法
- Decorator Pattern - C# 3.0 Design Patterns
- 2017百度之星初赛B场第一题Chess--简单杨辉三角问题
- webrtc服务器janus echotest学习
- .net开发中用BackgroundWorker实现多线程
- Julia:V0.3.0 正式发布,好消息!
- 【VRP】基于matlab模拟退火算法求解单中心的车辆路径规划问题【含Matlab源码 1340期】
- 全局唯一编码ID生成器
- 单片机万年历阴阳历c语言,51系列单片机的一种万年历优化算法源程序
- HFSS - 双频微带天线设计与仿真
- 深度学习之 RBF神经网络
- Makefile 编写规则
- linux 固态硬盘 分区工具,固态硬盘怎么分区?使用免费分区助手轻松搞定!
- 选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘
- python程序设计总结报告_把PPT 总结报告上传
- 华北电力大学计算机学科排名,2018年华北电力大学世界排名、中国排名、专业排名...
- day4-数字类型和列表基础
- html5水涟漪动画,CSS3水波涟漪动画定位样式制作教程
- 工具使用分享之爱思助手安装苹果APP
- 神奇宝贝/数码宝贝分类器笔记-机器学习-李宏毅2021
热门文章
- 幻想三国志 游戏流程详尽全攻略 1
- 北大计算机双证在职研究生,北京大学双证在职博士
- 19年6月23日足球推荐
- 生活中常见物联网实例_最常见的物联网安全威胁有哪些
- word出现无法加载加载项Please restart Word to load Mathtype addin properly或wps无法加载此加载项程序
- 让电脑崩溃的java代码_这些都是让程序员崩溃的瞬间...
- 微信公众号在线客服接入发方法和功能详解
- 通过log中的kill reson来定位应用是被谁杀掉的
- MavenFor this reason, future Maven versions might no longer support building such malformed projects
- 我为乘客服务 ——汉译英