24C16當全速(F5)運行時後不能正確讀取數據?

[复制链接]
 楼主| action99 发表于 2007-11-28 16:51 | 显示全部楼层 |阅读模式
<br /><br />我用的是HT46R23,這個程序是讀寫EEPRPM&nbsp;&nbsp;24C16,用的是IIC來做,在用STEP&nbsp;OVER按鍵時讀出的數據是正確。但按下F5(全速)時讀出的數據就不正確了。高手指點。。。<br /><br /><br /><br />main{<br />&nbsp;&nbsp;_clrwdt();<br />&nbsp;&nbsp;writer_eeprom(0xa0,0x00,0x8a,0x05);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//連繼寫5個數據,地址00,<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;read_eeprom(0xa0,0x00,0x07);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//read&nbsp;&nbsp;5&nbsp;datas&nbsp;&nbsp;,addr=00&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />}<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writer_eeprom<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;writer_eeprom(unsigned&nbsp;char&nbsp;pag,unsigned&nbsp;char&nbsp;eeprom_addr,unsigned&nbsp;eeprom_data,unsigned&nbsp;char&nbsp;eeprom_cnt)<br />{<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,data;<br />&nbsp;&nbsp;eeprom_star();<br />&nbsp;&nbsp;eeprom_send(pag|=write_comm);<br />&nbsp;&nbsp;answer_ack();<br />&nbsp;&nbsp;eeprom_send(eeprom_addr);<br />&nbsp;&nbsp;answer_ack();<br />&nbsp;&nbsp;for(i=0;i&lteeprom_cnt;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;eeprom_send(eeprom_data);<br />&nbsp;&nbsp;&nbsp;&nbsp;answer_ack();<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;eeprom_stop();<br />}<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;read_eeprom<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;read_eeprom(unsigned&nbsp;char&nbsp;pag,unsigned&nbsp;char&nbsp;eeprom_addr,unsigned&nbsp;char&nbsp;eeprom_cnt){<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i&nbsp;;<br />&nbsp;&nbsp;eeprom_star();<br />&nbsp;&nbsp;eeprom_send(pag|=write_comm);<br />&nbsp;&nbsp;answer_ack();<br /><br />&nbsp;&nbsp;eeprom_send(eeprom_addr);<br />&nbsp;&nbsp;answer_ack();<br />&nbsp;&nbsp;eeprom_star();<br />&nbsp;&nbsp;eeprom_send(read_comm);<br />answer_ack();<br />&nbsp;&nbsp;for(i=0;i&lteeprom_cnt;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;eeprom_read();<br />&nbsp;&nbsp;&nbsp;&nbsp;eeprom_congregate=eeprom_da;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;eeprom_stop();<br />}<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eeprom_read<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;eeprom_read(){<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,data;<br />&nbsp;&nbsp;&nbsp;&nbsp;eeprom_da=0;<br />&nbsp;&nbsp;&nbsp;rom_sda_c=1;<br />&nbsp;&nbsp;for(i=0;i&lt8;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_c=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if(rom_sda)_c=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_rlc(&eeprom_da);<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;rom_sda_c=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=0;<br />rom_clk=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />}<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eeprom_star<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;eeprom_star(){<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eeprom_stop<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;eeprom_stop(){<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />}&nbsp;&nbsp;&nbsp;&nbsp;<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eeprom_send<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;eeprom_send(unsigned&nbsp;char&nbsp;eeprom_data_buff){<br />&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i;<br />&nbsp;&nbsp;for(i=0;i&lt8;i++){<br />&nbsp;&nbsp;&nbsp;&nbsp;_rlc(&eeprom_data_buff);<br />&nbsp;&nbsp;&nbsp;&nbsp;if(_c)rom_sda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;&nbsp;rom_sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />&nbsp;&nbsp;}<br />}<br />//************************************<br />//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;answer_ack<br />//************************************&nbsp;&nbsp;&nbsp;&nbsp;<br />void&nbsp;&nbsp;&nbsp;&nbsp;answer_ack(){<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_sda_c=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop();<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=1;<br />wait_ack:<br />&nbsp;&nbsp;&nbsp;if(rom_sda)goto&nbsp;&nbsp;&nbsp;&nbsp;wait_ack;<br />&nbsp;&nbsp;rom_sda_c=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;rom_clk=0;<br />}<br />
tyw 发表于 2007-11-28 22:21 | 显示全部楼层

把延时增大点试

  
 楼主| action99 发表于 2007-11-29 10:03 | 显示全部楼层

加延時都沒用

加延時都沒用。。我在每個IO口操作以後加了多個NOP,結果也是一樣。。。請指教!!!
tyw 发表于 2007-11-29 19:27 | 显示全部楼层

写入时每字节间隔10ms了吗?

&nbsp;<font color=#008040>贴个东东参考一下</font><br /><font color=#008040></font><br /><br /><br />一个24c16的读写程序(已经调试过)(arens)<br />&nbsp;<br /><br />////////////////////////////////////////////////////////////////<br /><br />//24c16读写驱动程序,<br />//=-----------------------------------------------------------------------------<br />--<br />/*模块调用:<br />读数据:read(unsigned&nbsp;int&nbsp;address)<br />写数据:write(unsigned&nbsp;int&nbsp;address,unsigned&nbsp;char&nbsp;dd)&nbsp;&nbsp;&nbsp;dd为要写的&nbsp;数据字节*/<br />//------------------------------------------------------------------------------<br />----<br /><br />sbit&nbsp;sda=P3^0;<br />sbit&nbsp;scl=P3^1;<br /><br />sbit&nbsp;a0=ACC^0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义ACC的位,利用ACC操作<br />速度最快<br />sbit&nbsp;a1=ACC^1;<br />sbit&nbsp;a2=ACC^2;<br />sbit&nbsp;a3=ACC^3;<br />sbit&nbsp;a4=ACC^4;<br />sbit&nbsp;a5=ACC^5;<br />sbit&nbsp;a6=ACC^6;<br />sbit&nbsp;a7=ACC^7;<br /><br />//------------------------------------------------------------------------------<br />--------<br />#pragma&nbsp;disable<br />void&nbsp;s24(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//起始函数<br />{<br />_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;sda=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;sda=1;<br />}<br /><br /><br /><br /><br /><br />//------------------------------------------------------------------------------<br />-------<br />#pragma&nbsp;disable<br />void&nbsp;p24(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//停止函数<br />{<br />sda=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;sda=1;<br />}<br /><br /><br /><br />//------------------------------------------------------------------------------<br />------<br />#pragma&nbsp;disable<br />unsigned&nbsp;char&nbsp;rd24(void)&nbsp;/////////////////从24c16读一字节数据<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACC=0x00;<br />sda=1;<br />scl=1;a7=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a6=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a5=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a4=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a3=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a2=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a1=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />scl=1;a0=sda;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=1;scl=1;_nop_();_nop_();_nop_();_nop_<br />();scl=0;&nbsp;///&nbsp;///////////////24c16的一位回答位。<br />return(ACC);<br />}<br />//------------------------------------------------------------------------------<br />----<br />#pragma&nbsp;disable<br />void&nbsp;wd24(unsigned&nbsp;char&nbsp;dd)&nbsp;////////////////向24c16写一字节数据<br />{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sda=1;<br />ACC=dd;<br />sda=a7;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a6;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a5;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a4;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a3;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a2;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a1;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=a0;scl=1;_nop_();_nop_();_nop_();_nop_();scl=0;<br />sda=0;scl=1;//scl=0;(在下面程序中)<br />}<br />//---------------------------------------------------------------------------<br />#pragma&nbsp;disable<br />unsigned&nbsp;char&nbsp;read(unsigned&nbsp;int&nbsp;address)<br />{<br />unsigned&nbsp;char&nbsp;dd;<br />&nbsp;&nbsp;&nbsp;&nbsp;s24();&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;wd24(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////写器件地址(写命令)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scl=0;&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;wd24(address);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////&nbsp;写数据地址<br />&nbsp;&nbsp;&nbsp;&nbsp;_nop_();_nop_();_nop_();_nop_();<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;<br />s24<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;///////////////////////////////////开始条件<br />&nbsp;&nbsp;&nbsp;&nbsp;wd24(0xa1);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////////////写器件地址(读命<br />令)<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;dd=rd24();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//////////////////////////////////读&nbsp;一字节<br />&nbsp;&nbsp;&nbsp;&nbsp;p24();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////////////////停止条件<br />&nbsp;&nbsp;&nbsp;&nbsp;return(dd);<br />}<br />//------------------------------------------------------------------------------<br />--<br />#pragma&nbsp;disable<br />void&nbsp;write(unsigned&nbsp;int&nbsp;address,unsigned&nbsp;char&nbsp;dd)<br />{<br /><br /><br />s24();&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;wd24(0xa0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;////////////////////////写器件地址;<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;wd24(address);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/////////////////////写数据地址<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;wd24(dd);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//////////////////////////写dd数据<br />&nbsp;&nbsp;&nbsp;&nbsp;scl=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;p24();&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;<br /><br />}&nbsp;<br /><br />(**推荐人:铁匠)&nbsp;<br /><br />[/TD][/TR][/TABLE]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

189

帖子

2

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