详解通信协议之IIC通信协议

这篇具有很好参考价值的文章主要介绍了详解通信协议之IIC通信协议。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

详解通信协议之IIC通信协议

本文结合AT24C02对IIC通信协议原理进行了描述。

IIC通信协议(以AT24C02为例)

IIC通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发双向同步半双工串行总线,只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传送信息。IIC总线是一种共享的串行总线,是用于两个设备之间的短距离低速速率(250K左右)通信。长距离用can总线。

  1. IIC数据有效性
    数据在时钟线(SCL)为高电平时,数据线(SDA)要稳定保持稳定,时钟线为低电平时,数据线任意变化。
    iic通信协议,单片机,嵌入式硬件
  2. 起始和结束条件
    起始条件:当SCL为高电平时,SDA由高到低的跳变为起始信号。
    结束条件:当SCL为高电平时,SDA由低到高的跳变为结束信号。
    iic通信协议,单片机,嵌入式硬件
  3. 应答信号
    当主机向从机发送完一个字节的数据,主机需要从机给出一个应答信号,用来确认是否接收到了数据。从机的应答信号的时钟仍然是主机提供的,应答信号出现在8位数据之后的那一个时钟周期。低电平:表示接收成功,高电平:表示接收失败。
  4. 数据帧格式
    起始信号–>从机地址+数据传输方向(0为主机发送,1为主机接收)–>数据交换–>结束信号。
    iic通信协议,单片机,嵌入式硬件

注意:在数据方向进行变换时,需要重新发送起始信号和期间地址+读写状态。

  1. 以AT24C02为例,模拟IIC控制代码
    AT24C02的存储容量为2K,芯片地址为1010,其地址控制字格式为1010-A2A1A0-R/W。其中A2,A1,A0可编程地址选择位。A2,A1,A0引脚接高、低电平后得到确定的三位编码,与1010形成7位编码,即为该器件的地址码。R/W为芯片读写控制位,该位为0是写,1是读。
void I2CInit(void) //IIC引脚初始化,初始化为**开漏输出**,外接上拉电阻提高引脚的驱动能力
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    GPIO_InitStructure.Pin = GPIO_PIN_7 | GPIO_PIN_6;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
/*****SDA、SCL引脚模式配置*****/
void SDA_Input_Mode()//设置数据线为输入模式
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    GPIO_InitStructure.Pin = GPIO_PIN_7;
    GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    GPIO_InitStructure.Pull = GPIO_PULLUP;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_Output_Mode() //设置数据线输出模式配置
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    GPIO_InitStructure.Pin = GPIO_PIN_7;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_OD;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStructure);
}
void SDA_Output( uint16_t val ) //设置数据线输出电平
{
    if ( val )
    {
        GPIOB->BSRR |= GPIO_PIN_7;
    }
    else
    {
        GPIOB->BRR |= GPIO_PIN_7;
    }
}
void SCL_Output( uint16_t val )  //设置时钟线的输出电平
{
    if ( val )
    {
        GPIOB->BSRR |= GPIO_PIN_6;
    }
    else
    {
        GPIOB->BRR |= GPIO_PIN_6;
    }
}
uint8_t SDA_Input(void)  //读取数据线输入状态
{
	if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_7) == GPIO_PIN_SET){
		return 1;
	}else{
		return 0;
	}
}

static void delay1(unsigned int n) //80MHz延时0.1us根据自己的主频进行调节
{
    uint32_t i;
    for ( i = 0; i < n; ++i);
}
void I2CStart(void)  //起始信号
{
    SDA_Output(1);     //数据线为高电平为下降沿做准备
    delay1(20);     //延时2us
    SCL_Output(1);  //时钟线变为高电平
    delay1(20);     //延时2us
    SDA_Output(0);  //时钟线为高时,数据线变为低
    delay1(20);   //延时2us
    SCL_Output(0); //时钟线变为低
    delay1(20);   //延时2us
}
void I2CStop(void) //结束信号
{
    SCL_Output(0);  //时钟线为低
    delay1(20);   //延时2us
    SDA_Output(0); //数据线为低  为上升做准备
    delay1(20);   //延时2us
    SCL_Output(1);  //时钟线变为高
    delay1(20);    //延时2us
    SDA_Output(1); //时钟线为高时,数据线上升沿结束信号
    delay1(20);  //延时2us
}

