搜索
bottom↓
回复: 226

为感谢在这里得到的帮助,特上传一M16读写24系列的程序,功能齐全,省心,好用,希望对初

[复制链接]

出0入0汤圆

发表于 2005-11-19 12:35:46 | 显示全部楼层 |阅读模式
可以读写2401到24512,任意字节数的读写,

有详细的说明



如果觉得还可以,就顶一下吧!



点击此处下载armok0187511.rar

-----此内容被summer于2005-11-20,22:41:47编辑过







应 mooyee 梵天的梦 的要求,来给通用的,51和avr都可用,用IO口模拟的



点击此处下载armok0190187.rar
-----此内容被summer于2005-12-01,20:55:05编辑过

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2005-11-19 14:03:15 | 显示全部楼层
能完整资料上传吗?这样更方便大家查阅和学习啊...

出0入0汤圆

发表于 2005-11-19 14:50:10 | 显示全部楼层
to:dengyh 就2根线,看看就知道了。

谢谢楼主。

出0入0汤圆

 楼主| 发表于 2005-11-19 16:21:06 | 显示全部楼层
to dengyh  里面有比较详细的使用说明

出0入0汤圆

 楼主| 发表于 2005-11-20 22:43:04 | 显示全部楼层
自顶

出0入0汤圆

发表于 2005-11-21 08:35:25 | 显示全部楼层
谢谢啊,我看了下,确实很好!!!替大家谢谢summer 了

出0入0汤圆

发表于 2005-11-21 08:35:37 | 显示全部楼层
谢谢啊,我看了下,确实很好!!!替大家谢谢summer 了

出0入0汤圆

发表于 2005-11-24 10:46:31 | 显示全部楼层
先顶了在看!

出0入0汤圆

发表于 2005-11-24 11:10:56 | 显示全部楼层
o , thanks

出0入0汤圆

发表于 2005-11-24 16:44:28 | 显示全部楼层
先顶了在看.

出0入0汤圆

发表于 2005-11-30 14:34:57 | 显示全部楼层
好,谢谢

出0入0汤圆

发表于 2005-11-30 23:35:44 | 显示全部楼层
HE.顶不错

出0入0汤圆

发表于 2005-12-1 17:48:57 | 显示全部楼层
能不能做个通用的,不用TWI

出0入0汤圆

发表于 2005-12-2 14:46:14 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2005-12-2 17:29:17 | 显示全部楼层
正需要这个,多谢!



人人为我,我为人人!

出0入0汤圆

发表于 2006-1-6 09:55:27 | 显示全部楼层
果然!好!·

出0入0汤圆

发表于 2006-1-6 10:26:28 | 显示全部楼层
不错!

出0入0汤圆

发表于 2006-1-6 10:57:00 | 显示全部楼层
谢谢!

做得很好呀!

顶!!

出0入0汤圆

发表于 2006-1-6 13:23:50 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2006-1-6 14:40:22 | 显示全部楼层
頂爆你為止!!

出0入0汤圆

发表于 2006-1-13 11:42:37 | 显示全部楼层
定义下,写得不错。

出0入0汤圆

发表于 2006-1-13 13:19:01 | 显示全部楼层
多谢分享,下载了,吱一声。

出0入0汤圆

发表于 2006-1-13 13:37:09 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2006-1-13 19:52:40 | 显示全部楼层
顶先!

出0入0汤圆

发表于 2006-1-13 20:08:12 | 显示全部楼层
好人啊,啥也不说了,谢谢啊~!

出0入0汤圆

发表于 2006-2-10 10:33:39 | 显示全部楼层
我在调试的时候,发现在一个问题,就是重复调用wt24c(w,x,y)时会出现在死等待.



     wt24c(w,x,y);        //第一次写,成功

     wt24c("adfsfwef",20,20);        //第二次写,函数末返回.

     rd24c(r,b,c);        //读



后来发现是第二次调wt24c时,在程序处在函数:

uchar * wt24c_fc(uchar *p, uint ad, uchar n)



中的i2cstart();//函数没返回

再看下去,发现程序在:

while (!(TWCR & (1<<TWINT)));死等待.



我是新手,不知道为什么会这样,特向各位请教.

出0入0汤圆

发表于 2006-2-10 12:27:50 | 显示全部楼层
手头正好有个24C256,参考一下。谢谢SUMMER的无私奉献精神。

