搜索
bottom↓
回复: 19

用TWI中断对24c16的字节读写 共享

[复制链接]

出0入0汤圆

发表于 2005-5-30 18:34:08 | 显示全部楼层 |阅读模式
//TWI初始化

TWSR=0x00;

TWBR=0x06;

TWAR=0x01;

TWCR=0x41;



//TWI中断函数



SIGNAL(SIG_2WIRE_SERIAL)

{//IIC中断

  switch(eep_int_seq)

   {

           case 1 :

                   {

                    if((TWSR&0xf8) != 0x08)

                     {//发送start信号出错

                      eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                     }

                    else

                     {//发送start信号成功

                      TWDR=slave_rw&0xfe;                //发送器件地址

                   TWCR &= ~0x20;                        //清start发送标志

                     }

                    break;

                   }

           case 2 :

                   {

                 if((TWSR&0xf8) != 0x18)

                  {//发送器件地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送器件地址成功

                   TWDR=eeprom_addr;

                  }

                 break;

                }

        case 3 :

                {

                 if((TWSR&0xf8) != 0x28)

                  {//发送eeprom地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送eeprom地址成功

                   if((slave_rw&0x01)==0)  //写数据进eeprom

                    TWDR=eeprom_data;

                   else

                    {//从eeprom读数据

                     TWCR = 0xa5;                        //重新启动start信号

                     eep_int_seq++;

                     return;

                    }

                  }

                 break;

                }

        case 4 :

                {

                 if((slave_rw&0x01)==0)

                  {//写eeprom

                   if((TWSR&0xf8) != 0x28)

                    {//发送eeprom数据出错

                     eep_int_seq=1;

                        TWCR = 0xa5;                        //错误,启动start信号

                        return;

                    }

                   else

                    {//发送eeprom数据成功

                     eep_int_seq=0;//0xff;

                     write_eep_flag=YES;        //写eeprom延时标志

                     TWCR = 0x94;                         //发送停止信号

                     return;

                    }

                  }

                 else

                  {//读eeprom

                   if((TWSR&0xf8) != 0x10)

                    {//重发start信号出错

                     eep_int_seq=1;

                        TWCR = 0xa5;                        //错误,启动start信号

                        return;

                    }

                   else

                    {//重发start信号成功

                     TWDR=slave_rw;                        //发器件地址

                     TWCR &= ~0x20;                        //清start发送标志

                    }

                  }

                 break;

                }

        case 5 :

                {

                 if((TWSR&0xf8) != 0x40)

                  {//发送器件地址出错

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                // else

                 // TWCR |= 0x04;                        //slave_rw发送成功,并接收到ack

                 break;

                }

        case 6 :

                {

                 if((TWSR&0xf8) != 0x50 && (TWSR&0xf8) != 0x58)

                  {

                   eep_int_seq=1;

                      TWCR = 0xa5;                        //错误,启动start信号

                      return;

                  }

                 else

                  {//发送器件地址成功

                   eep_int_seq=0;//0xff;

                   //write_eep_flag=YES;

                   get_eeprom_data=TWDR;

                   TWCR |= 0x94;//发送停止信号

                   return;

                  }

                 break;

                }

        default : break;

   }

  eep_int_seq++;

  TWCR |= 0x80;                //清TWINT标志

}



//AT24C16的字节读写函数

void OprateEepromByte(unchar read_flag,unchar byte_addr,unchar byte_data)

{

  slave_rw=(read_flag&0x0f)|0xa0;

  eeprom_addr=byte_addr;

  eeprom_data=byte_data;

  eep_int_seq=1;

  TWCR |= 0xa4;                        //启动start信号

}
-----此内容被wogudan于2005-06-02,17:11:40编辑过

出0入0汤圆

发表于 2005-7-1 22:11:50 | 显示全部楼层
好像中断服务程序长了一些

出0入0汤圆

发表于 2005-7-1 22:25:34 | 显示全部楼层
难得一见的TWI中断源码,不错!!!





值得鼓励!!!

出0入0汤圆

发表于 2005-9-14 19:37:24 | 显示全部楼层
我试了一下为什么不能进入中断呀

出0入0汤圆

 楼主| 发表于 2005-9-28 15:43:06 | 显示全部楼层
很久没看看,没想到还有人看啊!这是第一次调的,后来随着产品需要,做了点调整!



用是可以用的,中断服务程序用case判断的啊,每一次只会进一个case的!



fhpxagu不能进中断,我估计是你的设置的问题!

出0入4汤圆

发表于 2005-9-28 18:13:47 | 显示全部楼层
fhpxagu



初始化程序没写吧?

出0入0汤圆

发表于 2005-11-27 19:49:34 | 显示全部楼层
总感觉用IIC做通信效率比较低,中断里面一大串的程序

虽说每次只进去一个CASE,但是看起来有点头晕~~~~~~

出0入0汤圆

发表于 2006-8-18 12:03:54 | 显示全部楼层
都沉底了,顶起来!

出0入0汤圆

发表于 2006-8-18 12:47:15 | 显示全部楼层
IIC还是喜欢用口线模拟,用硬件原理都看的晕死了。

出0入0汤圆

发表于 2006-9-16 10:44:50 | 显示全部楼层
程序没问题,不过觉得麻烦了点,当然楼主还是做得很好的

出0入0汤圆

发表于 2007-5-17 14:03:45 | 显示全部楼层
厉害!

出0入0汤圆

发表于 2007-5-23 20:55:56 | 显示全部楼层
问一下楼主,硬件就只接了SDA和SCL吗

程序中的get_eeprom_data变量是干啥用的

谢谢

出0入0汤圆

发表于 2007-8-7 17:42:12 | 显示全部楼层
拜托,个人比较偷懒,所以有现成的东西不想多考虑,不过这里发的东西能否全一些,有时看程序比写程序还麻烦,以前买书时最讨厌书中的例子,如果全错没问题,就是少打个符号,写错个字母,不得不寻寻觅觅;你这些中断里的变量是在哪定义的?还要猜YES有什么来代替?

为了写一个MEGA64用24C16的程序,想想有现成的,在这找了半天,那么多,就是没一个用得起来。郁闷。

当然起因是我懒,所以不好怨别人,不过给了希望又不能实现也实在是烦啊

出0入0汤圆

发表于 2007-11-23 21:45:43 | 显示全部楼层
楼主,你在中断里做这么多东西是不是不太合适啊?

出0入0汤圆

发表于 2007-12-18 09:33:38 | 显示全部楼层
顶起来,有时间试一下

出0入0汤圆

发表于 2007-12-18 09:48:38 | 显示全部楼层
24C16是的2K地址空间,用一个字节的byte_addr怎么可以去访问2K的字节呢?

出0入0汤圆

发表于 2007-12-19 11:24:21 | 显示全部楼层
http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=873758&bbs_id=9999

能不能帮我看看我的问题?谢谢了

出0入0汤圆

发表于 2009-4-18 20:39:28 | 显示全部楼层
这样做的话,只能寻址0~FF吧,大于FF呢?

出0入0汤圆

发表于 2010-8-13 16:35:41 | 显示全部楼层
感觉还是模拟的IIC好用,那个硬件的IIC操作起来感觉太复杂

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-4-29 13:49

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

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