为什么不能读取AT24C01?内有程序,请大家帮忙!

[复制链接]
6795|24
 楼主| 雁舞白沙 发表于 2007-6-18 02:12 | 显示全部楼层 |阅读模式
#include&nbsp;&lthidef.h&gt<br />#include&nbsp;&quot;derivative.h&quot;<br />#include&nbsp;&quot;Global.h&quot;<br />//-----***-IIC延时-***-----//<br />void&nbsp;IicWait(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;NOP&quot;);&nbsp;//01<br />&nbsp;&nbsp;&nbsp;&nbsp;//asm(&quot;NOP&quot;);&nbsp;//02<br />&nbsp;&nbsp;&nbsp;&nbsp;//asm(&quot;NOP&quot;);&nbsp;//01<br />}<br />//-----***-IIC启示-***-----//<br />void&nbsp;IicStart(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />}<br />//-----***-IIC停止-***-----//<br />void&nbsp;IicStop(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;IicSda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />}<br />//-----***-IIC应答-***-----//<br />void&nbsp;SendAcknowledge(unsigned&nbsp;char&nbsp;IicAck)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=IicAck;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />//-----***-从slave端读取一个数据-***-----//<br />unsigned&nbsp;char&nbsp;IicReceiveByte(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;bytedata=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytedata&lt&lt=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(IicSda)&nbsp;bytedata&nbsp;|=0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bytedata;<br />}<br />//-----***-传送一个&nbsp;Byte&nbsp;数据到&nbsp;slave-***-----//<br />unsigned&nbsp;char&nbsp;IicSentByte(unsigned&nbsp;char&nbsp;DataByte)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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 />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,IicAck;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt8;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(DataByte&nbsp;&&nbsp;0x80)<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=1;<br />&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;else<br />&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=0;<br />&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;DataByte&nbsp;&lt&lt=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicAck=IicSda;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IicAck;<br />}<br />//-----***-无扇区读---单字节-***-----//<br />unsigned&nbsp;char&nbsp;FgTimeout;<br />//读取指定器件无扇区指定地址单字节的数据<br />//Device=器件地址---单字节<br />//DataAdd=字节地址---单字节<br />unsigned&nbsp;char&nbsp;IicByteRead(unsigned&nbsp;char&nbsp;DataAdd)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;bytedata;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisableInterrupts;//关中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSentByte(0xa0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSentByte(DataAdd);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSentByte(0xa1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bytedata=IicReceiveByte();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//SendAcknowledge(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicStop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EnableInterrupts;//开中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;bytedata;<br />}<br />//-----***-无扇区写---单字节-***-----//<br />//写入指定器件无扇区指定地址中的单字节数据<br />//Device=器件地址---单字节<br />//DataAdd=字节地址---双字节<br />void&nbsp;IicByteWrite(unsigned&nbsp;char&nbsp;DataAdd,unsigned&nbsp;char&nbsp;DataByte)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,IicAck;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(BitData&0x01)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DisableInterrupts;//关中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt3;i++)<br />&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicAck=IicSentByte(0xa0);if(IicAck==1){IicStop();continue;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicAck=IicSentByte(DataAdd);if(IicAck==1){IicStop();continue;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicAck=IicSentByte(DataByte);if(IicAck==1){IicStop();continue;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicStop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(IicAck==0)break;<br />&nbsp;&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;&nbsp;&nbsp;EnableInterrupts;//开中断<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Delay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />}
HotPower 发表于 2007-6-18 02:33 | 显示全部楼层

细心就成~~~I2C都被倒塌了就不好混了~~~

1.读出EEPROM数据文件<br /><img src="http://www.**/Upload/Blog/2007/6/1/bb74d8cc-1678-494b-a657-7da2929bc2c2.gif"><br /><br />2.写入EEPROM数据文件&nbsp;<br /><img src="http://www.**/Upload/Blog/2007/6/1/f915656d-63b3-4895-937e-5b89d8ea9f34.gif"><br /><br />3.单/双字节EEPROM读出<br /><img src="http://www.**/Upload/Blog/2007/6/1/b101a8a9-8d4f-47f2-9e7b-5555383db5e5.gif"><br /><br />4.单/双字节EEPROM写入<br /><img src="http://www.**/Upload/Blog/2007/6/1/b85135e2-b33e-43ca-9737-8b0a6ba9b8b7.gif"><br /><br />5.整片EEPROM读出<br /><img src="http://www.**/Upload/Blog/2007/6/1/fcd4d31f-7a33-48e7-9391-4ce86ef22d98.gif"><br /><br />6.整片EEPROM写入&nbsp;<br /><img src="http://www.**/Upload/Blog/2007/6/1/6489d153-e78f-4067-86a9-87808e9e0108.gif">
 楼主| 雁舞白沙 发表于 2007-6-18 02:36 | 显示全部楼层