出0入0汤圆

发表于 2006-2-10 12:53:16 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2006-2-13 11:31:46 | 显示全部楼层
ding xian

出0入0汤圆

发表于 2006-2-13 13:24:56 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2006-2-22 18:51:41 | 显示全部楼层
3q

出0入0汤圆

发表于 2006-3-2 14:35:42 | 显示全部楼层
谢谢,先试试

出0入0汤圆

发表于 2006-3-2 16:15:55 | 显示全部楼层
不错,顶下先

出0入0汤圆

发表于 2006-3-7 21:20:21 | 显示全部楼层
我将和和电脑通讯的那部分改成在数码管上显示,可是不知怎么的不成功啊。。

出0入0汤圆

发表于 2006-3-21 15:55:16 | 显示全部楼层
顶啊

出0入0汤圆

发表于 2006-3-31 22:42:22 | 显示全部楼层
最近完成了一个24系列的拷贝机,用的是ATtiny13,试验成功后测试速度,24C16拷贝一片要一秒钟左右,后来为防止不稳定,进行了降频使用,现在达到四秒了。这里面不带任何的按键,只要把两个芯片插好了,程序就自动进行写入,并有指示灯来指示。呵呵。只是有个问题没解决,就是如何能够区别出插上的芯片到底是24C16以下的芯片,还是以上的芯片?到最后也没能让程序自动判断出来,后来没办法在板上加了个跳线。是否有高手给指点一下。另外不能对源片进行任何数据修改为前提的。

出0入0汤圆

发表于 2006-4-1 23:22:49 | 显示全部楼层
3KS

出0入0汤圆

发表于 2006-4-3 08:57:11 | 显示全部楼层

出0入0汤圆

发表于 2006-4-5 08:52:57 | 显示全部楼层
版主您好,我使用了你的模拟IIC程序,我的SDA是PD7,SCL是PD6,晶振16M

我在用的时候发现可以读,但不能写,程序里没有延时函数,我自己写了一个如下:

void tus(uchar t)

{

uint count;

for(count=0;count<t;count++)

asm("NOP");

asm("NOP");



}

void tms(uchar t)

{

tus(1000);

}



希望你能帮我看看,比较急,谢谢

出0入0汤圆

发表于 2006-4-7 16:09:51 | 显示全部楼层
不错,顶。

有GCC版本的就更好了

出0入0汤圆

发表于 2006-4-7 16:36:23 | 显示全部楼层
请大侠指点一下这三句怎么理解?:



n=ad_dst/PAGE_SIZE;                //确定地址与块地址的差

if(n) n=(ulong)PAGE_SIZE*(n+1)-ad_dst;       

else n=PAGE_SIZE-ad_dst;

出0入0汤圆

 楼主| 发表于 2006-4-7 22:05:04 | 显示全部楼层
to:52robot



如果你是用的软件模拟I2总线的话,应该是延时不够长。延时至少5ms!





to:skyhowl

我也记不得了,总之是为了跨页写页边界的考虑,可参考24Cxx的数据守则。

出0入0汤圆

发表于 2006-4-8 08:40:28 | 显示全部楼层
多谢楼主了,能解释一下“PAGE_SIZE”为何要转换为ulong呢??
-----此内容被skyhowl于2006-04-08,09:06:41编辑过

出0入0汤圆

 楼主| 发表于 2006-4-8 21:39:10 | 显示全部楼层
PAGE_SIZE*(n-1)有可能超过PAGE_SIZE的范围啊

出0入0汤圆

发表于 2006-4-10 16:45:00 | 显示全部楼层
多谢楼主,辛苦了,已经用你的程序在GCC下调通了128读写24C01的实验。



受益ing!!



感谢ing!!

出0入0汤圆

发表于 2006-4-10 21:15:54 | 显示全部楼层
问下楼主?

1.函数说明:

1) void wt24c(uchar *p_rsc, uint ad_dst, uint num);

功能: 从主机内存的指定地址 p_dst 开始,把 num 个数据写入到24Cxx芯片指定的地址 ad_rsc 开始的地址空间中                   

2) void rd24c(uchar *p_dst, uint ad_rsc, uint num);

功能: 从24Cxx芯片的指定地址 ad_rsc 开始,读出 num 个字节的数据到主机的指定的地址 p_dst 开始的内存中去;

向楼主求证下?在1)中的变量p_dst,ad_rsc

