基于S3C44B0的IIC EEPORM读写

[复制链接]
2666|0
 楼主| wangben85 发表于 2008-9-26 20:02 | 显示全部楼层 |阅读模式
本人研一新生,今天编写了一个24C04的IIC&nbsp;EEPROM程序。尽管调试成功了。但仍然有些许疑惑。望高手指教。<br /><br />#include&nbsp;&quot;44b.h&quot;<br />#include&nbsp;&quot;def.h&quot;<br /><br />#include&nbsp;&quot;44blib.h&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//程序中使用了Uart_Printf()<br /><br />INT8U&nbsp;buffer;&nbsp;&nbsp;&nbsp;//调试<br /><br />void&nbsp;Rd24C040(INT32U&nbsp;slvAddr,INT32U&nbsp;addr,INT8U&nbsp;*data)<br />{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ACKflag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/***********发送设备地址***************/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=(1&lt&lt7)|(0&lt&lt6)|(1&lt&lt5)|(0xf);&nbsp;&nbsp;&nbsp;&nbsp;//继续IIC操作<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;&nbsp;&nbsp;&nbsp;//从设备地址<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xf0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(ACKflag==0);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ACKflag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;/***********发送内部地址***************/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=(1&lt&lt7)|(0&lt&lt6)|(1&lt&lt5)|(0xf);&nbsp;&nbsp;//继续IIC操作<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=addr;&nbsp;&nbsp;&nbsp;//EEPROM内部地址<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(ACKflag==0);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ACKflag=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICDS=slvAddr;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//再发一遍从设备地址<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/***********接收数据***************/<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0xb0;&nbsp;&nbsp;&nbsp;&nbsp;//开始接收,主接收信号<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=(1&lt&lt7)|(0&lt&lt6)|(1&lt&lt5)|(0xf);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(ACKflag==0);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ACKflag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=(1&lt&lt7)|(0&lt&lt6)|(1&lt&lt5)|(0xf);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Delay(0);&nbsp;&nbsp;//非常重要的延时程序,满足系统时序,不可少<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;buffer=rIICDS;&nbsp;&nbsp;//调试<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*data=rIICDS;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(ACKflag==0);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;ACKflag=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICSTAT=0x90;//主接收停止<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rIICCON=(0&lt&lt7)|(0&lt&lt6)|(1&lt&lt5)|(0xf);&nbsp;&nbsp;&nbsp;//允许产生中断,&nbsp;IICCLK=MCLK/16,&nbsp;不需要ACK应答,//64Mhz/16/(15+1)&nbsp;=&nbsp;250Khz&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;}<br />&nbsp;<br />&nbsp;<br />&nbsp;void&nbsp;__irq&nbsp;IicInt(void)<br />{<br /><br />&nbsp;&nbsp;rI_ISPC=BIT_IIC;&nbsp;&nbsp;//清除IIC中断未决位<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;ACKflag=1;<br />&nbsp;&nbsp;&nbsp;<br />}<br /><br />void&nbsp;Main(void)<br /><br />{<br /><br />&nbsp;&nbsp;INT8U&nbsp;i,data[16];<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;rSYSCFG=CACHECFG;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//配置8K&nbsp;Cache<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;_44blib_init();<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Delay(10);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;IIC_Init();&nbsp;&nbsp;&nbsp;//IIC初始化<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;Uart_Printf(&quot;
Write&nbsp;test&nbsp;data&nbsp;into&nbsp;AT24LC04
&quot;);<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;for(i=0;i&lt16;i++)&nbsp;&nbsp;&nbsp;&nbsp;//将数据写入AT2404<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Wr24C040(0xa0,(INT8U)i,i);&nbsp;<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;%2x&quot;,i)&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;//显示写入的数据&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;Uart_Printf(&quot;
Read&nbsp;test&nbsp;data&nbsp;from&nbsp;AT24LC04
&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清零数据区(为下面的读)<br /><br />&nbsp;&nbsp;for(i=0;i&lt16;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;Rd24C040(0xa0,(INT8U)i,&(data));&nbsp;&nbsp;&nbsp;&nbsp;//从AT2404读入前面写入的数据<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Uart_Printf(&quot;%2x&quot;,data)&nbsp;&nbsp;;&nbsp;&nbsp;&nbsp;//从IIC中读出验证<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;程序如上。<br />问题:Delay(0);&nbsp;&nbsp;//非常重要的延时程序,满足系统时序,不可少<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该函数如果不加,我发现在调试时,单步运行可以读出数据。但是全速运行时就不能得出争取结果。读出的数据很奇怪。<br />&nbsp;&nbsp;&nbsp;&nbsp;希望高手教我。<br /><br />注:Delay(0)并非不延时。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

21

帖子

0

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