我也晕了,在以前使用中,是没有问题的!

可是今天搬到一个新的MCU中,写不进去,也读不出来!<br /><br />郁闷啊!
dongshan 发表于 2007-6-18 07:48 | 显示全部楼层

楼上的界面很好看啊。

注意时钟周期。<br /><br />既然在别的MCU中已成功,换了新的MCU,你的每一指令周期的时间是一样的<br /><br />吗?还能满足I2C的时序吗?<br /><br />
张明峰 发表于 2007-6-18 09:03 | 显示全部楼层

IicSda/IicScl 是怎么定义的?

注意端口的方向控制<br /><br />对于FSL:1-&gt输出,0-&gt输入<br />对于PIC:1-&gt输入,0-&gt输出
free_tech 发表于 2007-6-18 09:08 | 显示全部楼层

直接使用片内的iic模块就行了

模拟iic总线,start&nbsp;信号要有冗余,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ack也要有冗余,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;24c01最好换成24c04,
 楼主| 雁舞白沙 发表于 2007-6-18 12:55 | 显示全部楼层

定义!

DDRD=0xfc;<br /><br />#define&nbsp;IicSda&nbsp;&nbsp;&nbsp;PTD_PTD2&nbsp;/*该IO口用于24C01数据*/<br />#define&nbsp;IicScl&nbsp;&nbsp;&nbsp;PTD_PTD3&nbsp;/*该IO口用于24C01时钟*/<br /><br />此程序在PIC,ATMEL,LPCMCU中运行都正常,但是在HC908JK8里面却不可以。<br /><br />还望高手指教!
 楼主| 雁舞白沙 发表于 2007-6-18 13:05 | 显示全部楼层

在线等!

  
 楼主| 雁舞白沙 发表于 2007-6-18 13:12 | 显示全部楼层

调用方式!

IicByteWrite(0xa0,0x03,0x55);<br />ValveData=IicByteRead(0xa0,0x03);<br />
HotPower 发表于 2007-6-18 13:25 | 显示全部楼层

没用过张教主的芯片~~~不行你用三线模拟I2C.

既然是IO模拟I2C,双向IO的问题肯定要多注意.<br /><br />不行你用三线模拟I2C.<br /><br />SCL<br />SDAIN<br />SDAOUT<br /><br />这样都不行就只有到张教主家了~~~<br /><br />我觉得你程序的结构有些问题,黑白有些分不清~~~<br /><br />我喜欢读写一体化~~~
张明峰 发表于 2007-6-18 16:29 | 显示全部楼层

I/O不分造成的问题

你说:<br /><blockquote>DDRD=0xfc;<br />#define&nbsp;IicSda&nbsp;&nbsp;&nbsp;PTD_PTD2&nbsp;/*该IO口用于24C01数据*/<br />#define&nbsp;IicScl&nbsp;&nbsp;&nbsp;PTD_PTD3&nbsp;/*该IO口用于24C01时钟*/</blockquote><br />你的程序定义了SDA/SCL均为输出且永远是输出,这样,问题就来了:<br /><blockquote>//字节发送程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicSda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicAck=IicSda;&nbsp;&nbsp;&nbsp;//!!!读应答位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicScl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IicWait();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;IicAck;<br /></blockquote><br />仔细看FSL单片机IO引脚的特性,当IO引脚设定为输出时,读引脚读的永远是<font color=#FF0000>输出锁存器的状态</font>而不是<font color=#FF0000>IO引脚的状态</font>。由于IicSda为输出且IicSda=1,故你读到的永远是1。IIC读字节程序的问题相同。<br /><br />另外楼主对I2C总线理解还是有局限性,且犯了一个常见的错误(工程师中犯错概率&gt80%):<font color=#0000FF>IIC总线上的高电平是通过外部上拉才得到的,而不是靠引脚输出高电平而得到的</font>。尽管你的程序看似在其它芯片上可以跑,但隐患极大。试想:当读应答位时单片机引脚输出高电平(PIC的引脚驱动能力可达10-20mA),而EEPROM输出应答低电平,这时高低电平发生冲突,类似于电源短路,当然没那么严重。好的结果是功耗无谓增加,严重的结果是由于IO口急变的大电流而造成单片机死机!<br /><br />
free_tech 发表于 2007-6-18 16:34 | 显示全部楼层

