【记录】IIC

13 篇文章 2 订阅
13 篇文章 0 订阅

概要

IIC(IIC,inter-Integrated circuit),两线式串行总线,用于MCU和外设间的通信。
IIC只需两根线:数据线SDA和时钟线SCL。以半双工方式实现MCU和外设之间数据传输,速度可达400kbps。

多主机I2C总线结构

注意SDA和SCL两根总线需要上拉,使总线处于空闲状态。

这里写图片描述

IIC协议

空闲状态

协议规定,SDA和SCL同时为高电平时,总线处于空闲状态。上拉电阻保证电平处于高电平。

起始信号和停止信号

起始信号:SCL为高电平时,SDA电平发生高到低的跳变
停止信号:SCL为高电平时,SDA电平发生低到高的跳变

这里写图片描述

应答信号

发送器每发送完一个字节(8个脉冲),在第9个脉冲间释放总线,接收器返回一个ACK信号,协议规定,低电平为有效应答,高电平为无效应答。

这里写图片描述

数据有效性

协议对有效数据进行了规定:即时钟信号为高电平期间,数据必须保持稳定,时钟信号低电平期间,数据线上的电平才允许变化。也就是说,数据在时钟信号到来前必须准备好,并保持到时钟信号的下降沿之后。

这里写图片描述

数据传输

I2C为同步传输,时钟控制数据位的传输,边沿触发。

驱动程序

直接引用实验中的代码。测试没问题。

起始信号

//产生IIC起始信号
void IIC_Start(void)
{
    SDA_OUT();     //sda线输出
    IIC_SDA=1;        
    IIC_SCL=1;
    delay_us(4);
    IIC_SDA=0;//START:when CLK is high,DATA change form high to low 
    delay_us(4);
    IIC_SCL=0;//钳住I2C总线,准备发送或接收数据 
}   

停止信号

//产生IIC停止信号
void IIC_Stop(void)
{
    SDA_OUT();//sda线输出
    IIC_SCL=0;
    IIC_SDA=0;//STOP:when CLK is high DATA change form low to high
    delay_us(4);
    IIC_SCL=1; 
    IIC_SDA=1;//发送I2C总线结束信号
    delay_us(4);                                
}

有效应答

//产生ACK应答
void IIC_Ack(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=0;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}

无效应答

//不产生ACK应答          
void IIC_NAck(void)
{
    IIC_SCL=0;
    SDA_OUT();
    IIC_SDA=1;
    delay_us(2);
    IIC_SCL=1;
    delay_us(2);
    IIC_SCL=0;
}   

发送单字节

//IIC发送一个字节
//返回从机有无应答
//1,有应答
//0,无应答           
void IIC_Send_Byte(u8 txd)
{                        
    u8 t;   
    SDA_OUT();      
    IIC_SCL=0;//拉低时钟开始数据传输
    for(t=0;t<8;t++)
    {              
        IIC_SDA=(txd&0x80)>>7;
        txd<<=1;      
        delay_us(2);   //对TEA5767这三个延时都是必须的
        IIC_SCL=1;
        delay_us(2); 
        IIC_SCL=0;  
        delay_us(2);
    }    
} 

接收单字节

//读1个字节,ack=1时,发送ACK,ack=0,发送nACK   
u8 IIC_Read_Byte(unsigned char ack)
{
    unsigned char i,receive=0;
    SDA_IN();//SDA设置为输入
    for(i=0;i<8;i++ )
    {
        IIC_SCL=0; 
        delay_us(2);
        IIC_SCL=1;
        receive<<=1;
        if(READ_SDA)receive++;   
        delay_us(1); 
    }                    
    if (!ack)
        IIC_NAck();//发送nACK
    else
        IIC_Ack(); //发送ACK   
    return receive;
}

EEPROM

24C02为IIC接口,容量为256字节。

封装如下图:

这里写图片描述

管脚定义:

这里写图片描述

设备地址的高四位固定,中间为地址线定义的地址,最后一位为读写位。
由于A0,A1,A2设置为0,所以
读的时候:Device Address = 0xA1;
写的时候:Device Address = 0xA0;

这里写图片描述

24C02字节写时序

  1. 起始信号
  2. 写设备地址,Device Address = 0xA0;
  3. 等待应答
  4. 确定写入的EEPROM地址即WORD ADDRESS
  5. 等待应答
  6. 向SDA数据线上写入数据DATA
  7. 等待应答
  8. 停止信号

这里写图片描述

//在AT24CXX指定地址写入一个数据
//WriteAddr  :写入数据的目的地址    
//DataToWrite:要写入的数据
void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{                                                                                            
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);        //发送写命令
        IIC_Wait_Ack();
        IIC_Send_Byte(WriteAddr>>8);//发送高地址   
    }else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1));   //发送器件地址0XA0,写数据   
    IIC_Wait_Ack();    
    IIC_Send_Byte(WriteAddr%256);   //发送低地址
    IIC_Wait_Ack();                                                        
    IIC_Send_Byte(DataToWrite);     //发送字节                             
    IIC_Wait_Ack();                    
    IIC_Stop();//产生一个停止条件 
    delay_ms(10);    
}