unsigned char I2CWaitAck(void) //等待响应信号
{
    unsigned short cErrTime = 5;
    SDA_Input_Mode();  //数据线设置为输入模式
    delay1(20);      //延时2us
    SCL_Output(1);   //时钟线输出高
    delay1(20);      //延时2us
    while(SDA_Input())  //判断数据线输出是否为低
    {
        cErrTime--;
        delay1(20);
        if (0 == cErrTime)
        {
            SDA_Output_Mode();
            I2CStop();
            return ERROR;
        }
    }
    SDA_Output_Mode(); //切换模式
    SCL_Output(0); //数据线输出0
    delay1(20);  //延时2us
    return SUCCESS;  //返回成功
}
/*******IIC字符读写*********/
void I2CSendByte(unsigned char cSendByte)  //发送一个字符,也就是8bit数据
{
    unsigned char  i = 8;
    while (i--)
    {
        SCL_Output(0);
        delay1(20);
        SDA_Output(cSendByte & 0x80);
        delay1(20);
        cSendByte += cSendByte;
        delay1(20);
        SCL_Output(1);
        delay1(20);
    }
    SCL_Output(0);
    delay1(20);
}

unsigned char I2CReceiveByte(void) //接收一个字符的数据
{
    unsigned char i = 8;
    unsigned char cR_Byte = 0;
    SDA_Input_Mode();
    while (i--)
    {
        cR_Byte += cR_Byte;
        SCL_Output(0);
        delay1(20);
        delay1(20);
        SCL_Output(1);
        delay1(20);
        cR_Byte |=  SDA_Input();
    }
    SCL_Output(0);
    delay1(20);
    SDA_Output_Mode();
    return cR_Byte;
}
uchar eeprom_read (uchar address)  ///读取某一地址的数据
{
	uchar date;
	I2CStart();          //启动	IIC
	I2CSendByte(0XA0);   //写指令
	I2CWaitAck();    //等待有效响应
	I2CSendByte(address);   //发送读取内容的地址
	I2CWaitAck();    //等待有效响应	
	I2CStop();     //发送停止信号
	
	I2CStart();          //启动	IIC	
	I2CSendByte(0XA1);   //读数据指令
	I2CWaitAck();    //等待有效响应
	date=I2CReceiveByte();  //读取数据
	I2CWaitAck();//读取完成的应答信号
	I2CStop();     //发送停止信号
	return 	date;
	
}

void eeprom_write (uchar address,uchar date)  ///给某一地址写数据
{
	I2CStart();          //启动	IIC
	I2CSendByte(0XA0);   //写指令
	I2CWaitAck();    //等待有效响应
	I2CSendByte(address);   //发送内容写到的地址
	I2CWaitAck();    //等待有效响应
	I2CSendByte(date);
	I2CWaitAck();    //等待发送完成
	I2CStop();     //发送停止信号	
}

初始化引脚之后调用读写就可以了。文章来源地址https://www.toymoban.com/news/detail-720533.html