我有一个SR12读24C04的汇编,调试过的

口线模拟起始和停止位<br />QISHI:&nbsp;&nbsp;bset&nbsp;0,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;0,ddrb;数据输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;0,ptb;数据线<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;1,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;1,ddrb;时钟输出<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;1,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsr&nbsp;&nbsp;yan&nbsp;&nbsp;&nbsp;;延时<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bclr&nbsp;0,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;0,ddrb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsr&nbsp;yan&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;起始位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RTS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />tingzhi:bclr&nbsp;1,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jsr&nbsp;&nbsp;yan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bclr&nbsp;0,ptb<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bset&nbsp;0,ddrb;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;停止位<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSR&nbsp;YAN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSET&nbsp;1,PTB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSET&nbsp;0,PTB<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSR&nbsp;YAN<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rts<br />
张明峰 发表于 2007-6-18 16:48 | 显示全部楼层

例程参考

请注意IIC总线上高低电平控制是通过改变引脚的输入/输出方向,而不是直接输出高低电平。此例程在9S08SW60上得到验证。只需改变引脚名称定义即可用到908系列。<br /><br />//IIC&nbsp;bus&nbsp;assignment<br />#define&nbsp;IIC_SDA_CTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTCDD_PTCDD1<br />#define&nbsp;IIC_SDA_DAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTCD_PTCD1<br />#define&nbsp;IIC_SCL_CTL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTCDD_PTCDD0<br />#define&nbsp;IIC_SCL_DAT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PTCD_PTCD0&nbsp;&nbsp;&nbsp;<br />#define&nbsp;IIC_MST_HI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;//引脚输入模式,释放总线(总线上呈上拉高电平)<br />#define&nbsp;IIC_MST_LO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;//引脚输出模式,占用总线(总线上呈低电平)<br /><br /><br />void&nbsp;IIC_Start(void);<br />void&nbsp;IIC_Restart(void);<br />void&nbsp;IIC_Stop(void);<br />byte&nbsp;IIC_SendByte(byte);<br />byte&nbsp;IIC_ReadByte(byte);<br />byte&nbsp;IIC_Read(byte&nbsp;*,&nbsp;byte);<br />byte&nbsp;IIC_Write(byte&nbsp;*,&nbsp;byte);<br />void&nbsp;IIC_Delay(void);<br /><br /><br />void&nbsp;IIC_Delay(void)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;i;<br />&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt8;i++)&nbsp;{}<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;generates&nbsp;a&nbsp;START&nbsp;condition&nbsp;on&nbsp;IIC&nbsp;bus<br />//==============================================================<br />void&nbsp;IIC_Start(void)<br />{<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;IIC_SDA_DAT&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;IIC_SCL_DAT&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;generates&nbsp;a&nbsp;RESTART&nbsp;condition&nbsp;on&nbsp;IIC&nbsp;bus<br />//==============================================================<br />void&nbsp;IIC_Restart(void)<br />{<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;//SDA&nbsp;back&nbsp;to&nbsp;high&nbsp;while&nbsp;SCL&nbsp;remain&nbsp;in&nbsp;low<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;//SCL&nbsp;back&nbsp;to&nbsp;high,&nbsp;bus&nbsp;idle&nbsp;now<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_LO;&nbsp;&nbsp;//RESTART&nbsp;condition&nbsp;occur<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;&nbsp;&nbsp;//SCL&nbsp;to&nbsp;low&nbsp;for&nbsp;standby<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;generates&nbsp;a&nbsp;STOP&nbsp;condition&nbsp;on&nbsp;IIC&nbsp;bus<br />//==============================================================<br />void&nbsp;IIC_Stop(void)<br />{<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_LO;&nbsp;&nbsp;//make&nbsp;sure&nbsp;SDA&nbsp;is&nbsp;low<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;//I2C_SCL_CTL&nbsp;go&nbsp;to&nbsp;high&nbsp;first<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;//I2C_SDA_CTL&nbsp;have&nbsp;low-high&nbsp;transition&nbsp;while&nbsp;SCL&nbsp;is&nbsp;high<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;send&nbsp;out&nbsp;a&nbsp;byte&nbsp;of&nbsp;data&nbsp;and&nbsp;return&nbsp;with&nbsp;ACK&nbsp;condition<br />//&nbsp;return&nbsp;with&nbsp;0x00&nbsp;if&nbsp;ACK&nbsp;received<br />//&nbsp;reyurn&nbsp;with&nbsp;0xff&nbsp;if&nbsp;NACK&nbsp;received<br />//==============================================================<br />byte&nbsp;IIC_SendByte(byte&nbsp;outDat)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;bit;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//send&nbsp;out&nbsp;8-bit&nbsp;data<br />&nbsp;&nbsp;&nbsp;for&nbsp;(bit=0;bit&lt8;bit++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(outDat&0x80)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outDat&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//check&nbsp;for&nbsp;the&nbsp;ACK/NACK<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;&nbsp;&nbsp;//master&nbsp;release&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;&nbsp;&nbsp;//master&nbsp;send&nbsp;a&nbsp;clock<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;if&nbsp;(IIC_SDA_DAT)&nbsp;bit&nbsp;=&nbsp;0xff;&nbsp;//NACK<br />&nbsp;&nbsp;&nbsp;else&nbsp;bit&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ACK<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return(bit);<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;write&nbsp;a&nbsp;series&nbsp;of&nbsp;bytes&nbsp;through&nbsp;IIC&nbsp;bus<br />//&nbsp;Return&nbsp;with&nbsp;0x00&nbsp;if&nbsp;successful<br />//&nbsp;Return&nbsp;with&nbsp;0xff&nbsp;if&nbsp;failed<br />//==============================================================<br />byte&nbsp;IIC_Write(byte&nbsp;*buff,&nbsp;byte&nbsp;total)<br />{<br />&nbsp;&nbsp;&nbsp;while&nbsp;(total)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(IIC_SendByte(*buff++))&nbsp;//get&nbsp;NACK&nbsp;after&nbsp;data&nbsp;byte&nbsp;out<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(0xff);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//abort<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;return(0);<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;read&nbsp;a&nbsp;byte&nbsp;of&nbsp;data&nbsp;and&nbsp;echo&nbsp;with&nbsp;ACK/NACK<br />//&nbsp;return&nbsp;with&nbsp;data&nbsp;read<br />//==============================================================<br />byte&nbsp;IIC_ReadByte(byte&nbsp;ackFlag)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;bit,&nbsp;dat;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;&nbsp;&nbsp;&nbsp;//make&nbsp;sure&nbsp;master&nbsp;release&nbsp;SDA<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//read&nbsp;8&nbsp;bits&nbsp;sof&nbsp;data<br />&nbsp;&nbsp;&nbsp;for&nbsp;(bit=0;bit&lt8;bit++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;&lt&lt=&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(IIC_SDA_DAT)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;back&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dat&nbsp;|=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;//echo&nbsp;with&nbsp;ACK/NACK<br />&nbsp;&nbsp;&nbsp;if&nbsp;(ackFlag==0)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_LO;&nbsp;//echo&nbsp;back&nbsp;ACK<br />&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_SDA_CTL&nbsp;=&nbsp;IIC_MST_HI;&nbsp;//echo&nbsp;back&nbsp;NACK<br /><br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_HI;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;IIC_SCL_CTL&nbsp;=&nbsp;IIC_MST_LO;<br />&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;return(dat);<br />}<br /><br />//==============================================================<br />//&nbsp;Master&nbsp;read&nbsp;a&nbsp;string&nbsp;of&nbsp;data&nbsp;byte&nbsp;through&nbsp;IIC&nbsp;bus<br />//&nbsp;Return:&nbsp;no.&nbsp;of&nbsp;bytes&nbsp;read<br />//==============================================================<br />byte&nbsp;IIC_Read(byte&nbsp;*buff,&nbsp;byte&nbsp;total)<br />{<br />&nbsp;&nbsp;&nbsp;byte&nbsp;count;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;if&nbsp;(total==0)&nbsp;return(0);<br /><br />&nbsp;&nbsp;&nbsp;if&nbsp;(total==1)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;one&nbsp;byte&nbsp;only<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[0]&nbsp;=&nbsp;IIC_ReadByte(1);&nbsp;&nbsp;&nbsp;&nbsp;//NACK&nbsp;after&nbsp;read<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;else&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;more&nbsp;than&nbsp;one&nbsp;bytes<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(total&gt1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[count++]&nbsp;=&nbsp;IIC_ReadByte(0);&nbsp;&nbsp;&nbsp;&nbsp;//echo&nbsp;ACK&nbsp;after&nbsp;read<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;total--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__RESET_WATCHDOG();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IIC_Delay();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buff[count++]&nbsp;=&nbsp;IIC_ReadByte(1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;last&nbsp;byte.&nbsp;echo&nbsp;NACK<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(count);<br />&nbsp;&nbsp;&nbsp;}<br />}<br /><br />
 楼主| 雁舞白沙 发表于 2007-6-18 23:57 | 显示全部楼层

