i2c

阅读 / 问答 / 标签

arduino i2c的wire库使用求教

关注这个问题

关于i2c的仲裁的一个问题

没有看明白

谁能帮我写一个STM32f103,I2C通信等我示例代码?

1. 配置I2C接口。在stm32f103_i2c.c中:cvoid I2C_Configuration(void){I2C_InitTypeDef I2C_InitStructure;/* 使能I2C时钟 */RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);/* I2C寄存器默认值 */I2C_DeInit(I2C1); /* I2C结构体参数配置 */I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30; //I2C设备地址I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 200000; I2C_Init(I2C1, &I2C_InitStructure);}2. TDA8425地址为0x84,写操作函数如下:cvoid I2C_Write(uint8_t addr, uint8_t reg, uint8_t data){while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));I2C_GenerateSTART(I2C1, ENABLE);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));I2C_Send7bitAddress(I2C1, addr, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));I2C_SendData(I2C1, reg);while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); I2C_SendData(I2C1, data);while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));I2C_GenerateSTOP(I2C1, ENABLE); }调用该函数即可向TDA8425的寄存器发送数据,完成I2C通信。

【黑苹果】制作VoodooI2C触控板补丁

参考教程 - 用热补丁修理你的触摸板(TouchPad-Hotpatch)- 神楽小白(GZ小白) 由于上方链接内教程已经十分完备,此处只做一个总结。 在确定设备时,也要确定你的 I2C 控制器的 Device_ID 和 Vendor_ID,以此确定需要选择什么卫星kext。当然你也可以通过多次尝试找到能用的那个。 当你在确定ACPI Pin时,若发现自己的Pin > 1024(十进制)或是Pin < 0x2F(十六进制),则无需套公式计算Pin值了。 只需要放入 SSDT-XOSI.aml,以及对应的 _OSI to XOSI 重命名补丁 并且将VoodooI2C和对应的卫星kext放入,重启即可驱动。如果发现触控板设置内不显示触控板,制作电池补丁可能可以解决此问题。 同样需要放入 SSDT-XOSI.aml 及对应的 _OSI to XOSI 重命名补丁 此外,还需要对 TPD0 设备的 _STA 方法,以及 GPI0 的 _STA 方法打补丁,使 TPD0 禁用,及 GPI0 设备启用。 如原设备中: 通过分析,我们可以知道,当 SDS0 不等于 0x05、0x02、0x06、0x01 时, TPD0 的 _STA 返回零,即被禁用。因此我们可以让 SDS0 等于0. 同理,在 GPI0 设备中: 只需要让 SBRG 和 GPEN 都不等于0,即可启用 GPI0 设备。而 SBRG 变量在整个DSDT中都有调用,无法通过预置变量法置1,否则将影响整个DSDT的功能。因此我们可先让 GPEN 置1,若是依然无法启用 GPI0 ,则使用 ACPI 重命名和自编写 SSDT 来修改原 _STA 方法。 综上,我们可以得到如下预置变量补丁: 若是需要使用 ACPI 重命名和自编写 DSDT 方法,请参照: 在进行 ACPI 重命名的时候,不能单单 patch _STA,否则会影响所有设备的_STA方法。我们使用Hex Fiend来寻找_STA关键字,并且扩展到周围的byte,直到能够确保DSDT中的唯一性。 然后参照原教程将原 TPD0 方法的内容复制到补丁中,并把所有 TPD0 替换为 TPDX。 而根据原文,VoodooI2C 使用 SBFG 来启用 GPIO 中断模式。因此在 _CRS 方法中,我们需要返回 SBFB, SBFG 或是 I2CM, SBFG (根据你机器原本的原文来确定) 如原文是 我们修改为 而若原文是 我们修改为 其他部分在大佬的博客里讲解很清楚了,此处不再赘述。

如何进入i2c bus封锁状态

1. 同一 I2C bus device 之 I2C slaver address 不可一样.2. 检查 这些 devices , 是否可以变更 I2C slaver address (hardware pin control or software register setting).3. 若相同 I2C slaver address 之 devices , 要一起使用, 则必须增加 IO pin (device enable signal, ...) 以控制区隔 这些 devices.

2个设备的I2c地址一样怎么办

不能一样吧

I2C总线协议中的 应答函数,读写函数中,SDA和SCL到底该怎么判断啊??? 一直弄不懂。

应答函数:1. "ACK" is always to be responded by the i2c master or slaver which receving the current byte. (1) current byte : slave address / word address / data (2) ACK bit state : SCL drive by master SDA drive by the i2c master or slaver which receving the current byte (3) ACK : SDA=0 during SCL high cycle , No ACK : SDA=high-Z during SCL high cycle 2. Only need to repond the "No ACK" at last byte of read access by i2c master. 读写函数:1. SCL always drive by master when either write access or read access2. SDA drive by master when slave address , master wirte data byte (not include ACK bit) SDA drive by slaver when master read/slaver write data byte (not include ACK bit)

