单片机写EErom的问题

[复制链接]
 楼主| mm7989680 发表于 2009-5-20 11:19 | 显示全部楼层 |阅读模式
写24c02用c8051F020模拟的I2C总线程序如下,从实验的结果看,读eerom是没问题的,好像写的字节只有0,2,4这几个地址是对的,1,3,5地址的都没有写进去,C8051F020的p4口不能位操作,所以sda和SCL的操作稍复杂,但示波器观察都是正确的,现在就是不知道为社么偶地址的字节为什么没有写进去,原来自己用其它单片机io口模拟的都是可以的
 楼主| mm7989680 发表于 2009-5-20 11:23 | 显示全部楼层

程序如下

#include&nbsp;&lteeprom.h&gt<br /><br />&nbsp;&nbsp;/*发送起始条件*/<br />void&nbsp;Start(void)&nbsp;/*起始条件*/<br />{<br />SdaSet;<br />delay(50);<br />SclSet;<br />delay(50);<br />SdaClr;<br />delay(50);<br />}<br /><br />void&nbsp;Stop(void)&nbsp;/*停止条件*/<br />{<br />SdaClr;<br />delay(50);<br />SclSet;<br />delay(50);<br />SdaSet;<br />delay(50);<br />}<br /><br />void&nbsp;Ack(void)&nbsp;/*应答位*/<br />{<br />SdaClr;<br />delay(50);<br />SclSet;<br />delay(50);<br />SclClr;<br />delay(50);<br />}<br /><br />void&nbsp;NoAck(void)&nbsp;/*反向应答位*/<br />{<br />SdaSet;<br />delay(50);<br />SclSet;<br />delay(50);<br />SclClr;<br />delay(50);<br />}<br /><br />void&nbsp;Send(uchar&nbsp;Data)&nbsp;/*发送数据子程序,Data为要求发送的数据*/<br />{<br />uchar&nbsp;BitCounter=8;&nbsp;/*位数控制*/<br />uchar&nbsp;temp;&nbsp;/*中间变量控制*/<br />//supplydog();<br />do<br />{<br />temp=Data;<br />SclClr;<br />delay(50);<br />if((temp&0x80)==0x80)/*&nbsp;如果最高位是1*/<br />SdaSet;<br />else<br />SdaClr;<br />delay(50);<br />SclSet;<br />delay(50);<br />temp=Data&lt&lt1;&nbsp;/*RLC*/<br />Data=temp;<br />BitCounter--;<br />}while(BitCounter);<br />SclClr;<br />delay(50);<br />}<br /><br />uchar&nbsp;Read(void)&nbsp;/*读一个字节的数据,并返回该字节值*/<br />{<br />uchar&nbsp;temp=0;<br />uchar&nbsp;temp1=0;<br />uchar&nbsp;BitCounter=8;<br />SdaSet;<br />delay(50);<br />//supplydog();<br />do{<br />SclClr;<br />delay(50);<br />SclSet;<br />delay(50);<br />///////////////////////////////////////////<br />P74OUT=0x3E;<br />P4|=0x02;<br />if((P4&0x02)==0x02)<br />//if(Sda)<br />temp=temp|0x01;&nbsp;/*temp的最低位置1*/<br />else<br />temp=temp&0xfe;&nbsp;/*否则temp的最低位清0*/<br />P74OUT=0x3F;<br />delay(50);<br />SclSet;<br />///////////////////////////////////////////<br />if(BitCounter-1)<br />{&nbsp;temp1=temp&lt&lt1;<br />temp=temp1;<br />}<br />BitCounter--;<br />}while(BitCounter);<br />return(temp);<br />}<br /><br />void&nbsp;WrToROM(uchar&nbsp;Data[],uchar&nbsp;Address,uchar&nbsp;Num)<br />{<br />uchar&nbsp;i;<br />uchar&nbsp;*PData;<br />PData=Data;<br />for(i=0;i&ltNum;i++)<br />{<br />Start();&nbsp;/*发送启动信号*/<br />Send(0xa0);&nbsp;/*发送SLA+W*/<br />Ack();<br />Send(Address+i);&nbsp;/*发送地址*/<br />Ack();<br />Send(*(PData+i));<br />delay(50);<br />Ack();<br />Stop();<br /><br />}<br />}<br /><br />void&nbsp;RdFromROM(uchar&nbsp;Data[],uchar&nbsp;Address,uchar&nbsp;Num)<br />{<br />uchar&nbsp;i;<br />uchar&nbsp;*PData;<br />PData=Data;<br />for(i=0;i&ltNum;i++)<br />{<br />delay(100);<br />Start();<br />Send(0xa0);<br />Ack();<br />Send(Address+i);<br />Ack();<br />Start();<br />Send(0xa1);<br />Ack();<br />*(PData+i)=Read();<br />delay(50);<br />SclClr;<br />delay(50);<br />NoAck();<br />Stop();<br />}<br />}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

113

主题

374

帖子

4

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