与函数void wt24c(uchar *p_rsc, uint ad_dst, uint num);的变量不同

是笔误吗?

我是新手,提的问题可能比较可笑,有时间请楼主留意下。

出0入0汤圆

 楼主| 发表于 2006-4-10 22:10:06 | 显示全部楼层
to:tearsnow

是啊,呵呵,就是笔误,都搞混了。

出0入0汤圆

发表于 2006-5-3 20:24:06 | 显示全部楼层
就怎么办

出0入0汤圆

发表于 2006-6-5 17:13:47 | 显示全部楼层
我用的是mega8,下载了前面的程序,用于读写24C32,写操作还好一些,但是读操作不是很顺利,读3~4次成功1次,而且会超时导致系统复位,不知哪位高手指点一下,谢谢

出0入0汤圆

发表于 2006-6-5 17:20:57 | 显示全部楼层
他的读函数是又问题的,读完最后一位应发非应答位,可是他没有发,不知他是故意把程序搞成这样还是粗心所致那我就不清楚了。

void rd24c(uchar *p_dst, uint ad_rsc, uint num)

{   uchar t=0;

        #if e2prom<32

        t=(((ad_rsc>>8)&0x07)<<1);

        //t<<=1;

        #endif

                WDR();       

        i2cstart();                                        //发送起始信号

        if(i2cwt(W_ADD_COM|t)==SLAW)//发送SLA_W, 写字节命令及器件地址

        {       

            //i2cwt(W_ADD_COM+t)

            WDR();

                #if e2prom>16

                i2cwt(ad_rsc>>8);                //ad_rsc的高位,  发送要读出数据的地址

                #endif

                i2cwt(ad_rsc);                        //ad_rsc的低位

                                WDR();

                i2cstart();                                //再发送起始信号

                i2cwt(R_ADD_COM|t);                //发送SLA_R, 读命令字节及器件地址

                               

                for(;num>0;num--)

                {   *p_dst=i2crd();                //从器件读出一个字节

                        p_dst++;

                        WDR();                       

                }

        }

        else syserr=ERR_SLAW;                //写字节命令及器件地址错或对方无应答

                WDR();       

/*※※※※※▲▲△△▲※▲△▲■▲※№☆№№☆☆★★☆★★★★★        */



        i2c_NAck();////////////////////////△▲■△△△注意这里■■■



/*@→○◎◎※→←←↑↑←※▲▲※→←※※@▲▲☆★○●★◎◇◆◆◇*/

        i2cstop();

        tms(10);



}

△△△△△▲▲▲▲▲※※※※※→→→●●●→→※※※‰

加入这段程序你在试试,我加上这段程序就一切OK!

void i2c_NAck(void)

{

   TWCR = BIT(TWINT) | BIT(TWEN);

   while (!(TWCR & BIT(TWINT)));

   WDR();

}
-----此内容被_yu-ming于2006-06-05,17:25:29编辑过

出0入0汤圆

发表于 2006-6-5 17:58:45 | 显示全部楼层
谢谢,_yu-ming 还有版主

我回去试一下

出0入0汤圆

发表于 2006-6-6 08:46:00 | 显示全部楼层
hao a

出0入0汤圆

发表于 2006-6-6 08:46:05 | 显示全部楼层
我仔细看过datasheet了,除了_yu-ming 说的那个问题外,我得程序中还有一个地址的错误,调整过来之后,现在好了,谢谢,谢谢各位了

出0入0汤圆

发表于 2006-6-6 09:22:34 | 显示全部楼层
能告诉我你的地址错误是在哪里吗?最好是在上传一次。

出0入0汤圆

发表于 2006-6-6 11:12:34 | 显示全部楼层
写的函数void wt24c(uchar *p_rsc, uint ad_dst, uint num);

要每写完一页延时100毫秒,这样可以保证写入的数据正确,具体的时间请参考AT24Cxx器件手册

出0入0汤圆

发表于 2006-6-8 13:39:37 | 显示全部楼层
地址错误是我没有区分32这个界线,现在我用24C256试了一下,有一个问题,我想一次从256中按结构体(26字节)读出所有内容,但是好像不行,而且每次读出的字节数还不一样,使用32不会有这个问题,请问大侠何解?img src=./emotion/em001.gif

出0入0汤圆