感谢张工!

您所说的问题:<br /><br />另外楼主对I2C总线理解还是有局限性,且犯了一个常见的错误(工程师中犯错概率&gt80%):IIC总线上的高电平是通过外部上拉才得到的,而不是靠引脚输出高电平而得到的。尽管你的程序看似在其它芯片上可以跑,但隐患极大。试想:当读应答位时单片机引脚输出高电平(PIC的引脚驱动能力可达10-20mA),而EEPROM输出应答低电平,这时高低电平发生冲突,类似于电源短路,当然没那么严重。好的结果是功耗无谓增加,严重的结果是由于IO口急变的大电流而造成单片机死机!<br /><br />我不同意。<br /><br />因为:<br /><br />在我所设计的电路中所有的IO口除了有上拉之外,还有IO口限制电阻!<br /><br />我一般选择4.7K阻值!目的就是您所说的IO口高低匹配的问题!<br /><br /><br /><br /><br /><br /><br />所以我的程序可以在其它的MCU中运行!<br /><br />为什么不能在飞思卡尔中运行,是因为其IO口特性不允许在输出的时候读取IO口电平(读的永远是状态寄存器的)<br /><br />这一点是我所犯的错误!<br /><br />对于PIC,LPC我都是应用的开漏输出,并为使用强电流输出模式!<br /><br /><br />最后:<br /><br />非常感谢张工的程序执导,白沙向您鞠躬了!<br />
hotpower 发表于 2007-6-19 00:35 | 显示全部楼层

