搜索
bottom↓
回复: 40

请教:MEGA128的i2C的TWINT就是不会自动置1

[复制链接]

出0入0汤圆

发表于 2005-10-7 10:25:47 | 显示全部楼层 |阅读模式
按照硬件i2C的时序,将TWSTA 置1即发起始信号(START),马上TWINT就会自动置1,但实际TWINT就是不会自.动置1,硬件软件都检查过,没问题,不知道错在什么地方.

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

               I2C总线写一个字节

                            返回0:写成功

                                返回非0:写失败

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

unsigned char i2c_Write(unsigned char Wdata,unsigned char RomAddress)

{

          Start();//I2C启动

          Wait(); //在这里执行不下去

          if(TestAck()!=START) return 1;//ACK

          Write8Bit(wr_device_add);//写I2C从器件地址和写方式

          Wait();

          if(TestAck()!=MT_SLA_ACK) return 1;//ACK

          Write8Bit(RomAddress);//写24C02的ROM地址

          Wait();

          if(TestAck()!=MT_DATA_ACK) return 1;//ACK

          Write8Bit(Wdata);//写数据到24C02的ROM

          Wait();

          if(TestAck()!=MT_DATA_ACK) return 1;//ACK       

          Stop();//I2C停止

          delay_ms(10);//延时等EEPROM写完

          return 0;

}

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

               I2C总线读一个字节

                           如果读失败也返回0

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

unsigned char i2c_Read(unsigned char RomAddress)

      {

           unsigned char temp;

           Start();//I2C启动

           Wait();   //在这里执行不下去

           if (TestAck()!=START) return 0;//ACK          

           Write8Bit(wr_device_add);//写I2C从器件地址和写方式

           Wait();

           if (TestAck()!=MT_SLA_ACK) return 0;//ACK

           Write8Bit(RomAddress);//写24C02的ROM地址

           Wait();

           if (TestAck()!=MT_DATA_ACK) return 0;

           Start();//I2C重新启动

           Wait();

           if (TestAck()!=RE_START)  return 0;

           Write8Bit(rd_device_add);//写I2C从器件地址和读方式

           Wait();

           if(TestAck()!=MR_SLA_ACK)  return 0;//ACK

           Twi();//启动主I2C读方式

           Wait();

           if(TestAck()!=MR_DATA_NOACK) return 0;//ACK       

           temp=TWDR;//读取I2C接收数据

       Stop();//I2C停止

           return temp;

      }





//TWI状态定义

//MT 主方式传输  MR 主方式接收

#define START 0x08

#define RE_START 0x10

#define MT_SLA_ACK 0x18

#define MT_SLA_NOACK 0x20

#define MT_DATA_ACK  0x28

#define MT_DATA_NOACK 0x30

#define MR_SLA_ACK  0x40

#define MR_SLA_NOACK 0x48

#define MR_DATA_ACK 0x50

#define MR_DATA_NOACK 0x58

//常用TWI操作(主模式写和主模式读)

#define Start()              (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))

#define Stop()               (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))

#define Wait()                     {while(!(TWCR&(1<<TWINT)));}

#define TestAck()           (TWSR&0xf8)

#define SetAck()          (TWCR|=(1<<TWEA))

#define SetNoAck()    (TWCR&=~(1<<TWEA))

#define Twi()                    (TWCR=(1<<TWINT)|(1<<TWEN))

#define Write8Bit(x)  {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2005-10-7 10:43:50 | 显示全部楼层
把128兼容103的选项去掉!

出0入0汤圆

 楼主| 发表于 2005-10-7 11:36:07 | 显示全部楼层
回armandusb:

128兼容103的选项早就去掉!

出0入0汤圆

 楼主| 发表于 2005-10-8 19:18:18 | 显示全部楼层
Start()执行后, TWINT就是不置1,Start()执行前,量SDA,SCL均为高电平,属于总线空闲,硬件应该可以发Start(),郁闷!大家帮忙出出注意。

出0入0汤圆

发表于 2005-10-8 19:41:50 | 显示全部楼层
你在外面的上拉电阻接了吗

我应该遇到过你的问题的

出0入0汤圆

 楼主| 发表于 2005-10-9 17:12:09 | 显示全部楼层
回king_0102: 上拉电阻接了,10K的,1K的都试过了

出0入0汤圆

发表于 2006-4-6 21:53:36 | 显示全部楼层
降低总线速度.

出0入0汤圆

发表于 2007-1-28 20:57:05 | 显示全部楼层
我也遇到楼主的问题,同样的程序在16上能通过,在128上就会死在WHILE那里,TWINT就是不置1,不知楼主最终解决没??应该不是速度的问题。请高手指点!!

出0入0汤圆

发表于 2007-3-28 14:29:32 | 显示全部楼层
同样的问题也在M48上 出现,有没有解决办法啊??

出0入0汤圆

发表于 2007-4-10 19:07:00 | 显示全部楼层
我也 遇到了 同样的问题,有没有人知道如何解决啊!

出0入0汤圆

发表于 2007-4-10 23:25:24 | 显示全部楼层
大家可以去AVRFREAK上看看,它是AVR业界公认的最好的AVR论坛。很多问题都能解决。



不过这个AVR128 TWINT不能clear的问题,我找了很多也没找到答案。而且我现在就一快128的片子,想在别的上面试程序都不可能,郁闷。



这个地方调了好久,再不行我简直要放弃了。

出0入0汤圆

发表于 2007-4-24 09:43:16 | 显示全部楼层
楼主那个初始化函数有没有SEI()?

出0入0汤圆

发表于 2008-5-26 12:18:12 | 显示全部楼层
遇到和你相同的问题。

相同的程序 用MEGA16-16AU片子 就死在这里了while (!(TWCR & (1<<TWINT)));