发表于 2006-6-8 17:45:26 | 显示全部楼层
^_^,向各位大侠告喜了,从24C256中一次读出所有字节成功,用的就是这里的程序,只不过在连续读出中,加入10ms的延时,^_^

出0入0汤圆

发表于 2006-6-8 17:55:12 | 显示全部楼层
我用IO口模拟的,结果读出的都是0XFF,请问谁遇到这个问题了, 怎么解决.多谢

出0入0汤圆

发表于 2006-6-13 12:20:42 | 显示全部楼层
总算解决了

出0入0汤圆

发表于 2006-7-12 20:42:58 | 显示全部楼层
程序写的比较乱,但是我还是要支持下!!!!!!

出0入0汤圆

发表于 2006-7-13 09:37:55 | 显示全部楼层
_yu-ming,你好:



楼主的原程序中是没有WDR();的,能否给出WDR()的详细信息呢?



谢谢!

出0入0汤圆

发表于 2006-7-13 09:59:02 | 显示全部楼层
顶!

出0入0汤圆

发表于 2006-7-13 16:11:48 | 显示全部楼层
up一下

出0入0汤圆

发表于 2006-7-19 13:25:51 | 显示全部楼层
太感谢大家乐

出0入0汤圆

发表于 2006-8-11 10:12:14 | 显示全部楼层
回60楼:

WDR();是我在程序中加的看门狗复位程序,在规定的时间内喂狗一次,以防止在写I2C的时候程序复位。

出0入0汤圆

发表于 2006-8-19 11:33:11 | 显示全部楼层
楼主

你的程序可以通过串口向PC机传送读写数据及状态



那能否PC机通过串口向AVR写数

然后存到EEPROM中呀



请指教

谢谢

出0入0汤圆

发表于 2006-8-19 12:02:25 | 显示全部楼层
谢谢

出0入42汤圆

发表于 2006-8-19 12:45:34 | 显示全部楼层
好帖   顶啊     同志们

出0入0汤圆

发表于 2006-8-24 04:00:30 | 显示全部楼层
多看些已沉的贴,也有收收获的!



帮你顶一下!

出0入0汤圆

发表于 2006-8-24 17:24:35 | 显示全部楼层
收藏并顶!

谢谢楼主的无私奉献!

出0入0汤圆

发表于 2006-8-25 10:02:37 | 显示全部楼层
此程序思路很清析.

谢谢楼主.

我试了一个周.

M128.8M.24LC256.

但有时会因为存贮数据不同出现异常.

不知为什么.

谢谢楼主.

出0入0汤圆

发表于 2006-9-21 10:57:58 | 显示全部楼层
你好,楼主.

首先谢谢你的程序,你的程序容易懂.写的不错.

不过读的程序是有点问题.

我是用来读写24c128.用的是M16.

可为什么我读出来的数据总是从0x20开始的呢

比如:我从00开始写0~64

     从05可是读,可读出来的数据是25,26,27.........

我也已经加上了非应答了,还是一样.

这是为什么呢??

有那位高手可以帮我解答.

出0入0汤圆

发表于 2006-9-25 20:50:51 | 显示全部楼层
和大家一样发现读一次可以,再读一次就不行了,大家有没有改好的,上传一份完整的!

出0入0汤圆

发表于 2006-10-6 21:57:15 | 显示全部楼层
学习一下.

出0入0汤圆

发表于 2006-10-6 22:10:41 | 显示全部楼层
爱谁是谁吧.

我是爱好者,我就是喜欢爱好者做的东西GCC.本来我打算自己做个编译器的.可是自己没那本事.

谁叫 我们爱好者- 追求无极限呢.玩的就是想法.

出0入0汤圆

发表于 2006-10-7 11:34:01 | 显示全部楼层
to 大家: AVR不是带了EEPROM为什么还要外挂24CXX,真是有些不明,而且也足够大,非常好用,调用一下库函数就行了,TWI用来做通信很好.

出0入0汤圆

发表于 2006-10-7 11:56:49 | 显示全部楼层
xiefengwise 不要在这泼凉水 .

内部的你够用难道别人也就够用了吗?



能把源程序贴出来让大家学习的都值得尊敬!!!!只有这样我们这些菜鸟才能很快的进步

出0入0汤圆

发表于 2006-10-16 11:49:37 | 显示全部楼层
确实不错,非常感谢!

出0入0汤圆

发表于 2006-10-20 14:49:05 | 显示全部楼层
谢谢:

