问题解决!谢谢各位大虾!感谢自己的**!

[复制链接]
6554|33
 楼主| cumtgirl 发表于 2008-3-22 16:39 | 显示全部楼层

现在又不工作了

早上来了工作好好的,到了中午又不行了!貌似这个程序或者传感器只工作半天!
hotpower 发表于 2008-3-22 17:59 | 显示全部楼层

估计楼主真没搞清楚I2C协议及串行通讯主从机的关系

实际我给的例程是PC的并口模拟I2C协议,用什么语言并不重要.<br /><br />楼主的类似以下的程序全部有问题~~~<br />while(i--)<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;I2CSendByte(ControlByte&0xfe);//指定芯片,此次必定为写<br />&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次<br />//...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(errorflag==error)&nbsp;//经过写完后,如果最后errorflag标志为1,则表示有错误<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次<br /><br />等等都有问题.<br />I2C的通讯状态很规矩,每个状态都有详细的定义.<br />gccavr中的定义很规范(atmel称I2C为TWI)<br />enum&nbsp;enum_TWIState<br />{<br />/*&nbsp;Master&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_START&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x08,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_REP_START=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10,<br />/*&nbsp;Master&nbsp;Transmitter&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MT_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x18,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MT_SLA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x20,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MT_DATA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x28,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MT_DATA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x30,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MT_ARB_LOST=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x38,<br />/*&nbsp;Master&nbsp;Receiver&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MR_ARB_LOST=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x38,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MR_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x40,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MR_SLA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x48,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MR_DATA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x50,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_MR_DATA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x58,<br />/*&nbsp;Slave&nbsp;Transmitter&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_ST_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xA8,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_ST_ARB_LOST_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;0xB0,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_ST_DATA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xB8,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_ST_DATA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xC0,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_ST_LAST_DATA=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xC8,<br />/*&nbsp;Slave&nbsp;Receiver&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x60,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_ARB_LOST_SLA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;0x68,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_GCALL_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x70,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_ARB_LOST_GCALL_ACK=&nbsp;&nbsp;&nbsp;0x78,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_DATA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x80,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_DATA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x88,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_GCALL_DATA_ACK=&nbsp;&nbsp;&nbsp;&nbsp;0x90,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_GCALL_DATA_NACK=&nbsp;&nbsp;&nbsp;&nbsp;0x98,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_SR_STOP=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xA0,<br />/*&nbsp;Misc&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_NO_INFO=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xF8,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_BUS_ERROR=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x00,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_READ=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;TW_WRITE=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br />};<br /><br />不管I2C出现的任何错误,主机都应该发送I2CStop(),而不应该像楼主用continue重试.<br /><br />因为从机是根据主机的节拍即时钟进行工作即状态转移的,主机发现的错误从机并不知晓.<br /><br />所以正确地容错应该是主机发送I2CStop()停止从机的工作后,使从机的状态归零.<br />然后再I2CStart()重新通讯.<br /><br /><br />再者I2C的调试实际很简单,应该在发送I2CStart()和从地址后,在接收应答处<br />设置个断点.<br />若裸奔应该在此处加个LedOn()或LedOff()看看到底收到从机的应答信号ACK否.<br /><br />若收不到就应该检查时序,否则一切都白搭~~~<br /><br />建议I2C用状态机,虽然在模拟I2C上很少使用,但它能使通讯更可靠~~~ <br /> 相关链接:<a href='https://bbs.21ic.com/club/bbs/showEssence.asp?id=9000&page=1'>https://bbs.21ic.com/club/bbs/showEssence.asp?id=9000&page=1</a>
zhang123 发表于 2008-3-22 18:46 | 显示全部楼层

我也奉上 i2c:写入按键次数到24c02,并读出显示在4个led上。