MEGA16L-8AU就没有死.不知道和什么因素有关。程序本身不会出现逻辑上的错误。

出0入0汤圆

发表于 2008-5-26 12:18:12 | 显示全部楼层
遇到和你相同的问题。

相同的程序 用MEGA16-16AU片子 就死在这里了while (!(TWCR & (1<<TWINT)));

MEGA16L-8AU就没有死.不知道和什么因素有关。程序本身不会出现逻辑上的错误。

出0入0汤圆

发表于 2008-5-27 17:08:51 | 显示全部楼层
我今天也出现了这样的问题,结果发现SDA和SCL短路了,郁闷了半天。

出0入0汤圆

发表于 2008-6-11 22:12:07 | 显示全部楼层
同样关注此问题,希望有解决的朋友可以分享一下

出0入0汤圆

发表于 2008-7-23 10:37:08 | 显示全部楼层
偶也遇到同样的问题了 郁闷阿 自己慢慢再琢磨下吧

出0入0汤圆

发表于 2009-1-16 16:46:50 | 显示全部楼层
这个问题有人解决了吗?我也遇到这个问题,用的是mega128+24C512。

出0入0汤圆

发表于 2009-4-9 16:59:22 | 显示全部楼层
哈哈,我也有幸今天遇到这个问题了,M128上调好的,仿真出错全速运行没问题,但换到M32怎么都不行了不行了, 两根线全是低电平。

出0入0汤圆

发表于 2009-4-9 17:31:30 | 显示全部楼层
SCL不要接上拉,内部上拉,外部上拉全部去掉

出0入0汤圆

发表于 2009-5-19 10:58:48 | 显示全部楼层
我也遇到了这样的问题,一个月了,依旧那样

出0入0汤圆

发表于 2009-5-19 11:36:24 | 显示全部楼层
我也遇到此问题了。我用的是mega64

出0入0汤圆

发表于 2009-5-23 15:04:16 | 显示全部楼层
我也是,相同的问题,我用的是M16 + 24C02

出0入0汤圆

发表于 2009-6-13 16:00:38 | 显示全部楼层
今天遇到了,感觉twi就像死了一样,连波形也没有

出0入0汤圆

发表于 2009-6-13 18:06:45 | 显示全部楼层
初始化时把速度调慢点,太快了怕不行

出0入0汤圆

发表于 2010-8-4 16:56:18 | 显示全部楼层
有这个可能性

出0入0汤圆

发表于 2010-8-10 09:24:07 | 显示全部楼层
我也是啊,用MAGE16,TWI也是死在那里不置位。。。。。

出0入0汤圆

发表于 2010-8-11 16:42:46 | 显示全部楼层
如今还没有搞定吗,怎么好像没有看到解答啊!!!!!!!!

出10入0汤圆

发表于 2011-4-20 12:54:28 | 显示全部楼层
等待高手~!!!!

出0入0汤圆

发表于 2011-5-20 16:35:28 | 显示全部楼层
我也是这样,大家都再努力一下,有心得,一定要分享哦!

出0入0汤圆

发表于 2011-9-2 16:52:37 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-15 22:42:56 | 显示全部楼层
我现在也是这个问题头疼呢,前两个还能,第三个就不置1了,死循环在那里,你现在问题解决了吗??

出0入0汤圆

发表于 2011-10-27 12:47:42 | 显示全部楼层
不知道这样做会不会解决大家的问题,我的等待函数绝不会陷入死循环,只是相当于用软件延时忽略这个问题了,继续执行。
目前我用两块m16a通信还没遇到过这个问题。
另外,总线错误处理是很重要的,需要做STOP设置,改变内部硬件,不影响总线,才能将总线错误状态恢复回来。否则有可能在总线错误发生后,没处理却继续发送start(),就可能造成TWINT位不能自动置位。

//查询模式下等待中断状态发生
unsigned char Twi_WaitForOk( void )
{
        unsigned int cnt = 0;
        while( !Twi_IntStatus() && (cnt < 65000))
        {
                cnt++;
        }
        if( cnt < 65000 )
        {
                return cnt;
        }
        return 0;
       
}


/***********************************************/
// 总线错误恢复函数
/***********************************************/
void I2C_ResetBus( void )
{
        if( Twi_IntStatus() && (Twi_Status() == TW_BUS_ERROR))
        {
                TWCR = (TWCR & TWCR_CMD_MASK) | (1<<TWINT) | (1<<TWSTO) | (1<<TWEA);
        }
}

出0入0汤圆

发表于 2012-10-26 17:06:49 | 显示全部楼层
有谁解决了这个问题,郁闷啊

出0入0汤圆

发表于 2012-10-26 17:07:42 | 显示全部楼层
怎么会知道I2C的硬件工作正常,而不是软件的问题

出0入42汤圆

发表于 2012-10-26 17:19:02 | 显示全部楼层
我遇到的问题是,wait那里能过,但是checkstate时,没有进入开始状态。
后来把上拉电阻从10k改成5K解决问题

iic工作频率是400K

出0入0汤圆

发表于 2012-11-21 10:23:53 | 显示全部楼层
遇到同样的问题,纠结了好几天还未解决啊,太虐心了,泪崩

出0入0汤圆

发表于 2012-11-21 17:22:47 | 显示全部楼层
本帖最后由 microsoho 于 2012-11-21 18:00 编辑

快绝望了

出0入0汤圆

发表于 2012-11-22 21:57:45 | 显示全部楼层
为毛发送端TWINT可以置位,接收端不能????

出0入0汤圆

发表于 2012-11-28 14:32:47 | 显示全部楼层
10K接到1K了,还是不行呀!!!!晕死了,咋办???

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-24 05:13

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

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