
- 模 式
- 两线式串行总线
- 外文名
- Inter-Integrated Circuit
- 中文名
- I2C总线
-
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,写地址为;0xA01.配置引脚,复用为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:08USB转I2C小工具,支持单字节、多字节读写,支持定时读数据。非常的好用! 界面如下: 设备地址:十六进制输入的设备地址,一般I2C 设备的地址都是7 位+1 位的读写位,这里设备地址就是7 位地址左移一位。也就 是...USB转I2C小工具,支持单字节、多字节读写,支持定时读数据。非常的好用!
界面如下:
设备地址:十六进制输入的设备地址,一般I2C 设备的地址都是7 位+1 位的读写位,这里设备地址就是7 位地址左移一位。也就 是最后一位肯定是0。有些数据手册中会直接写出左移之后的地址。这里需要大家多注意一下。
寄存器 :十六进制的寄存器地址(注意:8bit寄存器时填写范围:00~ff。16bit寄存器时填写范围:0000~ffff)
读取长度:十进制方式输入(输入范围任意)
读数据 :点击一次就会读取一次规定数据长度的数据,十六进制显示
写数据 :点击一次写数据,工具就会将写入数据框中的数据发送出去。数据框中只能输入十六进制数据
定时读取:在输入框中输入时间,单位是ms。点击定时读取框后,开始定时读取。支持4种速率:20K、100K、400K、750K
下载链接如下:
-
硬件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的理解有很多盲点,冒出一身冷汗- -!,问题解决后赶紧复盘总结一下。带着问题去学习是最快的方法
思考题
:- 为什么常见的i2c外设驱动中 i2c read 函数要构造 2个 i2c_msg,而 i2c write 函数只要1个i2c_msg?
- 常见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函数实现方式如下:
- 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; }
- 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:09kernel/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:25I2C总线引脚定义SDA (I2C数据引脚)CLK (I2C数据引脚) 2. I2C总线物理连接I2C总线物理连接如下图所示,SDA和CLK连接线上连有两个上拉电阻,当总线空闲时,两根线均为高电平。连到总线上的任一器件输出的低电平,都... -
qcom I2C driver : i2c-msm-v2.c
2017-05-10 13:31:15qcom 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:21I2C 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:351.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 ... -
关于I2C的那点事:i2c_master_send 和 i2c_master_recv i2c_transfer
2018-06-28 16:42:22做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:05I2C的主要有两大数据结构,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:33Ginkgo USB-I2C适配器固件从V2.8.17版本开始支持I2C从机功能,下面就针对这个功能的使用做简单介绍。实现目的:1、I2C从机接收数据,也就是接收I2C主机的数据并显示出来;2、I2C从机发送数据,也就是把数据传输到... -
I2C总线介绍
2018-12-06 16:01:221.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@... -
海思hi3519a I2C报错hibvt-i2c 4562000.i2c: wait idle abort!, RIS: 0x611
2019-11-19 16:45:31这周准备移植nvp6324到hi3519a板子上,可是在加载驱动时候i2c通讯不成功,移植报错hibvt-i2c 4562000.i2c: wait idle abort!, RIS: 0x611问题。之前一直怀疑i2c时序不对,用示波器也没有量出来问题,中间还折腾用... -
CCI(gpio I2c) 与I2C
2016-07-02 12:00:48cci 与 i2c cci的名字叫, camera control interface, 他由两部分组成,一是i2c ,而另一个部分是 gpio。也就是说,cci 包含i2c。一般情况下,我们只是用到了i2c 部分,没有用到gpio 部分。 c -
linux I2C驱动 i2c_set_clientdata函数和i2c_get_clientdata函数
2018-01-19 11:24:21最近在研究I2C驱动,碰到了一对函数不知道什么意思,也看了网上的好多帖子,结合自己的分析来说一说它们的作用吧。这两个函数的作用起始就是方便我们通过client来找到设备。比如我们自定义了一个结构体用来保存数据... -
I2C调试工具
2019-05-06 19:55:56i2c-tools工具是开源I2C调试工具, 具有获取I2C总线挂载的设备列表及设备地址,可对指定设备指定寄存器进行读写的功能。 ubuntu安装: apt-get install libi2c-dev i2c-tools 源码下载地址: ... -
[I2C]I2C总线协议图解
2016-12-24 22:35:001 I2C总线物理拓扑结构 I2C 总线在物理连接上非常简单,分别由SDA(串行数据线)和SCL(串行时钟线)及上拉电阻组成。通信原理是通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。... -
I2C驱动
2016-05-07 01:16:18Linux2.6.30/driver/i2c/ 1.algos: 协议算法相关的东西 2.busses: 各种平台的i2c总线驱动(i2c控制器...4.i2c-core.c i2c-dev.c: i2c子系统的通用文件(i2c核心层,提供一些通用函数接口) 应用层app
-
随机电磁光束阵列的光束传输变换特性
-
io实现快递e栈
-
自动化测试Python3+Selenium3+Unittest
-
字符串的逐个输出
-
C++对象模型.zip
-
用于测量量块尺寸的激光干涉测量方法研究
-
iptables 企业级防火墙配置(四表五链)
-
力扣-437 路径总和III
-
2021年 系统架构设计师 系列课
-
SNOW-V-VHDL
-
线性筛选法
-
羽量级在线 HTML 编辑器
-
MaxScale 实现 MySQL 读写分离与负载均衡
-
mysql 按月份统计
-
Android开发应用apk文件发送到微信打不开解决方案
-
wifi P2P 自己总结的文档
-
共享图书管理系统数据库实现
-
基于信息分离和邻居惩罚选择的多目标优化
-
084_可直接用于项目的qt窗口(桑原创).rar
-
Advanced_BPF_Kernel_Features_for_the_Container_Age_FOSDEM.pdf