写入按键次数到24c02,并读出显示在4个led上。<br />//写入按键次数到24c02,并读出显示在4个led上。<br />#define&nbsp;uchar&nbsp;unsigned&nbsp;char&nbsp;//定义一下方便使用<br />#define&nbsp;uint&nbsp;&nbsp;unsigned&nbsp;int<br />#define&nbsp;ulong&nbsp;unsigned&nbsp;long<br />#include&nbsp;&ltreg52.h&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//包括一个52标准内核的头文件<br /><br />char&nbsp;code&nbsp;dx516[3]&nbsp;_at_&nbsp;0x003b;//这是为了仿真设置的<br /><br />#define&nbsp;&nbsp;&nbsp;&nbsp;WriteDeviceAddress&nbsp;0xa0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义器件在IIC总线中的地址<br />#define&nbsp;&nbsp;&nbsp;&nbsp;ReadDviceAddress&nbsp;0xa1<br />sbit&nbsp;&nbsp;&nbsp;&nbsp;SCL=P2^7;<br />sbit&nbsp;&nbsp;&nbsp;&nbsp;SDA=P2^6;<br /><br />sbit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P10=P1^0;<br />sbit&nbsp;&nbsp;&nbsp;&nbsp;K1=P3^2;<br /><br />//定时函数<br />void&nbsp;DelayMs(uint&nbsp;number)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;temp;<br />//&nbsp;&nbsp;&nbsp;&nbsp;for(;number!=0;number--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;//{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />//&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(number--)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(temp=112;temp!=0;temp--);<br />}<br /><br />//开始总线<br />void&nbsp;Start()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />}<br /><br />//结束总线<br />void&nbsp;Stop()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />}<br /><br /><br />//发ACK0<br />void&nbsp;NoAck()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />}<br /><br />//测试ACK<br />bit&nbsp;TestAck()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;bit&nbsp;ErrorBit;<br />&nbsp;&nbsp;&nbsp;&nbsp;SDA=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;ErrorBit=SDA;<br />&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;return(ErrorBit);<br />}<br /><br />//写入8个bit到24c02<br />Write8Bit(uchar&nbsp;input)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;temp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(temp=8;temp!=0;temp--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SDA=(bit)(input&0x80);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input=input&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />//写入一个字节到24c02中<br />void&nbsp;Write24c02(uchar&nbsp;ch,uchar&nbsp;address)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(WriteDeviceAddress);<br />&nbsp;&nbsp;&nbsp;&nbsp;TestAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(address);<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!TestAck());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(ch);<br />&nbsp;&nbsp;&nbsp;&nbsp;TestAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;DelayMs(10);<br />}<br /><br />//从24c02中读出8个bit<br />uchar&nbsp;Read8Bit()&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;temp,rbyte=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(temp=8;temp!=0;temp--)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rbyte=rbyte&lt&lt1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rbyte=rbyte|((unsigned&nbsp;char)(SDA));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SCL=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return(rbyte);<br />}<br /><br />//从24c02中读出1个字节<br />uchar&nbsp;Read24c02(uchar&nbsp;address)&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;ch;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(WriteDeviceAddress);<br />&nbsp;&nbsp;&nbsp;&nbsp;TestAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(address);<br />&nbsp;&nbsp;&nbsp;&nbsp;TestAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;Start();<br />&nbsp;&nbsp;&nbsp;&nbsp;Write8Bit(ReadDviceAddress);<br />&nbsp;&nbsp;&nbsp;&nbsp;TestAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;ch=Read8Bit();<br />&nbsp;&nbsp;&nbsp;&nbsp;NoAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;Stop();<br />&nbsp;&nbsp;&nbsp;&nbsp;return(ch);<br />}<br /><br />&nbsp;//写入按键次数到24c02,并读出来显示在4个LED上<br /><br />void&nbsp;main(void)&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;主程序<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;c1,c2;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1=Read24c02(0x01);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读出24c02第一个地址数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P1=c1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//显示在P1口的4个LED上<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!K1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//按键处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c1++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//值加1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Write24c02(c1,0x01);&nbsp;&nbsp;&nbsp;&nbsp;//重新写入24c02<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(!K1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待按键松开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(c2=0;c2&lt250;c2++);&nbsp;&nbsp;&nbsp;&nbsp;//松开按键去抖<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />
一从陶令 发表于 2008-3-22 22:22 | 显示全部楼层

不会你的I2C从机忘接电源了吧

