i2c数据最多能发多少字节,HDMI的I2C频率能到多少
来源:整理 编辑:亚灵电子网 2023-08-29 10:19:37
1,HDMI的I2C频率能到多少
I2C的频率与用在什么芯片上没有太多关系,一般能够到400Khz,有时为了系统资源,会降到200K——400K之间。并且,HDMI有图像没声音与I2C关系不大。HDMI的I2C主要负责终端显示设备(如:电视)与信号源设备(如:笔记本)进行沟通,以满足HDMI协议等,
HDMI RX0/1/2/3主要来传送图像;
HDMI EDID共256字节,其中部分字节通过I2C来控制声音;
两者之间没有直接的信号联系,分别走不同的通道;
故有图像无声音应该是EDID整个线路环节出现问题了;
2,为什么ADUCM360I2C只能发送两个字节

3,51单片机I2C通信如何读一字节
当串行数据线上数据为1时,一个8位二进制变量dat和0x01求或,则最低位被置1,如果数据线上为0电平,则不进行这个或操作,最低位保持原状0,因此即读得一位串行数据保存在dat的最低位,然后把dat这个数据左移一次,最低位被推向次低位,空出最低位(变为0),下一个时钟里,再进行第二次这样的读操作,得两位二进制数,经过8次即读得到串囗发送的一个字节,最先发的那位数据移到了最高位 注意是读8次,左移7次如果发送时先发送低位(spI串口发数据有时高位在前,有时低位在前)就要将其读入最高位(和0x80进行"或"操作),然后右移,同样是8次可以读得一个字节数据
4,关于iic总线字节传输的问题
用AT89S51写AT24C01,AT24CO1的地址是怎样确定的,下面程序为什么它发送完了读取写控制字之后不用发写在AT24CO1的首地址吗?LCALLSTA;发送起始条件MOVA,,#0A0H读取写控制字LCALLWRB;发送一个字节LCALLCACK;检查应答位JBF0,WRBYTE1;无应答,重发MOVR0,#DTSV;欲发送数据首址MOVR5,KEYNUM;R5保存欲发送数据的字节数WRDA:MOVA,@R0;读一个字节数据LCALLWRB;发送写控制字节LCALLCACK;检查应答位JBF0,WRBYTE1;无应答,重发DECR0DJNZR5,WRDA;未发送完N个字节继续LCALLSTOP;数据发送完毕,停止POPPSW;恢复现场RET
5,关于单片机模拟I2C的总线通信读一个字节的问题
uchar read_byte()uchar i,k;scl=0; //-IIC规定在SCL底电平的时候,允许SDA发生变化。所以,这里必须自定义为低delay(); //-单片机端口变化需要一点时间,从机收到变化也需要一点时间,所以必须延时sda=1; //-这肯定是用51单片机写的程序,因为51单片机在读取IO口时,必须把该口先写为1delay();for(i=0;i<8;i++)scl=1; //-把SCL变为高电平时,SDA就不会变化了。数据也就稳定了。delay();k=(k<<1)|sda; //-这样写你会理解。K = K<<1; 先把缓冲左移 // K = K | SDA; 再把缓冲的最低位或操作一下,得到数据位scl=0; //允许IIC发送下一个位delay(); //-保证IIC能把数据送出}return k; 返回读取到的数据。}整个核心就在移位、或操作。先移位后,则缓冲的最低位就为0了。该位与SDA或一下以后,如果数据为1.则缓冲的最低位为1.否则最低位仍然为0.由于FOR循环只有8次。所以,也就读取8次数据就完成了。
6,I2C总线的最大长度是多少
I2C(Inter-Integrated Circuit)总线是一种由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度等多个参数,增加了系统的安全性,方便了管理。 1 I2C总线特点 I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。 2 I2C总线工作原理 2.1 总线的构成及信号类型 I2C总线是由数据线SDA和时钟SCL构成的串行总线,可发送和接收数据。在CPU与被控IC之间、IC与IC之间进行双向传送,最高传送速率100kbps。各种被控制电路均并联在这条总线上,但就像电话机一样只有拨通各自的号码才能工作,所以每个电路和模块都有唯一的地址,在信息的传输过程中,I2C总线上并接的每一模块电路既是主控器(或被控器),又是发送器(或接收器),这取决于它所要完成的功能。CPU发出的控制信号分为地址码和控制量两部分,地址码用来选址,即接通需要控制的电路,确定控制的种类;控制量决定该调整的类别(如对比度、亮度等)及需要调整的量。这样,各控制电路虽然挂在同一条总线上,却彼此独立,互不相关。 I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。 开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。 结束信号:SCL为低电平时,SDA由低电平向高电平跳变,结束传送数据。 应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。 目前有很多半导体集成电路上都集成了I2C接口。带有I2C接口的单片机有:CYGNAL的 C8051F0XX系列,PHILIPSP87LPC7XX系列,MICROCHIP的PIC16C6XX系列等。很多外围器件如存储器、监控芯片等也提供I2C接口。 3 总线基本操作 I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。 3.1 控制字节 在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作 3.2 写操作 写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节不同有所不同。关于页面写的地址、应答和数据传送的时序 3.3 读操作 读操作有三种基本操作:当前地址读、随机读和顺序读。图4给出的是顺序读的时序图。应当注意的是:最后一个读操作的第9个时钟周期不是“不关心”。为了结束读操作,主机必须在第9个周期间发出停止条件或者在第9个时钟周期内保持SDA为高电平、然后发出停止条件。 4 实例:X24C04与MCS-51单片机软硬件的实现 X24C04是XICOR公司的CMOS 4096位串行EEPROM,内部组织成512×8位。16字节页面写。与MCS-51单片机接口如图5所示。由于SDA是漏极开路输出,且可以与任何数目的漏极开路或集电极 开路输出“线或”(wire-Ored)连接。上拉电阻的选择可参考X24C04的数据手册。下面是通过I2C接口对X24C04进行单字节写操作的例程。 ;名称:BSENT ;描述:写字节 ;功能:写一个字节 ;调用程序:无 ;输入参数:A ;输出参数:无 BSEND: MOV R2,#08H ;1字节8位 SENDA: CLR P3.2 ; RLC A ;左移一位 MOV P3.3,C ;写一位 SETB P3.2 DJNZ R2,SENDA ;写完8个字节? CLR P3.2 ;应答信号 SETB P3.3 SETB P3.2 RET 在I2C总线的应用中应注意的事项总结为以下几点 : 1) 严格按照时序图的要求进行操作, 2) 若与口线上带内部上拉电阻的单片机接口连接,可以不外加上拉电阻。 3) 程序中为配合相应的传输速率,在对口线操作的指令后可用NOP指令加一定的延时。 4) 为了减少意外的干扰信号将EEPROM内的数据改写可用外部写保护引脚(如果有),或者在EEPROM内部没有用的空间写入标志字,每次上电时或复位时做一次检测,判断EEPROM是否被意外改写。
很不错哦
7,关于I2C程序
AT的没有具体去看他的daatsheep
一般的 24都是允许一次性全部读出的只要你的时序没有问题
另外ack信号迟一点发送 不会影响读写的
你可以仔细看一下 at的 daatsheep看有没有256字节的限制.
普通的24是01-128字节 02=256字节...16=2047字节..
超过部分..器件会自动回到0地址处理,
/////////////////////////////////////////////
看了一下你,后面添加的程序.
如果你这样写.那么read_all那边就不需要用参数了.
因为如果读取,一般都是从0开始读取的..
另外x24c08_read如果是单字节读写函数.而且是正确的话
那么用
for (ii=0;ii<4;ii++)
{
for (iii=0;iii<256;iii++)
{
c=x24c08_read(ii,(uchar)iii);
SBUF=c;
while (!TI);
这种方式的读取一定是没有问题.
有问题就是你的代码..或者你的eep本身坏了.
如果你感觉时许地上对的话..不妨看一下.
//////////////////////////////////为什么要等啊,iic也有自己的缓冲区阿,一个字节一个字节的读阿。。不明白你的意图问题不是很清楚,可能是你定义的变量类型有问题。看看有没有溢出吧,再说具体点啊。
8,I2C通信的内容
I2C的时序是比较复杂的,你如果能把I2C的时序弄清,那其他器件的时序都不成问题了。我就按照我的理解来跟你讲吧。直接用程序来说明吧。NOP(),一个机器周期时间的延迟,12M晶振时为1微秒NOPS(),4个NOP()。sbit SDA P2^0;sbit SCL P2^1; 定义数据线和时钟线接口首先,I2C有2个重要的线,SDA数据线SCL时钟线,当总线上没有进行信息传送时,SDA和SCL都为高电平,我们称之为释放总线。开始传送信息时,要有一个开始信号,开始信号 :定义为在SCL为高电平的时候,SDA从高电平拉低。start() SDA=1; NOP(); //同你图中 SDA/SCL上升/下降所用时间 1US SCL=1; NOPS(); //建立开始信号(同你图中TSU起始信号建立时间一样4US) SDA=0; //SDA拉低 NOPS(); SCL=0; //SCL拉低, 钳住总线,准备发送或接收数据 NOP();}结束信号:与开始信号相反,在SCL为高电平时,SDA从低拉高stop() SDA=0; NOP(); SCL=1; NOPS(); //建立信号时间 SDA=1; //拉高 结束。 NOPS();}我晕,发现写了半天还有好多。。算了 帮人帮到底了发送/接收一个数据:数据的发送和接收都是在SCL为低电平的时候发生,因为SCL为高电平时已给了开始和结束信号。发送数据时,当数据准备读入时,将SCL线暂时拉高(SCL为高时,SDA无法改变状态),保持一段时间然后拉低(同你图中的TDH,数据输出保持时间),这时数据则发送完毕到SDA上。接收则与之大同小异。当SDA线上有数据过来时,先将SCL拉高,建立好时间,然后拉低,数据则被读入。(关于如何被发出以及如何被读入则是芯片做的事,我们不用管,只需记住SCL拉低,数据发出/读入)用程序来讲就是:send(uchar c) //发送一个字节 uint i; for(i=0;i
9,有关于I2C 51单片机的问题实在搞不懂请大家帮帮忙先谢谢了
uchar 肯定不能大于255,大于255,有可能丢弃高8位或丢失低8位,分大端模式或小端模式 如果想把数据写入到第2000个字节地址时候,不可以把address直接写为2000,要分高8位和低8位低8位就是 address write_I2C_byte(address);高8 位就是你的下面语句的a0或a1write_I2C_byte(0xa0);但真正高8位=器件地址(1010 占高4位)十 要写入的地址高8位(3位有效,占D3D2D1 )+读写命令位(D0位)高8位 低8位分离如下:uint address;uchar addressL,addressHaddressL=address%256; 有时可省去这一步,高8位自动丢弃addressH=0XA0|(address>>8)|com 读命令com=1 写命令 com=0我试验过的子程序,有点拖沓////////从24c16的地址address中读取一个字节数据/////unsigned char x24c16_read(uint address) uchar i;uchar addr_h,addr_h1,addr_l;addr_h=address/256;addr_h1=addr_h*2;addr_l=address%256; start(); writex(0xa0+addr_h1); clock(); writex(addr_l); clock(); start(); writex((0xa1+addr_h1)); clock(); i=readx(); stop(); delay1(10); return(i);}你好:一、write的意思是每到1s钟往at24c02里的0x02这个地址写sec这个变量的值,write可以说是一个时间写入标志变量,当write=1时说明该写数据了,紧接着将write清0,然后定时器时间到write又为1了。用bit来定义一是为了节省ram空间,二是一目了然,一看就是当做标志来用。二、这是读一个字节数据的函数。解析: 1.函数头传递要读取的字节所在位置address; 2.进入函数声明一个无符号的字符变量date; 3.start()函数是iic协议定义的开始函数,在scl=1时,sda一个下降沿,iic器件接收到开始命令; 4.write_byte(0xa0)是发送“写”这个命令给iic器件; 5.respons()函数是应答信号,当iic器件接收到数据会产生应答信号; 6.且这几句非要不可!!不然iic器件不会开始工作,会停留在等待启动状态,0xa0是写命令,因为要读address的数据,所以要事先写入地址,读才能有效地读出。应答函数在这里可以不要; 7.write_byte(address)写入要读取的位置; 8.应答; 9.当把要读取的地址写入后,因为此时还是在写状态下,必须吧iic器件切换为读的状态,所以重新启动一次,然后发送读的命令; 10.应答信号。三、你没提问题了。有啥不懂可以随时回复。希望我的回答能帮助到你。
10,I2C总线实验要求写入的最大数据大于255怎么编程
数据大于255,那么就分两次传输这个数据就可以实现了。没有4位机制,有8位51单片机的汇编程序。还有一个c语言的,可以给你参考,这都是我项目中用到的程序。给你作个参考,在产品的实际工作中也很稳定。下面是汇编的:;;-----启动-----;;start1: lcall del5us setb sda1 lcall del5us setb scl1 lcall del5us clr sda1 lcall del5us clr scl1 lcall del5us ret;;-----结束-----;;stop1: lcall del5us setb scl1 lcall del5us setb sda1 lcall del5us ret;;-----应答检查-----;;cack1: setb sda1 lcall del5us setb scl1 lcall del5us mov c,sda1 jc cack1 clr scl1 clr sda1 lcall del1ms ret;;-----应答-----;;mack1: clr sda1 lcall del5us setb scl1 lcall del5us clr scl1 lcall del5us setb sda1 ret;;-----向从器件指定单元写n个字节数据-----;;;;入口:传递的地址在pointer,数据在wr_buf中,发送字节数在n中;;资源占用:acc、r0、r1、r3、cwr_nb1: clr ea setb sda1 setb scl1 lcall start1 mov a,#0a2h lcall wr8bit1 lcall cack1 mov a,pointer lcall wr8bit1 lcall cack1 mov r3,n mov r1,#wr_bufwrnb11: mov a,@r1 lcall wr8bit1 lcall cack1 inc r1 djnz r3,wrnb11 lcall stop1 lcall del10ms setb ea ret;;-----从从器件指定单元读n个字节数据-----;;;;入口:传递的地址在pointer,接收数据缓冲区rd_buf,接收字节数在n中;;资源占用:acc、r0、r1、r3、crd_nb1: mov r3,nrdnb11: lcall start1 mov a,#0a2h lcall wr8bit1 lcall cack1 mov a,pointer lcall wr8bit1 lcall cack1 lcall start1 mov a,#0a3h;#0a1h lcall wr8bit1 lcall cack1 mov r1,#rd_bufrdb1: lcall rd8bit1 mov @r1,a djnz r3,sack1 lcall stop1 retsack1:inc r1 lcall mack1 sjmp rdb1;;-----字节发送-----;;;;入口:要发送的数据在acc中;;每发送完一个字节,要调用一次cack,以判断是否有应答wr8bit1: push acc mov r0,#08hwr_bit1: rlc a mov sda1,c lcall del5us setb scl1 lcall del5us clr scl1 djnz r0,wr_bit1 pop acc ret;;-----字节接收-----;;;;出口:接收到的数据在acc中;;每接收完一个字节,要调用一mcack/mnackrd8bit1: mov r0,#08hrd_bit1: setb sda1 lcall del5us setb scl1 lcall del5us mov c,sda1 rlc a lcall del5us clr scl1 djnz r0,rd_bit1 clr sda1 ret以下的程序是c语言的程序,用于读24c01存贮器,稍加修改可以用于所有的i2c总线驱动。/******************************************************************** 名 称:readiic_24c01** 功 能:读24c01指定的地址的数据** 输 入: address 24c01的地址** 输 出: ddata 读出的数据** 全局变量: 无** 调用模块: write_8bit();delay();** 备注:******************************************************************/uint8 readiic_24c01(uint8 data address)uint8 data ddata=0;uint8 data i=8; _nop_(); _nop_(); _nop_(); ea=0; scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //tsu:sta sda=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //thd:sta scl=0; //start write_8bit( (address<<1) | 0x01); //写页地址和操作方式 ack_r(); while (i--) sda=1; ddata<<=1; scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=1; if (sda) ddata|=0x01; } scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; //stop _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); ea=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); delay(50); _nop_(); _nop_(); _nop_(); return ddata;}/******************************************************************** 名 称:writeiic_24c01** 功 能:将数据写入24c01指定地址** 输 入: address 24c01的地址** ddata 待写入的数据 ** 输 出: 无** 全局变量: 无** 调用模块: write_8bit();delay();** 备注:******************************************************************/void writeiic_24c01(uint8 data address,uint8 data ddata) _nop_(); _nop_(); _nop_(); ea=0; scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //tsu:sta sda=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //thd:sta scl=0; //start _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();write_8bit( (address<<1) & 0xfe); //写页地址和操作方式,对于24c32-24c256,page不起作用 ack_r(); write_8bit(ddata); //发送数据 ack_r(); sda=0; _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); sda=1; //stop _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); ea=1; _nop_(); _nop_(); _nop_(); delay(50); _nop_(); _nop_(); _nop_();}/******************************************************************** 名 称:write_8bit** 功 能:将一个字节数据写入24c01** 输 入: 无** 输 出: 无** 全局变量: 无** 调用模块: 无** 备注:******************************************************************/void write_8bit(uint8 data ch)uint8 data i=8; _nop_(); _nop_(); _nop_(); scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while (i--) sda=(bit)(ch&0x80); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); ch<<=1; scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}/******************************************************************** 名 称:ack_r** 功 能:等待24c01ack信号** 输 入: 无** 输 出: 无** 全局变量: 无** 调用模块: 无** 备注:******************************************************************/void ack_r(void) _nop_(); _nop_(); _nop_(); sda=1; scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); scl=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); while(sda) _nop_(); } //ack scl=0; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();}
文章TAG:
i2c数据最多能发多少字节数据 最多 能发