我试了一下下面的那个(51和AVR通用的),编译报:

!ERROR file '_24CxxMain.o': undefined symbol '_txdpo'



_txdpo',请教是什么?

出0入0汤圆

发表于 2006-10-20 16:02:49 | 显示全部楼层
谢谢了!

出0入0汤圆

发表于 2006-10-20 17:46:35 | 显示全部楼层
我试了你IO模拟的不可以啊

出0入0汤圆

发表于 2006-10-22 18:49:21 | 显示全部楼层
收藏并顶!

谢谢楼主的无私奉献!

出0入0汤圆

发表于 2006-10-23 09:10:46 | 显示全部楼层
感谢楼主的无私奉献

另外,这个帖子现在比较乱,有整理好的能上传一份就更好了

出0入0汤圆

发表于 2006-11-11 01:17:16 | 显示全部楼层
为什么在发STOP信号之后还有再延时10ms ( tms(10); ) ??

出0入0汤圆

发表于 2006-11-24 16:40:04 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2006-11-24 20:17:49 | 显示全部楼层
在这里无私奉献的人可真多,真是个学习AVR的好地方.

顶本帖子,也顶本论坛.

出0入0汤圆

发表于 2007-4-21 11:48:42 | 显示全部楼层
好也,慢慢看!!!!!

出0入0汤圆

发表于 2007-4-23 09:36:13 | 显示全部楼层
顶一下

出0入0汤圆

发表于 2007-4-23 15:12:17 | 显示全部楼层
点解,我在51调试时。要连续写两次才能把数值写进24C256呢?

读就不用!!!!!!!

出0入0汤圆

发表于 2007-4-23 16:08:44 | 显示全部楼层
问题解决!

真的在页读时加个NOT_ASK,不过在写时好像没麽问题啊!

C51:

void no_ack(void)

{

SDA_H; DELAY_us;

SCL_H; DELAY_us;

SCL_L; DELAY_us;

}

放在读函数那里

void rd24c(unsigned char  *p_dst, unsigned int ad_rsc, unsigned int num)

{   unsigned char  t=0;



        #if e2prom<32

        t=ad_rsc>>8;

        t<<=1;

        #endif

               

        i2cstart();                                        //发送起始信号

               

        if(i2cwt(W_ADD_COM+t))                //发送写字节命令及器件地址

        {       

                #if e2prom>16

                i2cwt(ad_rsc>>8);                //ad_rsc的高位,  发送要读出数据的地址

                #endif

                i2cwt(ad_rsc);                        //ad_rsc的低位

                               

                i2cstart();                                //再发送起始信号

                i2cwt(R_ADD_COM+t);                //发送SLA_R, 读命令字节及器件地址

                               

                for(;num>0;num--)

                {   *p_dst=i2crd();                //从器件读出一个字节

                        p_dst++;

                }

                syserr=0;

        }

        else syserr=I2C_ERR;                //写字节命令及器件地址错或对方无应答

/**********************注意这里啊***************************************

************************************************************************/

        no_ack();         

/**********************************************************************

***********************************************************************/

        i2cstop();



}

出0入0汤圆

发表于 2007-4-23 23:21:01 | 显示全部楼层
好东西,谢谢分享。

出0入0汤圆

发表于 2007-4-24 09:53:24 | 显示全部楼层
谢谢分享!!!!!

出0入0汤圆

发表于 2007-4-24 09:54:43 | 显示全部楼层
谢谢!顶顶

出0入0汤圆

发表于 2007-5-10 09:01:00 | 显示全部楼层
谢谢,先顶了再看

出0入0汤圆

发表于 2007-5-10 19:10:06 | 显示全部楼层
像这样的示例在AVR上才能经常看到!谢谢

出0入0汤圆

发表于 2007-5-13 21:26:40 | 显示全部楼层
谢谢啊,好样的啊

出0入0汤圆

发表于 2007-5-19 19:46:24 | 显示全部楼层
好东西啊。谢谢了。收下了

出0入0汤圆

发表于 2007-5-20 22:01:35 | 显示全部楼层
顶一个!

出0入0汤圆

发表于 2007-9-1 09:17:34 | 显示全部楼层
谢谢啊,我看了下,确实很好!!!      顶一个!

出0入0汤圆

发表于 2007-9-11 22:07:18 | 显示全部楼层
谢谢楼主分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-28 12:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表