打印
[AVR单片机]

AVR I2C 求教!

[复制链接]
2306|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dafuwong1985|  楼主 | 2011-1-10 12:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
I2c, AVR, se, BLE, ST
atmega88,内部晶振7.3-8.1M.
DDRC  = 0x3F;   //SDA,SCL 设置为输出,取消内部上拉电阻。
PORTC = 0x00; //
void twi_init(void)
{
TWCR= 0X00; //disable twi
TWBR= 0x10; //set bit rate     
TWSR= 0x00; //set 0 prescale           // about  200K  bit
//TWAR= 0xA2; //set slave address      // mast do not need this
TWCR= 0x44; //enable twi   ;have ack when it is necessary; (1<<TWEA)|(1<<TWEN)
}
INT8U tw_start(void)
{
  TWCR |=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);       // send the signal of start
  while (!(TWCR & (1<<TWINT)));               // wait for the ack
  if((TWSR & 0xF8)!=TW_START)                //check  0x08
    { PORTB &=~(1<<PB7);return error;}//ERROR();}
      return ok;//
}//////
在tw_start中收到 TWSR & 0xF8=0x26,实际应为0x08;观察数据线为一脉冲波。上拉电阻已经加上了,请教下是什么原因?刚开始接触AVR,谢谢各位高手!

相关帖子

沙发
928315| | 2011-1-10 17:38 | 只看该作者
网上有代码,我调试过,没有问题的,你用google搜索下

使用特权

评论回复
板凳
airwill| | 2011-1-10 19:14 | 只看该作者
TWCR |=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);       // send the signal of start
这里好象没有问题, TWSR & 0xF8=0x26 是什么意思? 前面的等式怎么都不可能 为0x26 呀
观察数据线为一脉冲波。应该是数据线和时钟线上都有脉冲, 时序关系参见 I2C 协议.
如果 CLK 线上没有发现脉冲, 得检测一下了, 有没有发生上拉不良或对地短路?

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
dafuwong1985 + 1
地板
dafuwong1985|  楼主 | 2011-1-14 13:31 | 只看该作者
刚从外地回来。谢谢两位

使用特权

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

本版积分规则

0

主题

35

帖子

1

粉丝