打印
[AVR单片机]

求助ATmega128A的TWI总线操作

[复制链接]
3609|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
roalychen|  楼主 | 2012-11-24 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 roalychen 于 2012-11-24 11:30 编辑

就是I2C,AVR叫TWI接口
以下代码:
void TWI_Init(void)
{
TWCR= 0x00; //disable twi
TWBR= 0xff; // (1<<6) | (1<<5) | (1<<2); //set bit rate
TWSR= 0x00; //set prescale
TWAR= 0x00; //set slave address
TWCR= (1<<TWEN); //enable twi
}

unsigned char I2C_Start(void)     
{
unsigned char retval;
(TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)); // start
{I2C_Timer = 20; while(!(TWCR&(1<<TWINT)) && I2C_Timer);}   //  I2CWaitAck(); I2C_Timer在定时器里自减
retval = (TWSR&0xf8);  // I2CChkAck();

if(retval  !=I2C_START)
{
  (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)); // I2CStop();
  return I2C_ERR;
}

return I2C_CRR;
}

问题是,执行这个函数后,进入了UART1的接收中断服务函数(中断向量31),UART1的中断标志位确实置位了,但实际上没有往UART1发送任何数据
请高手帮忙看看是怎么回事
这段程序确实可以与从设备通信,但怎么就触发了UART1的接收中断了呢?
UART1的在不操作I2C的时候也是可以正常工作的

相关帖子

沙发
dqyubsh| | 2012-11-24 22:48 | 只看该作者
建议你去ATMEL下载I2C的例子,主机和从机的都有,直接拿来用吧,这个自己写还是很麻烦的,也很难保证不出问题。

或者你看看AVRLIB的例子,也是能用的。

使用特权

评论回复
板凳
roalychen|  楼主 | 2012-11-26 08:28 | 只看该作者
我校对过Datasheet的操作流程,出问题的地方是在发送STAR信号后,状态码判断出错时的出错处理,我直接发送一个停止信号,这时就触发了UART1的接收中断了,但是Datasheet上面没有说到出错应该如何处理啊

2楼能不能提供个地址下载例程,谢谢

使用特权

评论回复
地板
dqyubsh| | 2012-11-26 08:41 | 只看该作者
5
dqyubsh| | 2012-11-26 08:43 | 只看该作者
AVR311/AVR312/AVR315

使用特权

评论回复
6
roalychen|  楼主 | 2012-11-26 09:01 | 只看该作者
谢谢,下载了,学习中
还有问题再请教了

使用特权

评论回复
7
roalychen|  楼主 | 2012-12-5 14:16 | 只看该作者
谢谢啊,是RXD1和TWI的SDA引脚短路了
不好意思

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

227

帖子

0

粉丝