到了这里,关于详解通信协议之IIC通信协议的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【51单片机】EEPROM-IIC实验(按键控制数码管)

    目录   🎁I2C总线 ​编辑 🎁代码 🏳️‍🌈main.c 🏳️‍🌈i2.c 🎆代码分析   I2C总线是Philips公司在八十年代初推出的一种串行、半双工的总线,主要用于近距离、低速的芯片之间的通信;I2C总线有两根双向的信号线,一根 数据线SDA 用于收发数据,一根 时钟线SCL 用于通信

    2024年02月11日
    浏览(38)
  • 详解通信协议之IIC通信协议

    本文结合AT24C02对IIC通信协议原理进行了描述。 IIC通讯协议(Inter-Integrated Circuit)是由 Philips 公司开发双向同步半双工串行总线,只需要两根线(SDA、SCL)即可在连接于总线上的器件之间传送信息。IIC总线是一种共享的串行总线,是用于两个设备之间的短距离低速速率(250K左右)通

    2024年02月08日
    浏览(26)
  • SPI、UART、RS232、RS485、IIC 5种嵌入式经典通信总线协议

      UART即通用异步收发器,是一种通用的串行、异步通信总线。该总线有两条数据线,可以实现全双工的发送和接收。在嵌入式系统种常用于主机与辅助设备之间的通信。UART就是串口,也是一种通信协议/总线协议。 电脑上已经逐步没有了,换成了usb,但是在嵌入式领域是最

    2024年01月16日
    浏览(36)
  • 基于51单片机+SHT30设计的环境温度与湿度检测设备(IIC模拟时序)

    当前文章介绍基于51单片机和SHT30传感器设计的环境温度与湿度检测设备。设备采用IIC模拟时序通信协议,能够实时监测环境的温度和湿度,并将数据通过LCD显示屏显示出来;可以广泛应用于室内环境监测、气象观测、农业温室监测等领域。 在本项目中,使用了51单片机作为主

    2024年02月13日
    浏览(32)
  • 6、单片机与AT24C02的通讯(IIC)实验(STM32F407)

    IIC简介 I2C(IIC,Inter-Integrated Circuit),两线式串行总线,由PHILIPS公司开发用于连接微控制器及其外围设备。 它是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,高速IIC总线一般可达400kbps以上。 IIC是半双工通信方式。 多主机

    2024年02月20日
    浏览(51)
  • 通信协议详解(二):IIC总线协议(传输时序+数据格式+设计实现)

        IIC(Inter-Integrated Circuit)是一种具有两线传输的串行通信总线,使用多主从架构,由飞利浦公司在1980年为了让主板、嵌入式系统或手机连接低速周边设备而提出,适用于数据量不大且传输距离短的场合。     IIC串行总线由两根信号线组成,一根是双向的 数据线

    2024年02月04日
    浏览(45)
  • 【物联网】I2C(IIC)通信协议详解与应用

    目录 第一部分:I2C的工作原理 第二部分:I2C的特性 第三部分:I2C的应用场景 第四部分:I2C的注意事项 第五部分:I2C的通信过程 第六部分:单片机实现I2C 1. 51单片机实现I2C 2. STM32使用标准库实现I2C 3. STM32使用HAL库实现I2C 第七部分:总结 I2C是一种双线制串行通信协议,由两

    2024年02月10日
    浏览(42)
  • IIC通信协议详解 & PCF8591应用(Verilog实现FPGA)

    该文章结合PCF8591 8-bit AD/DA 模数/数模转换器来详细介绍IIC通信协议,尽量做到条理清晰,通俗易懂。该文图片均从PCF8591手册中截取,一定程度上引导读者学习阅读data sheet。 之后可能会更新 如何将IIC的Verilog实现变为一个IP核,并在pynq-Z2板子上使用 。 2.1 地址位 在I2C总线系统

    2024年02月04日
    浏览(50)
  • 嵌入式学习笔记——IIC通信

    本文接着之前的M4系列介绍,对另外一个十分常见的通信总线进行一个介绍,就是IIC总线。 首先,还是找个免费劳动力来做一个官方的介绍,下面这一段话非常全面的介绍了IIC的各个特征,用之前提到的通信特征来总结,IIC是一种串行,同步,半双工,板级有线通信。与SPI对

    2024年02月06日
    浏览(49)
  • 【无标题】嵌入式开发-IIC通信介绍

    IIC(Inter-Integrated Circuit)是一种两线式串行总线协议,用于连接微控制器及其他外围设备。在IIC总线上的数据传输速率可以是标准模式(100Kbit/s),快速模式(400Kbit/s)和高速模式(3.4Mbit/s)。 IIC的起始和停止条件由SCL(Serial Clock Line,串行时钟线)和SDA(Serial Data Line,串行

    2024年02月10日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包