编辑文件sudo vim /etc/modprobe.d/blacklist.conf,在末尾加入blacklist i2c-piix4

用vi打开文件,你把vim 改成vi试试然后用o新开一行写命令按esc退出编辑输 :wq保存

Tuner IC 中的I2C是用来干什么的

I2C是一种通信协议。如果你所说的Tuner IC具有I2C功能,那么它应该具有一个SCL引脚和一个SDA引脚,通过这两个引脚按照I2C协议向IC中写入数据,可以对IC进行按需配置

Li2CO3和LiCO3分别是什么啊?请高手指教。还有如果想采购,去哪里比较好?

只有Li2CO3,没有LiCO3.

如何使用HAL I2C做Slave接收

使用i2c通信先配置地址,数据位,超时时间等等通信规则。这里的ioctl函数就是用来配置这些参数的。I2C_SLAVE:安全的配置,如果i2c已经配置过会返回失败。I2C_SLAVE_FORCE:总是成功,不管其他人有没有在使用,确定只有你使用这个i2c的时候使用。同时ioctl还能使用I2C_TENBIT,I2C_PEC,I2C_TIMEOUT等参数。这里只是配置i2c通信规则,还没有发送数据。配置完成后,调用write,read函数可以接收发送数据。

I2C中读数据程序为什么会定义一个变量dat,dat=0?但是写数据明明没有dat=0的操作

scl=0 scl=1 用来产后时钟脉冲发送时SDA = 1是发1 SDA = 0是发0 接收时SDA = 1是进入读取状态(弱上拉,不接负载时读取是1,但很容易被拉低成0)具体读取得到的是1还是0,是由24C02存储的数据决定的,如果存储的数据的当前位是0,SDA总线上的1会被拉低成0,这时读取得到的就是0

i2c总线最大电容容量受温度的影响吗

时间常数为RC的乘积,并联增大容值会导致时间常数变大,SCL、SDA上升沿变缓慢,从而可能导致不满足协议要求的Trise参数。I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。I2C 总线支持任何IC 生产过程(CMOS、双极性)。通过串行数据(SDA)线和串行时钟 (SCL)线在连接到总线的器件间传递信息。每个器件都有一个唯一的地址识别(无论是微控制器——MCU、LCD 驱动器、存储器或键盘接口),而且都可以作为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能作为接收器,而存储器则既可以接收又可以发送数据。除了发送器和接收器外,器件在执行数据传输时也可以被看作是主机或从机。主机是初始化总线的数据传输并产生允许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机。

什么叫I2C总线?(I方C总线)

I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。

为什么正点原子的i2c程序都是模拟的呢

ALIENTEKSTM32资料他们做得很好,并且!他们的光盘资料本来就是免费给任何需要的人的。只要发邮件跟他索取就可以了。我就索取过。

stm32 模拟i2c 读24c02 为什么写-读一次后,第二次写其他数据就读出来还是第一次写的数据

就是第二次没有写进去呀

i2c读取1字节程序看不懂,请教下

总之反复看I2C协议,自己看理解更深

I2C总线问题!!急

AT24C02在写入一个字节之后会发送应答位,将SDA拉低,ack_bit=SDA在于检测是否应答位产生。其实可以这样写uchar i=0x00;SDA = 1; // 读取应答 delayNOP(); SCL = 1; delayNOP(); ack_bit = SDA; if(ack_bit==1) //如果SDA为高电平 for(i=0;i<255;i++) { } SCL = 0;

i2c中start和restart的区别

你好,关于i2c中start和restart的区别:有的硬件芯片提供了一个个寄存器,供我们很好的操作i2c,但是,在用的时候,我们是不知道他到地是怎么操作的,下边,我就探讨下i2c中的start和restart的区别。start是在scl是高电平的时候sda的一个下降沿来表示一个i2c的开始信号,到了i2c传输的内部,scl是低电平的时候,所有数据都是无效的,也就是说,硬件上start只是操作sda,令sda产生下降沿。 restart是在一个i2c的时间段内实现在scl高电平的时候的一个sda的下降沿呢,因此,要实现,所操作的是线令sda成高电平,在令scl来个高电平,再令sda成低电平,其实质就是操作一个scl的高电平内产生一个sda的下降沿。

怎么从I2C总线读数据

