Iic读写 之间需要多少延时问题,TW8835 IIC总线读写问题
来源:整理 编辑:亚灵电子网 2022-12-22 06:28:37
1,TW8835 IIC总线读写问题
8位寄存器是说寄存器的容量是8位的,也就是8位的数据,这和寄存器的地址大小没有冲突嘛。
2,单片机用IIC读写EEPROM
对iicEEPROM进行写入操作时,IC内部有个自循环写时序大约10mS(不同的芯片可能略有差异),如果在这个时序尚未结束之前,执行读操作,读出的数据只能是先前有效的写操作记录的数据,因为单步调试操作的时间远大于10mS,iic的自循环写时序已经结束,所以读出的数据是正确的。建议在写操作之后延时10mS后再进行读操作。

3,24lc256写一个字节需要延时多久
//在主程序中,先i2c_init();然后开始读/写24LC256中数据,经多次运行no bug//程序中的寄存器必须芯片内部包含,否则无法实现硬件iic读写。
4,一个PCF8591 的IIC读写的时序问题有一些困惑
别人编的不代表你能用,不同的电路情况是有细微区别的,可以你晶振离CPU远点 可能你晶振跟别人的不一个品牌 可能你那温度比别人的高, 这都导致延时函数不准。自己动手测量才是王道。用个示波器测一下,不费什么功夫,而且自己心里也有底了。下面是我自己的延时函数,仅供参考/***************************************************************************/void Delayms_110592(unsigned int time_)//延时时间为 1ms * x 晶振是11.0592M unsigned int _x,_y; for(_y = 0; _y < time_; _y++) for(_x = 0;_x < 111; _x++); } /***************************************************************************/void Delayus_110592(unsigned int time_)//延时时间为 1us * x 晶振是11.0592M unsigned int _x,_y; for(_y = 0; _y < time_; _y++) for(_x = 0;_x < 1; _x++); }Delayms_110592();这个函数的形参越大相对误差越小,一般都是大于标准值,比如Delayms_110592(100);肯定大于100ms,而且Delayms_110592(1000);的相对误差要小一点你可以用示波器测量来试一下,具体什么原因,自己思考~~~Delayms_110592();这个函数的形参越小相对误差越小,一般都是大于标准值
5,iic总线中是SCL还是SDA要延时
应该是SDA在发送起始信号和停止信号的时候需要延时,使得设备能够判断起始位和停止位,具体延时多长要看芯片手册。如果CPU工作在“主发送”的模式下,CPU通过在SCL高电平时候拉低SDA线,就等于发送了一个起始信号,SCL的上升沿到SDA的下降沿的时间段A,及SDA的下降沿到SCL的下降沿的时间段B,芯片手册中都会有详细的规定。同理,发送停止信号的时候也是类似的。
6,iic的应用
I2C总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。因此,使用I2C总线设计计算机系统十分方便灵活,体积也小,因而在各类实际应用中得到广泛应用。下面举二个应用示例。I2C的运用比如在铁电存储器中,用铁电存储数据就是用的I2C总线协议。 目前,51、96系列的单片机应用很广,但是由于它们都没有I2C总线接口,从而限制了在这些系统中使用具有I2C总线接口的器件。通过对I2C总线时序的分析,可以用51单片机的两根I/O线来实现I2C总线的功能。接I2C总线规定:SCL线和SDA线是各设备对应输出状态相“与”的结果,任一设备都可以用输出低电平的方法来延长SCL的低电平时间,以迫使高速设备进入等待状态,从而实现不同速度设备间的时钟同步。因此,即使时钟脉冲的高、低电平时间长短不一,也能实现数据的可靠传送,可以用软件控制I/O口做I2C接口。下面就是用GMS97C2051的通用I/O口来作为I2C总线接口,并由软件控制实现数据传送的例子,图6为其连线图。在单主控器的系统中,时钟线仅由主控器驱动,因此可以用51系列的一根I/O线作为SCL的信号线,将其设置为输出方式,并由软件控制来产生串行时钟信号。在实际系统中使用了P1.3。另一根I/O线P1.2作为I2C总线的串行数据线,可在软件控制下在时钟的低电平期间读取或输出数据。系统传输数据的过程如下:先由单片机发出一个启始数据信号,接着送出要访问器件的7位地址数据,并等待被控器件的应答信号。当收到应答信号后,根据访问要求进行相应的操作。如果是读入数据,则数据线可一直设为输入方式,中间不需要改变SDA线的工作方式,每读入一个字节均应依次检测应答信号;如果是输出数据,则首先将SDA设置为输出方式,当发送完一个字节后,需要改变SDA线为输入方式,此时读入被控器件的应答信号就完成了一个字节的传送。当所有数据传输完毕后,应向SDA发出一个停止信号,以结束该次数据传输。 下面给出51系列用汇编语言实现启始、停止、读、写、应答的程序,读者也可以根据I2C总线时序在96系列或其它单片机上实现I2C总线接口。a.启动位程序ACK:CLR P1.3NOPNOPSETB P1.2NOPNOPNOPCPL P1.3 ;P1.3=1NOPNOPNOPDENGDAI:JB P1.2,DENGDAIRETb.读数据程序读字节可以在当前地址读(CURRENTREAD),也可以随机读(RANDOM READ),读出数据的最后一个字节后不用加应答信号。READ:PUSH 0EHCLR P1.4LCALL BSTART ;STARTMOV A,#0A0H ;SEND THE CNOTROL BYTELCALL SENDBYTELCALL ACKMOV A,R1 ;SEND THE ADDRESSLCALL SENDBYTELCALL ACKLCALL BSTART ;STARTMOV A,#0A1H ;SEND THE CNOTROL BYTELCALL SENDBYTELCALL ACKLCALL READBYTELCALL BSTOPPOP 0EHRET送字节程序:SENDBYTE:PUSH 0EHPUSH 00HMOV R0,#08HLOOP1:CLR P1.3NOPNOPRLC AMOV P1.2,CCPL P1.3 ;P1.3=1NOPNOPDJNZ R0,LOOP1POP 00HPOP 0EHRET读字节子程序:READBYTE:PUSH 0EHPUSH 00HMOV R0,#08H;READ THE CONTENTCLR ALOOP4:CLR P1.3NOPNOPNOPSETB P1.3 ;P1.3=1MOV C,P1.2RLC ADJNZ R0,LOOP4MOV R2,APOP 00HPOP 0EHRETc.写数据程序:WRITE:PUSH 0EHCLR P1.4LCALL BSTARTMOV A,#0A0HCLALL SENDBYTE ;SEND THE CONTROL BYTELCALL ACKMOV A,R1 ;SEND THE ADDRESSLCALL SENDBYTELCALL ACKMOV A,R2 ;WRITE THE CONTENTLCALL SENDBYTELCALL ACKLCALL BSTOPPOP 0EHRET连续写的两个字节之间最好是有10ms的延时。当然,也可以进行页写(PAGEWRITE),即一次性连续写8个字节,但采用页写方式时每个字节后要有一个应答信号。d.停止位程序:BSTOP:CLR P1.3NOPNOPCLR P1.2NOPNOPNOPSETB P1.3NOPNOPNOPSETB P1.2RET // IIC开始void Start()SDA=1;SCL=1;NOP4();SDA=0;NOP4();SCL=0;}// IIC 结束void Stop()SDA=0;SCL=0;NOP4();SCL=1;NOP4();SDA=1;}// IIC 读取应答void RACK()SDA=1;NOP4();SCL=1;NOP4();SCL=0;}// IIC 发送非应答void NO_ACK()SDA=1;SCL=1;NOP4();SCL=0;SDA=0;}// IIC向从设备写入一字节数据void Write_A_Byte(uchar b)uchar i;for(i=0;i<8;i++)b<<=1;SDA=CY;_nop_();SCL=1;NOP4();SCL=0;}RACK();}// IIC 向从设备的指定地址写入数据void Write_IIC(uchar addr,uchar dat)Start();Write_A_Byte(0xa0);Write_A_Byte(addr);Write_A_Byte(dat);Stop();DelayMS(10);}// IIC 从从设备读取数据uchar Read_A_Byte()uchar i,b;for(i=0;i<8;i++)SCL=1;b<<=1;B|=SDA;SCL=0;}return b;}// IIC 从从设备的当前地址读取数据uchar Read_Current()uchar d;Start();Write_A_Byte(0xa1);d=Read_A_Byte();NO_ACK();Stop();return d;}// IIC 从从设备的任意地址读取数据uchar Random_Read(uchar addr)Start();Write_A_Byte(0xa0);Write_A_Byte(addr);Stop();return Read_Current();}
7,iic接口的读写要以时钟上升沿为参考吗
其实程序是一模一样的,唯一的区别是模拟IIC需要CPU运算,这样就增加了单片机的运算时间,而带IIC接口的单片机,程序还是需要的,但是IIC的运算通过集成在单片机里面的寄存器硬件电路来运算,就像定时器电路一样自己会运算,这样就不要cpu来运算过程了,从而节省了时间,使cpu运算的更快。当然这样就的多付出经济成本哦
8,C语言for循环嵌套延时问题
这说明是你的延时时间不足,造成的错误。这个延时函数是个指令延时,指令多了,延时时间就长。for(x=0;x<120;x++) 这个循环里,每一次循环,都会有一个 加一 和 判断跳转指令。X为char 时是单字节,这些指令都是一条指令,当改为 int时 x就成了双字节了,这些操作就需要多几条指令来完成。这就相当于,每次循环的时间加长了。你好!加入预处理语句#include 再调用Sleep()函数。 比如 #include #include int main() { printf("1"); Sleep(1000); printf("2"); } 里面的参数为毫秒 我的回答你还满意吗~~
9,iic协议读取数据的问题
start_iic(); write_byte(0xa0); respons(); write_byte(address);这上面的是要告诉器件,我要 (操作) 你的那个地址(address)单元。write_byte(0xa1);//这句话是要告诉器件,准备要来读你,读就要有对像,对像在哪呢?就是你上面所写入的地址。data=read_byte();//这句话才是真正的把数据给读出来,明白了吗?读地址和写地址是不一样的,读操作也是得先把读操作的地址先写进去才能读从读数据的角度来说没有区别;但是发了应答的话,从器件会继续输出数据,处于工作状态,发非应答则从器件就停止输出数据,处于standby状态,两种状态的耗能不一样的,实际应用时,就会在功率上有差别。
10,一个PCF8591 的IIC读写的时序问题有一些困惑
别人编的不代表你能用,不同的电路情况是有细微区别的,可以你晶振离CPU远点 可能你晶振跟别人的不一个品牌 可能你那温度比别人的高, 这都导致延时函数不准。自己动手测量才是王道。用个示波器测一下,不费什么功夫,而且自己心里也有底了。下面是我自己的延时函数,仅供参考/***************************************************************************/void Delayms_110592(unsigned int time_)//延时时间为 1ms * x 晶振是11.0592M unsigned int _x,_y; for(_y = 0; _y < time_; _y++) for(_x = 0;_x < 111; _x++); } /***************************************************************************/void Delayus_110592(unsigned int time_)//延时时间为 1us * x 晶振是11.0592M unsigned int _x,_y; for(_y = 0; _y < time_; _y++) for(_x = 0;_x < 1; _x++); }Delayms_110592();这个函数的形参越大相对误差越小,一般都是大于标准值,比如Delayms_110592(100);肯定大于100ms,而且Delayms_110592(1000);的相对误差要小一点你可以用示波器测量来试一下,具体什么原因,自己思考~~~Delayms_110592();这个函数的形参越小相对误差越小,一般都是大于标准值上面#define pcf8591 0x90 //pcf8591
宏定义,0x90为器件地址
文章TAG:
Iic读写读写 之间 需要