哈哈~~~我想也是这个问题~~~都是51惹得祸~~~~

让你做3线模拟I2C的意思就是出入分明.<br /><br />告你的:<br />SCL<br />SDAIN<br />SDAOUT<br /><br />真不如写成:<br />SCK<br />MISO<br />MOSI<br /><br /><br />51的IO你随便用,结果只能是惨痛的~~~<br /><br />多玩些MCU,ARM.DSP就知道管脚配置是多么倒塌的重要呀~~~<br /><br />感谢张教主给俺上了堂课~~~<br /><br />可惜菜农一直没机会做飞思卡尔单片机菜鸟~~~<br /><br />MC68HC05早年曾看过,...不知何日能倒塌它~~~<br /><br />祝教主端五节快乐~~~明教一统天下~~~<br />
张明峰 发表于 2007-6-19 08:03 | 显示全部楼层

加IO口限制电阻

“在我所设计的电路中所有的IO口除了有上拉之外,还有IO口限制电阻!<br />我一般选择4.7K阻值!目的就是您所说的IO口高低匹配的问题!”<br /><br />这样做当然可以简单地避免高低电平驱动输出直接发生冲突的问题,但也引入另外一些问题:<br />1)如果串4.7K电阻,则上拉电阻一般要用47K或更大,这样当总线上需要出现低电平时可以得到约0.5V的电压(5V系统),其实这已经超出了IIC总线协议规定的低电平&lt0.4V的指标。如果加大上拉电阻,虽然可以降低低电平电压,但将引起传输延时,严重影响通讯速率,要知道IIC总线上是有容性负载存在的。<br />2)IIC总线其实是一种多主总线,即总线上可以挂多个主器件master。这时主器件在掌控总线前必须要进行仲裁判断以获得控制权。对于IO高电平驱动的控制法,你永远无法实现总线冲突的检测。<br />3)IIC总线上主从器件之间的数据交换是可以相互延时等待的,这可以通过从器件持续拉低SCL线来要求主器件等待。同样的,对于IO高电平驱动的控制法,你永远无法实现这种等待协调机制。<br /><br />你用现在的方法在特定的场合(单主,低速率)实现特定的功能(EEPROM读写)是可以的,但这并不能证明协议的实现是完美的和通用的。通过对IIC总线协议的认识和具体实现,基本可以看一个电工的经验和功底。^_^(开个玩笑)
张明峰 发表于 2007-6-19 08:05 | 显示全部楼层

祝HOTPOWER和各位

端午快乐,多吃粽子
gxs64 发表于 2007-6-19 09:11 | 显示全部楼层

re

对于fsl单片机,应注意io口方向,因为ack是输入的。
 楼主| 雁舞白沙 发表于 2007-6-19 12:29 | 显示全部楼层

您说的太对了!

通过对IIC总线协议的认识和具体实现,基本可以看一个电工的经验和功底!<br /><br />您说的太对了!
HotPower 发表于 2007-6-19 19:09 | 显示全部楼层

哈哈~~~看看SMBus总线就知道上拉限流钳位电压有多重要了~~~

祝教主万福~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

213

主题

789

帖子

242

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