哈哈,不会你的I2C从机忘接电源了吧.I2C器件功率很小,SCL/SDA上的高电平信号通过钳位二极管给VCC供电,往往能支持一两个字节的读写,多字节连续读就不行了.以前一哥们曾犯过这个错.<br /><br />如果不是的话一定是时序有问题,不知道为什么LZ一直不肯用示波器调试一下,就那么难吗?
 楼主| cumtgirl 发表于 2008-3-23 10:07 | 显示全部楼层

re

我的这个传感器里面是集成了一个24C02,它里面存的是校准参数。运行时应该先读出这11个校准参数,然后再读出AD数字值(是个数字传感器)。顺便说一下:我的读AD值代码部分一直都是好好运行的。而读常数部分却不正常!
 楼主| cumtgirl 发表于 2008-3-24 11:46 | 显示全部楼层

发现问题了:

有时能收到从机的ack信号,有时不能!<br />
mikesullen 发表于 2008-3-25 11:51 | 显示全部楼层

还是建议你们公司买一个示波器吧

虽然我不是卖示波器的。。。。
 楼主| cumtgirl 发表于 2008-3-25 18:09 | 显示全部楼层

问题解决!谢谢各位大虾!感谢自己的**!

公司的器件有问题,但是总算还是被容错能力较强的软件克服了!
 楼主| cumtgirl 发表于 2008-3-25 22:17 | 显示全部楼层

贴代码:希望有助后来人!

在发完0xa0,片内adddress,0xa1之后,因为我的函数在发完这三个字节后,收不到ack信号,因此,我分别增加了<br />if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//重建启动信号,恢复正常时序!!!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;见下面:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />unsigned&nbsp;long&nbsp;RIIC(signed&nbsp;long&nbsp;*DataBuff,char&nbsp;ByteQuantity,unsigned&nbsp;int&nbsp;Address,unsigned&nbsp;char&nbsp;ControlByte)<br />{<br />&nbsp;unsigned&nbsp;char&nbsp;errorflag=error;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//错误标志位,1为错误,0为正确<br />&nbsp;unsigned&nbsp;char&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//i为允许本次操作的最大次数<br />&nbsp;&nbsp;i=10;<br />&nbsp;SCLOUT;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//时钟口长设为输出<br />&nbsp;while(i--)<br />&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;nop_();<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CSendByte(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//指定芯片,此次必定为写<br />&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//重建启动信号,恢复正常时序!!!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//结束写操作,并i-1后,再来一次<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;I2CSendByte((unsigned&nbsp;char)Address);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送片内地址<br />&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//数返回一个1为成功&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStop();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(Address);&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;//----------------------------------------------------已经选定好IC&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*I2CStart();*/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(ControlByte/*0xa1*/);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!WaitAck())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//涵数返回一个1为成功<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStop();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay(200);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;I2CSendByte(ControlByte/*0xa1*/);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(--ByteQuantity)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入ByteQuantity个数字节<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*DataBuff++=I2CReceiveByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//连续读入ByteQuantity个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendAck();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//主机向从机发出应答,表示主机已接收&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*DataBuff=I2CReceiveByte();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读入最后个数据<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendNotAck();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//最后发出不应答信号(位),表示主机不再读了.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;errorflag=right;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//向错误标志位写0(right),表示读数据正确.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//读操作完成<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;I2CStop();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止,结束IIC总线<br />&nbsp;return(errorflag);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//返回操作成败标志<br />}
gxs64 发表于 2008-3-26 10:30 | 显示全部楼层

公司的器件有问题?

公司的器件有问题----你是如何证明的?
 楼主| cumtgirl 发表于 2008-3-26 17:55 | 显示全部楼层

我单步跟踪的时候发现的

有的器件能顺利执行RIIC,再换一个就不行了。
 楼主| cumtgirl 发表于 2008-3-28 08:55 | 显示全部楼层

我的解决方法基本意思就是:

我的解决方法基本意思就是:在可能收不到ack的地方,(I2Cstop())stopIIC总线,再重新启动IIC(I2Cstart()),再执行写操作。不知道对大家是否有帮助
 楼主| cumtgirl 发表于 2008-4-2 08:45 | 显示全部楼层

发现一个问题:程序运行很稳定,但是读出来的数都是少了

原来255的地方,读出来是127。原来是6的地方,读出是3...如何办?
fengsz 发表于 2012-6-28 15:41 | 显示全部楼层
没延时吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部