请教: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);} 把128兼容103的选项去掉! 回armandusb:
128兼容103的选项早就去掉! Start()执行后, TWINT就是不置1,Start()执行前,量SDA,SCL均为高电平,属于总线空闲,硬件应该可以发Start(),郁闷!大家帮忙出出注意。 你在外面的上拉电阻接了吗
我应该遇到过你的问题的 回king_0102: 上拉电阻接了,10K的,1K的都试过了 降低总线速度. 我也遇到楼主的问题,同样的程序在16上能通过,在128上就会死在WHILE那里,TWINT就是不置1,不知楼主最终解决没??应该不是速度的问题。请高手指点!! 同样的问题也在M48上 出现,有没有解决办法啊?? 我也 遇到了 同样的问题,有没有人知道如何解决啊!
急 大家可以去AVRFREAK上看看,它是AVR业界公认的最好的AVR论坛。很多问题都能解决。
不过这个AVR128 TWINT不能clear的问题,我找了很多也没找到答案。而且我现在就一快128的片子,想在别的上面试程序都不可能,郁闷。
这个地方调了好久,再不行我简直要放弃了。 楼主那个初始化函数有没有SEI()? 遇到和你相同的问题。
相同的程序 用MEGA16-16AU片子 就死在这里了while (!(TWCR & (1<<TWINT)));
MEGA16L-8AU就没有死.不知道和什么因素有关。程序本身不会出现逻辑上的错误。 遇到和你相同的问题。
相同的程序 用MEGA16-16AU片子 就死在这里了while (!(TWCR & (1<<TWINT)));
MEGA16L-8AU就没有死.不知道和什么因素有关。程序本身不会出现逻辑上的错误。 我今天也出现了这样的问题,结果发现SDA和SCL短路了,郁闷了半天。 同样关注此问题,希望有解决的朋友可以分享一下 偶也遇到同样的问题了 郁闷阿 自己慢慢再琢磨下吧 这个问题有人解决了吗?我也遇到这个问题,用的是mega128+24C512。 哈哈,我也有幸今天遇到这个问题了,M128上调好的,仿真出错全速运行没问题,但换到M32怎么都不行了不行了, 两根线全是低电平。 SCL不要接上拉,内部上拉,外部上拉全部去掉 我也遇到了这样的问题,一个月了,依旧那样 我也遇到此问题了。我用的是mega64 我也是,相同的问题,我用的是M16 + 24C02 今天遇到了,感觉twi就像死了一样,连波形也没有 初始化时把速度调慢点,太快了怕不行 有这个可能性 我也是啊,用MAGE16,TWI也是死在那里不置位。。。。。 如今还没有搞定吗,怎么好像没有看到解答啊!!!!!!!! 等待高手~!!!! 我也是这样,大家都再努力一下,有心得,一定要分享哦! mark 我现在也是这个问题头疼呢,前两个还能,第三个就不置1了,死循环在那里,你现在问题解决了吗?? 不知道这样做会不会解决大家的问题,我的等待函数绝不会陷入死循环,只是相当于用软件延时忽略这个问题了,继续执行。
目前我用两块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);
}
} 有谁解决了这个问题,郁闷啊 怎么会知道I2C的硬件工作正常,而不是软件的问题 我遇到的问题是,wait那里能过,但是checkstate时,没有进入开始状态。
后来把上拉电阻从10k改成5K解决问题
iic工作频率是400K 遇到同样的问题,纠结了好几天还未解决啊,太虐心了,泪崩 本帖最后由 microsoho 于 2012-11-21 18:00 编辑
快绝望了 为毛发送端TWINT可以置位,接收端不能???? 10K接到1K了,还是不行呀!!!!{:dizzy:}晕死了,咋办??? 正要用到M128的TWI看了上面的有点怕怕的。
页:
[1]