打印
[AVR单片机]

AVR mega128 TWI(I2c)

[复制链接]
1925|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
franker0523|  楼主 | 2013-9-28 13:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最后的结果应该是PORTA=0x03;但是LED 灯没反应。  
我在start()与wait()
start();
  PORTA=0X01;
   wait();
   PORTA=0X02;下检测了一下。发现最后LED灯显示结果是PORTA=0x01;下面是程序,求解答,弄了半天多了!外部晶振7.3728.


#include<avr/io.h>

#define uint unsigned int
#define uchar unsigned char

#define START 0X08   //start已成功发送
#define RESTART 0X10 //restart已成功发送
#define MT_SLA_ACK 0X18 //加载数据已发送ack
#define MT_SLA_NACK 0X20 //加载数据已发送nack
#define MT_DAT_ACK 0X28  //数据已发送ack
#define MT_DAT_NACK 0X30 //数据已发送nack
#define SL_SLA_ACK 0X40 //从机数据已加载发送ack
#define SL_SLA_NACK 0X48 //从机数据已加载发送nack
#define SL_DAT_ACK 0X50  //从机数据已发送ack
#define SL_DAT_NACK 0X58  //从机数据已发送nack

#define start() TWCR=_BV(TWINT)|_BV(TWSTA)|_BV(TWEN) //发送开始信号
#define restart() TWCR=_BV(TWINT)|_BV(TWEN)|_BV(TWSTA) //发送重新开始信号
#define wait()  while(!(TWCR&(_BV(TWINT)))) //等待信号
#define state() (TWSR&0XF8) //寄存器TWSR状态提取
#define stop() TWCR=_BV(TWEN)|_BV(TWINT)|_BV(TWSTO) //停止信号

#define writebyte(temp) {TWDR=(temp);TWCR=_BV(TWINT)|_BV(TWEN);} //写数据

#define r_direction 0xa1 //读的器件地址
#define w_direction 0xa0 //写的器件地址

void twi_init()  //twi的初始化
{
   TWCR=_BV(TWEN); //启动twi功能
   TWBR=0X20;  //设置波特率为主机模式
   TWSR=0;    //清空状态寄存器
}

uchar write_data(uchar dat,uchar addr) //向iic写数据
{
   start();
   PORTA=0X01;
   wait();
   PORTA=0X02;
   if(state()!=START)
   return 1;

   writebyte(w_direction);
   wait();
   if(state()!=MT_SLA_ACK)
   return 1;

   writebyte(addr);
   wait();
   if(state()!=MT_DAT_ACK)
   return 1;

   writebyte(dat);
   wait();
   if(state()!=MT_DAT_ACK)
   return 1;

   stop();
   return 0;
}

uchar read_data(uchar addr) //从iic中读取数据
{
   uchar temp;
   start();
   wait();
   if(state()!=START)
   return 1;

   writebyte(w_direction);
   wait();
   if(state()!=MT_SLA_ACK)
   return 1;

   writebyte(addr);
   wait();
   if(state()!=MT_DAT_ACK)
   return 1;

   restart();
   wait();
   if(state()!=RESTART)
   return 1;

   writebyte(r_direction);
   wait();
   if(state()!=SL_SLA_ACK)
   return 1;
  
   
   TWCR=_BV(TWINT)|_BV(TWEN);
   wait();
   if(state()!=SL_DAT_NACK)
   return 1;

   temp=TWDR;
   stop();
   return temp;

}

int main(void)
{
   uint i;
   DDRA=0XFF;
   twi_init();
   write_data(0X03,0x00);
   for(i=0;i<10000;i++)//延时很重要,保证数据能够写入到iic中
    asm("nop");
   PORTA=read_data(0x00);
   while(1);
}

相关帖子

沙发
airwill| | 2013-9-28 16:57 | 只看该作者
我看楼主学习一下调试技巧吧

使用特权

评论回复
板凳
dqyubsh1| | 2013-9-28 20:06 | 只看该作者
去ATMEL官网找IIC的例子,或者去找AVRLIB这类的代码库,别摸着黑写了。

使用特权

评论回复
地板
qin552011373| | 2013-10-4 08:43 | 只看该作者
楼主才半天多就急了   仔细调试一下吧   估计程序也不是你自己的

使用特权

评论回复
5
y3030434| | 2013-10-4 10:09 | 只看该作者
我也遇到了 同样的问题, 估计是 wait 函数出了问题,TWINT 不置位

使用特权

评论回复
6
lengmian1001| | 2013-10-7 17:41 | 只看该作者
我也遇到了同样的问题,百度文库的东西不靠谱

使用特权

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

本版积分规则

1

主题

1

帖子

0

粉丝