当前位置: 首页 > news >正文

单片机学习笔记.IIC通信协议(根据数据手册写IIC驱动程序,这里以普中开发板上的AT24C02为例)

 硬件原理图:

 


 AT24C02数据图:


I2C电路规范:

  • 所有I2C设备的时钟线SCL和数据线SDA连在一起
  • 设备的SCL和SDA都要配置为开漏输出模式
  • SCL和SDA各需要添加一个 上拉电阻,阻值一般为4.7k
  • 开漏输出模式和上拉电阻共同作用实现了线与的功能,解决了多机通信的问题

首先根据原理图定义对应引脚: 

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

I2C时序图:

 I2C起始信号:

/*** @brief  I2C起始* @param  无* @retval 无*/
void I2C_Start(void)
{I2C_SDA=1;//这里SDA置1是因为可能数据不是刚开始才发送,可能是从停止位开始,SDA可能为0,I2C_SCL=1;//因为SCL每次最后都是低电平,这个时候SDA可以改变,起始条件是开始都为1I2C_SDA=0;I2C_SCL=0;
}

I2C停止信号:

/*** @brief  I2C停止  * @param  无* @retval 无*/
void I2C_Stop(void)
{I2C_SDA=0;//保证SDA拉高前是0I2C_SCL=1;I2C_SDA=1;
}

 I2C发送一个字节:

写入一个字节时序分析:

 

/*** @brief  I2C发送一个字节* @param  Byte* @retval 无*/
void I2C_SendByte(unsigned char Byte)//由时序图可知在调用该函数是SCL为低电平,                                  
{                                    //此时直接改变SDA的电平unsigned char  i;	for( i=0;i<8;i++){I2C_SDA=Byte&(0x80>>i);               ////I2C协议先存的是最高位然后依次存I2C_SCL=1;  //由数据手册可知时间可以不加延时I2C_SCL=0;}
}

I2C接收一个字节:

 

  • 在SCL低电平期间从机将数据位依次放到SDA线上还是高位在前,然后拉高SCL,读取数据位,在该期间SDA不能变化

  • 在主机接收时,主机需要释放SDA

/*** @brief   I2C接收一个字节* @param   无* @retval  Byte*/
unsigned char I2C_ReceiveByte(void)
{unsigned char Byte=0x00;unsigned char  i;	I2C_SDA=1;//释放总线for( i=0;i<8;i++){I2C_SCL=1;//I2C协议规定在SCL=1时读取if(I2C_SDA){Byte|=(0x80>>i);}//如果读取到SDA=1,就把Byte的最高位置1I2C_SCL=0;//读完后拉低}return Byte;
}

 I2C发送应答:

 

  • 发送应答:在接收完一个字节之后,主机在下一个时钟发送一位数据,数据0表示应答,数据1表示非应答
/*** @brief  I2C发送应答* @param  AckBit 应答位为0应答,为1无应答* @retval 无*/
void I2C_SendAck(unsigned char AckBit)
{I2C_SDA=AckBit;I2C_SCL=1;I2C_SCL=0;
}

 I2C接收应答:

 

  • 接收应答:在发送完一个字节之后,主机在下一个时钟接收一位数据,判断从机是否应答,数据0表示应答,数据1表示非应答(主机在接收之前,需要释放SDA)  
/*** @brief  I2C接收应答* @param  无* @retval AckBit 应答位为0应答,为1无应答*/
unsigned char I2C_ReceiveAck(void)
{unsigned char AckBit;I2C_SDA=1;//主机接收前,先释放SDAI2C_SCL=1;//读取AckBit=I2C_SDA;I2C_SCL=0;return AckBit;//为0应答,为1无应答
}

 

http://www.lryc.cn/news/590296.html

相关文章:

  • 【深度学习基础】PyTorch中model.eval()与with torch.no_grad()以及detach的区别与联系?
  • 嵌入式学习-PyTorch(5)-day22
  • 人工智能时代下的数据新职业:新兴工作岗位版图研究
  • 智能体架构深度解构:一次用户请求的完整旅程
  • 第二十一 篇 PDF文档自动化:Python一键合并、分割、水印、提取与加密解密!你的PDF全能管家!
  • audiorecord 之 抢占优先级
  • rLLM:用于LLM Agent RL后训练的创新框架
  • ESP32 S3 基于 Arduino 实现局域网视频流传输全解析
  • Python从入门到高手9.2节-Python字典的操作方法
  • 多维动态规划题解——不同路径【LeetCode】记忆化搜索
  • NumPy 常用操作详解汇总和实战示例
  • 泰语OCR识别技术方案
  • 【React Native】安装配置 Expo Router
  • STM32 ODR
  • obsidian1.8.10_win中文_Markdown编辑器_安装教程
  • 逆功率检测设备防逆流解决方案守护电网安全
  • 第五章 管道工程 5.4 管道安全质量控制
  • Uniswap V2/V3/V4简短说明
  • 功能测试和回归测试
  • 架构设计之计算高性能——单体服务器高性能
  • 更灵活方便的初始化、清除方法——fixture【pytest】
  • 使用Node搭建一个直播服务器,实时直播当前桌面
  • 获取印度股票数据API实例:NSE与BSE双市场对接指南
  • Python类中魔术方法(Magic Methods)完全指南:从入门到精通
  • [特殊字符]️ Snort 与 Suricata 入侵检测系统详解
  • 热点综述│高效泛化求解新范式:神经算子综述
  • IIS网站间歇性打不开暴力解决方法
  • 问题处理——qgroundcontrol强制全屏,怎么退出。
  • 20、鸿蒙Harmony Next开发:组件导航(Navigation)和页面路由(@ohos.router)
  • kafka3.6下载安装(传统架构/KRaft模式)+实例测试