24C02字节读时序

  1. 起始信号
  2. 写设备地址,Device Address = 0xA0;
  3. 等待应答
  4. 确定写入的EEPROM地址即WORD ADDRESS
  5. 等待应答
  6. 起始信号
  7. 读设备地址,Device Address = 0xA1;
  8. 等待应答
  9. 读SDA上数据
  10. 等待应答
  11. 停止信号

这里写图片描述

//在AT24CXX指定地址读出一个数据
//ReadAddr:开始读数的地址  
//返回值  :读到的数据
u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{                 
    u8 temp=0;                                                                               
    IIC_Start();  
    if(EE_TYPE>AT24C16)
    {
        IIC_Send_Byte(0XA0);       //发送写命令
        IIC_Wait_Ack();
        IIC_Send_Byte(ReadAddr>>8);//发送高地址      
    }else IIC_Send_Byte(0XA0+((ReadAddr/256)<<1));   //发送器件地址0XA0,写数据      
    IIC_Wait_Ack(); 
    IIC_Send_Byte(ReadAddr%256);   //发送低地址
    IIC_Wait_Ack();     
    IIC_Start();           
    IIC_Send_Byte(0XA1);           //进入接收模式            
    IIC_Wait_Ack();  
    temp=IIC_Read_Byte(0);         
    IIC_Stop();//产生一个停止条件       
    return temp;
}

参考

STM32F3与 F4 系列 Cortex M4 内核编程手册
STM32F4xxx中文参考手册
STM32F4xxx英文参考手册
STM32F4 开发指南(寄存器版)

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: IIC(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和外设。IIC Tool上位机是一种用于通过IIC协议与外设进行通信和控制的软件工具。 IIC Tool上位机可以轻松地与支持IIC通信的设备建立连接,并通过软件界面进行数据的发送和接收。它提供了多种功能和选项,可以方便地配置和监控外设的工作状态。 使用IIC Tool上位机,用户可以读取和写入外设的寄存器和寄存器组,以实现对外设的控制和配置。通过发送特定的IIC命令和数据,可以改变外设的工作模式、参数设置等。 此外,IIC Tool上位机还支持数据的实时监测和显示。通过设置相关的参数,用户可以实时地查看外设发送和接收的数据,从而更好地了解和分析外设的工作情况。 总之,IIC Tool上位机是一种方便实用的软件工具,可以通过IIC协议与外设进行通信和控制。它为用户提供了丰富的功能和选项,使得与支持IIC通信的设备的连接和控制变得更加简单和高效。 ### 回答2: IIC Tool上位机是一种用于与IIC(Inter-Integrated Circuit或I2C)总线通信的工具。它是通过计算机与IIC设备之间进行数据交互和控制的软件工具。 IIC是一种串行通信协议,通常用于在电子设备之间传输数据。IIC总线常常用于连接微控制器、传感器、存储器等外围设备,并通过IIC通信协议进行数据传输。然而,要完成IIC通信,需要一个可以与IIC设备进行交互的工具,这就是IIC Tool上位机的作用。 使用IIC Tool上位机,我们可以在计算机上通过串口或USB接口与IIC设备进行通信。通过IIC Tool上位机软件的图形用户界面,我们可以向IIC设备发送指令、读取或写入数据,以及监控设备的状态。 IIC Tool上位机的功能通常包括: 1. 设备搜索和识别:可以自动扫描IIC总线上的设备,并显示其地址和设备类型。 2. 数据读写:可以向IIC设备发送读写命令,读取或写入设备的寄存器、存储器等信息。 3. 数据显示与记录:可以实时显示IIC设备发送的数据,并将其记录保存到计算机中以便后续分析。 4. 设备调试和控制:可以向IIC设备发送控制命令,调整设备参数或执行特定操作。 5. 错误检测和故障排除:可以检测IIC通信中的错误,并提供故障排除功能。 总之,IIC Tool上位机是一种方便实用的工具,可以帮助我们与IIC设备进行数据交互和控制,提高了开发、调试和测试的效率。 ### 回答3: IIC通讯是一种用于连接多个集成电路(IC)的串行通信接口。IIC通信协议包括两根线——时钟线(SCL)和数据线(SDA)。上位机是指在IIC通讯中负责发送控制指令和接收数据的主设备。 IIC Tool是一种用于与IIC设备进行通信的软件工具。上位机软件通常提供用户友好的界面,使用户可以轻松地进行IIC通信操作。通过IIC Tool上位机,用户可以连接到目标IIC设备并与其进行数据交换。 IIC Tool上位机通常具备以下功能: 1. 设备识别:通过扫描IIC总线,上位机软件能够识别连接的IIC设备并显示其地址和相关信息。 2. 寄存器读写:用户可以对IIC设备的寄存器进行读写操作,以实现对设备内部状态的控制和监测。 3. 数据收发:用户可以发送自定义的数据包给IIC设备,并接收来自设备的数据回传。这使得上位机可以与目标设备之间进行双向数据通信。 4. 时序分析:通过监测和记录IIC通信的时序信息,上位机软件可以显示通信过程中的时钟信号和数据线信号的变化情况,有助于调试和验证IIC通信的正确性。 通过使用IIC Tool上位机,用户可以方便地控制和管理IIC设备,实现各种应用场景下的数据交互和协作。无论是开发者还是工程师,都可以利用IIC Tool上位机软件对IIC设备进行测试、调试和监控。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值