cyk8 发表于 2005-10-7 10:25:47

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

按照硬件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_ACK0x28

#define MT_DATA_NOACK 0x30

#define MR_SLA_ACK0x40

#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);}

armandusb 发表于 2005-10-7 10:43:50

把128兼容103的选项去掉!

cyk8 发表于 2005-10-7 11:36:07

回armandusb:

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

cyk8 发表于 2005-10-8 19:18:18

Start()执行后, TWINT就是不置1,Start()执行前,量SDA,SCL均为高电平,属于总线空闲,硬件应该可以发Start(),郁闷!大家帮忙出出注意。

king_0102 发表于 2005-10-8 19:41:50

你在外面的上拉电阻接了吗

我应该遇到过你的问题的

cyk8 发表于 2005-10-9 17:12:09

回king_0102: 上拉电阻接了,10K的,1K的都试过了

cckcck 发表于 2006-4-6 21:53:36

降低总线速度.

chenguangda 发表于 2007-1-28 20:57:05

我也遇到楼主的问题,同样的程序在16上能通过,在128上就会死在WHILE那里,TWINT就是不置1,不知楼主最终解决没??应该不是速度的问题。请高手指点!!

caravtech 发表于 2007-3-28 14:29:32

同样的问题也在M48上 出现,有没有解决办法啊??

overgift 发表于 2007-4-10 19:07:00

我也 遇到了 同样的问题,有没有人知道如何解决啊!

overgift 发表于 2007-4-10 23:25:24

大家可以去AVRFREAK上看看,它是AVR业界公认的最好的AVR论坛。很多问题都能解决。



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



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

trouble83 发表于 2007-4-24 09:43:16

楼主那个初始化函数有没有SEI()?

logers 发表于 2008-5-26 12:18:12

遇到和你相同的问题。

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

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

logers 发表于 2008-5-26 12:18:12

遇到和你相同的问题。

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

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

shawn_17 发表于 2008-5-27 17:08:51

我今天也出现了这样的问题,结果发现SDA和SCL短路了,郁闷了半天。

star0928 发表于 2008-6-11 22:12:07

同样关注此问题,希望有解决的朋友可以分享一下

wp007 发表于 2008-7-23 10:37:08

偶也遇到同样的问题了 郁闷阿 自己慢慢再琢磨下吧

zhangdi0005 发表于 2009-1-16 16:46:50

这个问题有人解决了吗?我也遇到这个问题,用的是mega128+24C512。

pamaoer 发表于 2009-4-9 16:59:22

哈哈,我也有幸今天遇到这个问题了,M128上调好的,仿真出错全速运行没问题,但换到M32怎么都不行了不行了, 两根线全是低电平。

tomhe666 发表于 2009-4-9 17:31:30

SCL不要接上拉,内部上拉,外部上拉全部去掉

dengfei 发表于 2009-5-19 10:58:48

我也遇到了这样的问题,一个月了,依旧那样

studyandstudy 发表于 2009-5-19 11:36:24

我也遇到此问题了。我用的是mega64

rensheng 发表于 2009-5-23 15:04:16

我也是,相同的问题,我用的是M16 + 24C02

jishanlaike 发表于 2009-6-13 16:00:38

今天遇到了,感觉twi就像死了一样,连波形也没有

AAVVRR 发表于 2009-6-13 18:06:45

初始化时把速度调慢点,太快了怕不行

hpdell 发表于 2010-8-4 16:56:18

有这个可能性

deity0750 发表于 2010-8-10 09:24:07

我也是啊,用MAGE16,TWI也是死在那里不置位。。。。。

hpdell 发表于 2010-8-11 16:42:46

如今还没有搞定吗,怎么好像没有看到解答啊!!!!!!!!

dgtg 发表于 2011-4-20 12:54:28

等待高手~!!!!

shadan1663 发表于 2011-5-20 16:35:28

我也是这样,大家都再努力一下,有心得,一定要分享哦!

InfiLee 发表于 2011-9-2 16:52:37

mark

aishiqi1992 发表于 2011-10-15 22:42:56

我现在也是这个问题头疼呢,前两个还能,第三个就不置1了,死循环在那里,你现在问题解决了吗??

key-earth 发表于 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);
        }
}

laoguren 发表于 2012-10-26 17:06:49

有谁解决了这个问题,郁闷啊

laoguren 发表于 2012-10-26 17:07:42

怎么会知道I2C的硬件工作正常,而不是软件的问题

jimmy_xt 发表于 2012-10-26 17:19:02

我遇到的问题是,wait那里能过,但是checkstate时,没有进入开始状态。
后来把上拉电阻从10k改成5K解决问题

iic工作频率是400K

microsoho 发表于 2012-11-21 10:23:53

遇到同样的问题,纠结了好几天还未解决啊,太虐心了,泪崩

microsoho 发表于 2012-11-21 17:22:47

本帖最后由 microsoho 于 2012-11-21 18:00 编辑

快绝望了

microsoho 发表于 2012-11-22 21:57:45

为毛发送端TWINT可以置位,接收端不能????

angel_gph 发表于 2012-11-28 14:32:47

10K接到1K了,还是不行呀!!!!{:dizzy:}晕死了,咋办???

richwen 发表于 2012-12-17 10:10:57

正要用到M128的TWI看了上面的有点怕怕的。
页: [1]
查看完整版本: 请教:MEGA128的i2C的TWINT就是不会自动置1