i2c有其协议的,我当时从不会到掌握其协议用了一阵子,就是狂读协议和例程我把当时用非斯卡尔单片机读i2cmems传感器的历程写在下面#include<hidef.h>#include"derivative.h"#defineIIC_SDA_CTLPTCDD_PTCDD1#defineIIC_SDA_DATPTCD_PTCD1#defineIIC_SCL_CTLPTCDD_PTCDD0#defineIIC_SCL_DATPTCD_PTCD0#defineIIC_MST_HI0#defineIIC_MST_LO1voidIIC_Start(void);voidIIC_Restart(void);voidIIC_Stop(void);byteIIC_SendByte(byte);byteIIC_Read(byte*,byte);byteIIC_Write(byte*,byte);voidIIC_Delay(void);voidIIC_Delay(void){bytei;for(i=0;i<8;i++){}}//==============================================================//MastergeneratesaSTARTconditiononIICbus//==============================================================voidIIC_Start(void){IIC_SDA_CTL=IIC_MST_HI;IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SDA_CTL=IIC_MST_LO;IIC_SDA_DAT=0;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;IIC_SCL_DAT=0;IIC_Delay();}//==============================================================//MastergeneratesaRESTARTconditiononIICbus//==============================================================voidIIC_Restart(void){IIC_SDA_CTL=IIC_MST_HI;//SDAbacktohighwhileSCLremaininlowIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//SCLbacktohigh,busidlenowIIC_Delay();IIC_SDA_CTL=IIC_MST_LO;//RESTARTconditionoccurIIC_Delay();IIC_SCL_CTL=IIC_MST_LO;//SCLtolowforstandbyIIC_Delay();}//==============================================================//MastergeneratesaSTOPconditiononIICbus//==============================================================voidIIC_Stop(void){IIC_SDA_CTL=IIC_MST_LO;//makesureSDAislowIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//I2C_SCL_CTLgotohighfirstIIC_Delay();IIC_SDA_CTL=IIC_MST_HI;//I2C_SDA_CTLhavelow-hightransitionwhileSCLishighIIC_Delay();}//==============================================================//MastersendoutabyteofdataandreturnwithACK/NACK//returnwith0x00ifACKreceived//returnwith0xffifNACKreceived//==============================================================byteIIC_SendByte(byteoutDat){bytebit;//sendout8-bitdatafor(bit=0;bit<8;bit++){if(outDat&0x80)IIC_SDA_CTL=IIC_MST_HI;elseIIC_SDA_CTL=IIC_MST_LO;IIC_Delay();IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;outDat<<=1;}//checkfortheACK/NACKIIC_SDA_CTL=IIC_MST_HI;//masterreleaseSDAIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;//mastersendaclockIIC_Delay();if(IIC_SDA_DAT)bit=0xff;//NACKelsebit=0;//ACKIIC_SCL_CTL=IIC_MST_LO;IIC_Delay();return(bit);}//==============================================================//MasterwriteastringofbytesthroughIICus//Returnwith0x00ifsuccessful//Returnwith0xffiffailed//==============================================================byteIIC_Write(byte*buff,bytetotal){while(total){if(IIC_SendByte(*buff++))//getNACKafterdatabyteoutreturn(0xff);//aborttotal--;//__RESET_WATCHDOG();//neededonlyforEEPROMbyte-program}return(0);}//==============================================================//MasterreadabyteofdataandsetACK/NACK//returnwithdataread//==============================================================byteIIC_ReadByte(byteackFlag){bytebit,dat;IIC_SDA_CTL=IIC_MST_HI;//makesuremasterreleaseSDA//read8bitssofdatafor(bit=0;bit<8;bit++){dat<<=1;IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();if(IIC_SDA_DAT)//readbackdatadat|=0x01;IIC_SCL_CTL=IIC_MST_LO;IIC_Delay();}//echowithACK/NACKif(ackFlag==0)IIC_SDA_CTL=IIC_MST_LO;//echobackACKelseIIC_SDA_CTL=IIC_MST_HI;//echobackNACKIIC_Delay();IIC_SCL_CTL=IIC_MST_HI;IIC_Delay();IIC_SCL_CTL=IIC_MST_LO;IIC_Delay();return(dat);}//==============================================================//MasterreadastringofdatabytesthroughIICus//==============================================================byteIIC_Read(byte*buff,bytetotal){bytecount;if(total==0)return(0);if(total==1){//readonebyteonlybuff[0]=IIC_ReadByte(1);//NACKafterreadreturn(1);}else{//readmorethanonebytescount=0;while(total>1){IIC_Delay();buff[count++]=IIC_ReadByte(0);//ACKafterreadtotal--;__RESET_WATCHDOG();}IIC_Delay();buff[count++]=IIC_ReadByte(1);return(count);}}然后你去网上搜索iic总线协议,把协议多读几遍慢慢就会了~~要不你把邮箱给我我发给你.总之很简单的不用害怕,学学就会了