i2c 订阅
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。 [1] 展开全文
I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。 [1]
信息
模    式
两线式串行总线
外文名
Inter-Integrated Circuit
中文名
I2C总线
I2C总线工作原理
SDA(串行数据线)和SCL(串行时钟线)都是双向I/O线,接口电路为开漏输出.需通过上拉电阻接电源VCC.当总线空闲时.两根线都是高电平,连接总线的外同器件都是CMOS器件,输出级也是开漏电路.在总线上消耗的电流很小,因此,总线上扩展的器件数量主要由电容负载来决定,因为每个器件的总线接口都有一定的等效电容.而线路中电容会影响总线传输速度.当电容过大时,有可能造成传输错误.所以,其负载能力为400pF,因此可以估算出总线允许长度和所接器件数量。主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送。 [2] 
收起全文
精华内容
下载资源
问答
  • I2C

    千次阅读 2020-01-17 20:48:23
    一提到I2C就会想到是通信协议,两个设备遵守这个协议便可以进行通讯 一个I2C总线上可以挂在多个I2C设备,一个I2C总线上有SCL(时钟线)和SDA(数据线) I2C时序 I2C的时序,如下图: 1.SCL(时钟线)高电...

    开发平台

    • 野火开发板 F429
    • 标准库
      一提到I2C就会想到是通信协议,两个设备遵守这个协议便可以进行通讯
    • 一个I2C总线上可以挂在多个I2C设备,一个I2C总线上有SCL(时钟线)和SDA(数据线)

    I2C时序

    • I2C的时序,如下图:
      在这里插入图片描述
      1.SCL(时钟线)高电平有效。
      在SCL高电平时,SDA(数据线)由高电平被拉低,表示已经有了起始信号,可以开始通讯
      2.数据在SCL为高电平时有效,SCL为低电平时无效,在SCL为低电平时,SDA可切换高低电平。每次传输八位数据
      3收发数据后等待应答
      4.在SCL高电平时,SDA由低电平被拉高,表示通讯停止

    I2C通讯过程

    • 主发送器序列
      在这里插入图片描述
      STM32作为主设备,每完成一个动作后都会产生相应的事件
      1.STM32发送起始信号
      2.发送I2C从设备地址
      3.发送I2C从设备内存地址
      4.发送数据(可多个)
      5.停止信号
    • 主接收器序列
      在这里插入图片描述1.STM32发送起始信号
      2.发送I2C从设备地址
      3.发送I2C从设备内存地址
      4.第二次发送起始信号
      5.发送I2C从设备地址(告知从设备要读取他的数据)
      6.读取数据(可多个)
      7.停止信号

    I2C架构框图

    直接操作寄存器,要看架构框图
    在这里插入图片描述
    1.时钟线和数据线
    2.时钟控制寄存器(I2C主模式选择、快速模式占空比、CCR的值)
    控制寄存器(使能应答、产生停止位、产生起始位等)
    状态寄存器(通讯过程产生事件标志位)
    在这里插入图片描述3.传输数据会用到(DR寄存器、OAR寄存器)
    4.逻辑控制(涉及到中断、使用DMA等)

    I2C读写EEPROM

    在这里插入图片描述
    EEPROM设备地址为7位,前4位地址固定为:1010,后三位看原理图000,最后一位由读操作或写操作决定,读为1,写为0。读地址为:0xA1,写地址为;0xA0

    1.配置引脚,复用为I2C,注意一定是开漏输出
    2.配置I2C的参数
    3.编写接收、发送数据函数(要用到上述的通讯过程)

    • 注意:通讯过程产生的事件要看清,很多时候会写错事件标志而导致I2C不通

    代码如下:

    #include "i2c.h"
    
    void I2C_GPIO_Config(void)
    {
        GPIO_InitTypeDef GPIO_InitStruct;
        /*使能时钟*/
        RCC_AHB1PeriphClockCmd(I2C_CLK_CLOCK|
                               I2C_SDA_CLOCK,ENABLE);
        /*引脚复用为I2C1*/
        GPIO_PinAFConfig(I2C_CLK_PORT,I2C_CLK_PINSOURCE,GPIO_AF_I2C1);
        GPIO_PinAFConfig(I2C_SDA_PORT,I2C_SDA_PINSOURCE,GPIO_AF_I2C1);
        /*
        **复用模式
        **开漏输出
        **不上拉不下拉
        **100MHZ
        **PB6 PB7
        */
        GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF;
        GPIO_InitStruct.GPIO_OType=GPIO_OType_OD;
        GPIO_InitStruct.GPIO_PuPd=GPIO_PuPd_NOPULL;
        GPIO_InitStruct.GPIO_Speed=GPIO_High_Speed;
    
        GPIO_InitStruct.GPIO_Pin=I2C_CLK_PIN;
        GPIO_Init(I2C_CLK_PORT,&GPIO_InitStruct);
        GPIO_InitStruct.GPIO_Pin=I2C_SDA_PIN;
        GPIO_Init(I2C_SDA_PORT,&GPIO_InitStruct);
    }
    
    void I2C_Config(void)
    {
        I2C_InitTypeDef I2C_InitStruct;
        /*使能时钟*/
        RCC_APB1PeriphClockCmd(I2C_CLOCK,ENABLE);
        I2C_GPIO_Config();
        /*
        **I2C模式
        **通信速率400K
        **STM32的I2C设备地址
        **占空比16:9
        **应答使能
        **地址长度7位
        */
        I2C_InitStruct.I2C_Mode=I2C_Mode_I2C;
        I2C_InitStruct.I2C_ClockSpeed=I2C_CLOCK_SPEED;
        I2C_InitStruct.I2C_OwnAddress1=I2C_OWNADDRESS;
        I2C_InitStruct.I2C_DutyCycle=I2C_DutyCycle_16_9;
        I2C_InitStruct.I2C_AcknowledgedAddress=I2C_AcknowledgedAddress_7bit;
        I2C_InitStruct.I2C_Ack=I2C_Ack_Enable;
        I2C_Init(I2C_PORT,&I2C_InitStruct);
        /*使能I2C*/
        I2C_Cmd(I2C_PORT,ENABLE);
    }
    
    uint8_t I2C_Writebyte(uint8_t addr,uint8_t *data)
    {
        /*I2C起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*I2C设备地址*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_WRITE1,I2C_Direction_Transmitter);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
        /*发送内存地址*/
        I2C_SendData(I2C_PORT,addr);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
        /*写入数据*/
        I2C_SendData(I2C_PORT,*data);
        /*I2C结束信号*/
        I2C_GenerateSTOP(I2C_PORT,ENABLE);
        return 1;
    }
    
    uint8_t I2C_Readbyte(uint8_t addr)
    {
        uint8_t data;
        /*I2C起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*I2C设备地址写*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_WRITE1,I2C_Direction_Transmitter);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
        /*发送内存地址*/
        I2C_SendData(I2C_PORT,addr);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
        /*重新发送起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*I2C设备地址读*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_READ1,I2C_Direction_Receiver);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);
        /*读取数据*/
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
        data=I2C_ReceiveData(I2C_PORT);
        /*失能应答*/
        I2C_AcknowledgeConfig(I2C_PORT,DISABLE);
        /*停止信号*/
        I2C_GenerateSTOP(I2C_PORT,ENABLE);
        /*使能应答,为下一次读取做准备*/
        I2C_AcknowledgeConfig(I2C_PORT,ENABLE);
        return data;
    }
    
    uint8_t I2C_Writepbuffer(uint8_t addr,uint8_t *data,uint8_t num)
    {
        /*I2C起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*I2C设备地址*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_WRITE1,I2C_Direction_Transmitter);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
        /*发送内存地址*/
        I2C_SendData(I2C_PORT,addr);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
        while(num)
        {
            /*写入数据*/
            I2C_SendData(I2C_PORT,*data);
            while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);
            data++;
            num--;
        }
        /*停止信号*/
        I2C_GenerateSTOP(I2C_PORT,ENABLE);
        return 1;
    }
    
    uint8_t I2C_Readpbuffer(uint8_t addr,uint8_t num,uint8_t *pbuffer)
    {
        /*起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*设备地址*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_WRITE1,I2C_Direction_Transmitter);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
        /*内存地址*/
        I2C_SendData(I2C_PORT,addr);
        /*第二次起始信号*/
        I2C_GenerateSTART(I2C_PORT,ENABLE);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        /*发送设备地址为读*/
        I2C_Send7bitAddress(I2C_PORT,I2C_ADDRESS_READ1,I2C_Direction_Receiver);
        while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);
        while(num)
        {
            if(num==1)
            {
                I2C_AcknowledgeConfig(I2C_PORT,DISABLE);
                I2C_GenerateSTOP(I2C_PORT,ENABLE);
            }
            while(I2C_CheckEvent(I2C_PORT,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);
            {
                
                *pbuffer=I2C_ReceiveData(I2C_PORT);
                pbuffer++;
                num--;
            }
            I2C_AcknowledgeConfig(I2C_PORT,ENABLE);
        }
        return 1;
    
    }
    
    展开全文
  • USB转I2C I2C工具 I2C助手

    千次阅读 2019-03-29 10:35:08
    USB转I2C小工具,支持单字节、多字节读写,支持定时读数据。非常的好用! 界面如下: 设备地址:十六进制输入的设备地址,一般I2C 设备的地址都是7 位+1 位的读写位,这里设备地址就是7 位地址左移一位。也就 是...

    USB转I2C小工具,支持单字节、多字节读写,支持定时读数据。非常的好用!

    界面如下:

    设备地址:十六进制输入的设备地址,一般I2C 设备的地址都是7 位+1 位的读写位,这里设备地址就是7 位地址左移一位。也就  是最后一位肯定是0。有些数据手册中会直接写出左移之后的地址。这里需要大家多注意一下。
    寄存器    :十六进制的寄存器地址(注意:8bit寄存器时填写范围:00~ff。16bit寄存器时填写范围:0000~ffff
    读取长度:十进制方式输入(输入范围任意
    读数据    :点击一次就会读取一次规定数据长度的数据,十六进制显示
    写数据    :点击一次写数据,工具就会将写入数据框中的数据发送出去。数据框中只能输入十六进制数据
    定时读取:在输入框中输入时间,单位是ms。点击定时读取框后,开始定时读取。

    支持4种速率:20K、100K、400K、750K

    下载链接如下:

    链接:https://pan.baidu.com/s/1uqg4ZBuVH15egxHh2IOMjg

    展开全文
  • 硬件I2C与模拟I2C

    千次阅读 2019-03-11 17:48:22
    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是...

    硬件I2C对应芯片上的I2C外设,有相应I2C驱动电路,其所使用的I2C管脚也是专用的,因而效率要远高于软件模拟的I2C;一般也较为稳定,但是程序较为繁琐。硬件(固件)I2C是直接调用内部寄存器进行配置;而软件I2C是没有寄存器这个概念的。

    软件I2C一般是使用GPIO管脚,用软件控制SCL,SDA线输出高低电平,模拟i2c协议的时序。

     

    例如下面这段I2C的开始和结束信号,我们使用GPIOB模拟:

     

    I2C接线
    GPIO引脚 模拟I2C引脚
    GPIOB11 SDA
    GPIOB12 SCL

                                     

                                           

                                                                                             I2C开始/结束时序图

    代码如下:

    Void I2C_START(void)
    
    {
    
        GPIOB11 = High;
    
        GPIOB12 = High;
    
        Delay();
    
        GPIOB11 = Low;
    
        Delay();
    
        GPIOB12 = Low;
    
    }
    
    
    
    
    Void I2C_STOP(void)
    
    {
    
        GPIOB11 = Low;
    
        GPIOB12 = High;
    
        Delay();
    
        GPIOB11 = High;
    
    }

    同样,我们可以按照波形完成读/写一个字节的函数,再进一步封装完成更为复杂的功能(发送指令等等)

    硬件i2c程序员只要调用i2c的控制函数即可,不用直接的去控制SCL,SDA高低电平的输出。

    但是有些单片机的硬件i2c不太稳定,调试问题较多。例如网上很多人吐槽的STM32…

     

    主要对比

    1.硬件IIC用法比较复杂,模拟IIC的流程更清楚一些。

    2.硬件IIC速度比模拟快,并且可以用DMA

    3.模拟IIC可以在任何管脚上,而硬件只能在固定管脚上。

     

    展开全文
  • I2C | i2c_msg

    千次阅读 2019-08-16 20:53:10
    文章目录 i2c协议的规定,host和client...一个i2c_msg 是Slave(i2c client)和Host(i2c controller)的一次单向数据传输。常见的Slave有Touchscreen,Sensor;i2c controller实际上就是SOC ARM上的一组i2c registe...


    背景介绍:
    这两天在解决客户的一个i2c传输问题时发现对i2c的理解有很多盲点,冒出一身冷汗- -!,问题解决后赶紧复盘总结一下。

    带着问题去学习是最快的方法
    思考题

    1. 为什么常见的i2c外设驱动中 i2c read 函数要构造 2个 i2c_msg,而 i2c write 函数只要1个i2c_msg?
    2. 常见i2c外设寄存器地址是8bits的,那么遇到16bits或者32bits的外设寄存器地址该如何构造i2c_msg呢?

    如果以上问题你已经熟知,那么大佬,接下来的内容可以忽略不看了,如果有疑问,不妨在小店驻留几分钟。


    一. 对 i2c_msg 的理解我认为应该分为两个主要层面:

    • i2c_msg的设计角度
      一个i2c_msg 代表着Slave(i2c client)和Host(i2c controller)之间的一次单向数据传输
    • 支持i2c传输协议的外设驱动程序使用 i2c_msg 的角度
      这里又分为四点
      • i2c 传输是以字节为单位的,具体到i2c_msg.len 指的是以字节指针i2c_msg.buf指向的buffer中字节个数。
      • 外设驱动要实现 xxx_i2c_read_bytes 和 xxx_i2c_write_bytes 两个底层函数;
      • xxx_i2c_read_bytes 由2个i2c_msg组成的数组构成
        因为这存在host send和host receive两个数据传输方向;第一个msg.buf用来暂存host向slave发出slave目标寄存器地址,msg.len表示寄存器地址字节长度;第二个msg.buf用来接收slave向host返回数据,msg.len表示期望读到数据的字节长度;
      • xxx_i2c_write_bytes 仅由1个i2c_msg构成
        因为只有host send to slave这一个数据传输方向;整个msg.buf暂存了从机目标寄存器地址和待写入其中的数据,msg.len表示整体的字节长度;
        (注:数组的目的是为了访问连续,因为数组是连续内存存储的)

    注:常见的Slave有Touchscreen,Sensor;i2c controller实际上就是SOC ARM上的一组i2c registers。

    二. 常见的Slave 驱动程序对 i2c read和write函数实现方式如下:

    1. xxx_i2c_read_bytes
      (host 发出 slave 地址来建立通信)(host驱动中实现)
      host 向 slave 发出 slave 目标寄存器地址;(salve驱动中实现)
      slave 向 host 返回 目标寄存器数据;(salve驱动中实现)
    static int xxx_i2c_read_bytes(u8 index, u8 *rx_buff, u8 length)
    {
    	int ret = -1;
    	struct i2c_msg msgs[] = {	/* 注:i2c read因为包含两个方向,所以只需要两个i2c_msg */
    		{//第一个i2c_msg用来发送需要读取的从设备目标寄存器的地址
    			.addr = xxx_client->addr, /* chip address, 7bit */
    			.flags = 0,				  /* write */
    			.len = lenght1,  		  /* bytes number(注意这里一定是byte为单位),这也是从设备目标寄存器地址的字节长度*/
    			.buf = &index,  		  /* client register address pointer */
    		},
    		{//第二个i2c_msg用来设置接收从设备目标寄存器返回数据的buff以及数据长度
    			.addr = xxx_client->addr,
    			.flags = I2C_M_RD,		  /* read */
    			.len = length2,  		  /* bytes number(注意这里一定是byte为单位)*/
    			.buf = rx_buff,			  /* 用来接收数据的缓冲区指针*/
    		},
    	};
    
    	ret = i2c_transfer(this_client->adapter, msgs, 2); /* i2c host master_xfer callback func */
    	if (ret != 2)
    		PRINT_ERR("READ ERROR!ret=%d\n", ret);
    	return ret;
    }
    
    
    1. xxx_i2c_write_bytes
      (host 发出 slave 地址来建立通信)(host 驱动中实现)
      host 向 slave 发出 slave 目标寄存器地址以及需要往目标寄存器中写入的数据;(salve驱动中实现)
    static int xxx_i2c_write_bytes(u8 *tx_buff, u8 length)
    {
    	int ret = -1;
    	struct i2c_msg msgs[1];  /*注:i2c write因为是单方向,所以只需要一个i2c_msg*/
    
    	msgs[0].addr = xxx_client->addr;
    	msgs[0].flags = 0;		/* write */
    	msgs[0].len = length; 	/* bytes number(注意这里一定是byte为单位)*/
    	msgs[0].buf = tx_buff;  /* 待写出的数据指针;数据通常为 client register address + data*/
    
    	ret = i2c_transfer(xxx_client->adapter, msgs, 1); /* i2c host master_xfer callback func */
    	if (ret != 1)
    		PRINT_ERR("WRITE ERROR!ret=%d\n", ret);
    	return ret;
    }
    
    

    总结:
    好了,回答前面提出的两个问题:

    第一题:一个i2c_msg代表着一次单项数据传输。因为i2c read包含host向slave发送寄存器地址和slave返回数据两个数据传输方向,所以需要两个i2c_msg;而 i2c write时host向slave发送寄存器地址和host往slave寄存器写数据属于同一个数据传输方向,所以只需要一个i2c_msg。

    第二题:举例slave寄存器地址为16bits的解决方案,32bits的类似。当slave寄存器地址是16bits时,slave驱动构造的i2c read函数中的第一个i2c_msg对应的len成员表示寄存器地址字节长度,buf成员传入的是寄存器其地址指针;i2c write函数中方法同i2c read,只不过buf后面还跟着待写入寄存器的数据。

    展开全文
  • I2C协议

    万次阅读 多人点赞 2018-11-01 19:50:16
    [I2C]I2C总线协议图解 转自:http://blog.csdn.net/w89436838/article/details/38660631 1 I2C总线物理拓扑结构    I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。...
  • Linux读写I2C设备I2C_RDWR用法

    千次阅读 2019-02-18 16:06:09
    kernel/msm-4.9/drivers/i2c/i2c-dev.c为每个i2c设备创建设节点,所以我们不用创建。 /dev/i2c-0是在注册i2c-dev.c后产生的,代表一个可操作的适配器。 如果不使用i2c-dev.c的方式,就没有,也不需要这个节点。 ...
  • 【组件】i2c抽象/模拟i2c

    万次阅读 2017-12-23 09:27:26
    关于i2c的使用,并不陌生,C51、ARM、MSP430等,都基本集成硬件i2c,或者不集成i2c的,可以根据总线时序图使用普通IO口翻转模拟一根i2c总线。对于当下流行的stm32饱受诟病的硬件i2c,相信很多人都是使用模拟i2c。...
  • i2c-tools 测试i2c

    千次阅读 2017-06-14 10:44:53
    首先下载i2c-tools 源码 直接在i2c-tools下面make,然后就会在tools目录下生成几个工具 要检测i2c,首先通过i2cdetect scan 总线 这里不是-- 就表示scan到具体的设备,这些都是i2c device的地址 然后通过i2cdump ...
  • I2C协议---I2C时序图解析

    万次阅读 多人点赞 2018-08-08 19:55:57
    一、I2C协议简介   I2C 通讯协议(Inter-Integrated Circuit)是由 Phiilps 公司开发的,由于它引脚...  关于I2C协议的更多内容,可阅读《I2C总线协议》,本博文主要分析I2C波形图,对于I2C的基础知识不在做介...
  • I2C接口

    万次阅读 多人点赞 2018-06-13 19:45:25
    I2C总线引脚定义SDA (I2C数据引脚)CLK (I2C数据引脚) 2. I2C总线物理连接I2C总线物理连接如下图所示,SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都...
  • qcom I2C driver : i2c-msm-v2.c

    千次阅读 2017-05-10 13:31:15
    qcom I2C driver code : i2c-msm-v2.c
  • Linux I2C工具查看配置I2C设备

    千次阅读 2017-11-28 15:11:52
     通过i2cdetect -l指令可以查看树莓派上的I2C总线,从返回的结果来看树莓派含有两个I2C总线,通过阅读相关的资料,树莓派1代使用I2C0,而树莓派2代使用I2C1。 [plain] view plain copy
  • I2C详解(一)

    万次阅读 多人点赞 2019-01-03 17:22:21
    I2C Bus(Inter-Integrated Circuit Bus) 最早是由Philips半导体(现被NXP收购)开发的两线时串行总线,常用于微控制器与外设之间的连接。要想了解详细I2C协议,目前最新的I2C标准协议是2014年第6版本,如下: I2C-...
  • i2cdetect i2cdump i2cget i2cset用法

    万次阅读 多人点赞 2016-12-14 11:58:27
    本博客转载自台湾朋友的文章:...幸好linux上也有這樣的工具 – i2c tools。先到lm-sensors下載soure code,然後cross compile成arm的執行檔,就可以放到板子來試試看了。 i2c-tools中含有四個執行檔i2cdetect –
  • I2C库函数

    千次阅读 2018-08-08 17:10:35
    1.void I2C_DeInit(I2C_TypeDef* I2Cx) 功能:将I2Cx外设寄存器重设为默认值 注释:该函数调用了RCC_APB1PeriphResetCmd来进行挂载于APB上外设的寄存器的复位 例如:I2C_DeInit();   2.void I2C_Init(I2C_...
  • I2C Slave

    千次阅读 2019-03-06 04:03:46
    使用I2C Slave与I2C Master通信。 同步级别:不受保护。 I2CSlave类引用 Public Member Functions I2CSlave(PinName sda, PinName scl) 创建一个I2CSlave接口,连接到指定的引脚。更多 void ...
  • 做linux 嵌入式驱动,离不开调试i2c 外设,这里对i2c做一下3点总结:1.先要知道i2c的4个信号;a) 起始信号:当 SCL 线是高电平时 SDA 线从高电平向低电平切换。 b) 停止信号:当 SCL 线是高电平时 SDA 线由低电平...
  • i2c-tools,i2cdump和i2cset等的使用总结

    万次阅读 2016-09-07 15:51:21
     1)察看I2C总线的bus和设备地址/sys/bus/i2c/devices root@zc706-zynq7:/sys/bus/i2c/...0-0074 2-0039 3-0055 3-0057 5-0051 i2c-0 i2c-2 i2c-4 i2c-6 i2c-8 1-005d 3-0054 3-0056 4-0021 8-0065
  • i2c_client,i2c_adapter和I2C-core的简介

    万次阅读 2013-09-24 15:15:05
    I2C的主要有两大数据结构,struct i2c_client 和 struct i2c_adapter。 2.1 i2c_client struct i2c_client { unsigned short flags; unsigned short addr; char name[I2C_NAME_SIZE]; struct i2c_...
  • 利用USB-I2C实现从机I2C收发数据

    千次阅读 2018-10-17 14:05:33
    Ginkgo USB-I2C适配器固件从V2.8.17版本开始支持I2C从机功能,下面就针对这个功能的使用做简单介绍。实现目的:1、I2C从机接收数据,也就是接收I2C主机的数据并显示出来;2、I2C从机发送数据,也就是把数据传输到...
  • I2C总线介绍

    万次阅读 2018-12-06 16:01:22
    1.1 I2C总线知识 1.1.1 I2C总线物理拓扑结构   I2C总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所...
  • I2C没有设备/dev/i2c-0

    千次阅读 2018-04-02 19:18:00
    前提:insmod i2c-gpio-custom bus0=0,X1,X2安装没有问题;(X1、X2表示可以的GPIO口)检查:下面路径下是否有i2c-dev.ko如果有:root@JoySince:/lib/modules/3.10.49# ls i2c- i2c-dev.ko i2c-gpio-custom.ko root@...
  • 这周准备移植nvp6324到hi3519a板子上,可是在加载驱动时候i2c通讯不成功,移植报错hibvt-i2c 4562000.i2c: wait idle abort!, RIS: 0x611问题。之前一直怀疑i2c时序不对,用示波器也没有量出来问题,中间还折腾用...
  • CCI(gpio I2c) 与I2C

    千次阅读 2016-07-02 12:00:48
    cci 与 i2c cci的名字叫, camera control interface, 他由两部分组成,一是i2c ,而另一个部分是 gpio。也就是说,cci 包含i2c。一般情况下,我们只是用到了i2c 部分,没有用到gpio 部分。 c
  • 最近在研究I2C驱动,碰到了一对函数不知道什么意思,也看了网上的好多帖子,结合自己的分析来说一说它们的作用吧。这两个函数的作用起始就是方便我们通过client来找到设备。比如我们自定义了一个结构体用来保存数据...
  • I2C调试工具

    千次阅读 2019-05-06 19:55:56
    i2c-tools工具是开源I2C调试工具, 具有获取I2C总线挂载的设备列表及设备地址,可对指定设备指定寄存器进行读写的功能。 ubuntu安装: apt-get install libi2c-dev i2c-tools 源码下载地址: ...
  • [I2C]I2C总线协议图解

    千次阅读 2016-12-24 22:35:00
    I2C总线物理拓扑结构  I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。...
  • I2C驱动

    千次阅读 2016-05-07 01:16:18
    Linux2.6.30/driver/i2c/ 1.algos: 协议算法相关的东西 2.busses: 各种平台的i2c总线驱动(i2c控制器...4.i2c-core.c i2c-dev.c: i2c子系统的通用文件(i2c核心层,提供一些通用函数接口) 应用层app

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 453,739
精华内容 181,495
关键字:

i2c