打印
[AVR单片机]

[AVR单片机] TWI 读写24C02一直失败

[复制链接]
1616|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 lingzijue 于 2013-6-24 21:35 编辑

大家帮忙看一下什么问题   仿真没有问题 但是实物不行  整的老郁闷了  高手给找找原因
#include <iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int

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

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

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


#define  jia()  ((PIND&0X01)==0X00)

#define  jian()  ((PIND&0X02)==0X00)

#define  xie()  ((PIND&0X04)==0X00)

#define  du()  ((PIND&0X08)==0X00)




__flash uchar   Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};  //段码控制

//此表为8个数码管位选控制, 共阴数码管 1-8个  -
__flash uchar    dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};  

uchar table[]={0,0,0,0};

uint b=0;

void delay(uint n)//延时1毫秒
{
uint i,j;
for(i=0;i<n;i++)
         for(j=0;j<1141;j++);
}
//显示函数
void display()
{
uint i,s;
s=b;
table[0]=s/1000;
table[1]=s%1000/100;
table[2]=s%100%100/10;
table[3]=s%1000%100%10;

for(i=0;i<4;i++)
{
PORTA=Disp_Tab[table];
PORTB=dispbit;
delay(5);
PORTA=0x00;
}
}

uchar write_data(uchar dat,uchar addr) //向iic写数据
{
   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;

   writebyte(dat);
   wait();
   if(state()!=MT_DAT_ACK)
   return 1;
    delay(10);
   stop();
   return 0;
}

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

   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=BIT(TWINT)|BIT(TWEN);
   wait();
   if(state()!=SL_DAT_NACK)
   return 1;

   temp=TWDR;
   delay(10);
   stop();
   return temp;

}


//端口初始化
void smg_init(void)
{
DDRC=0Xff;
PORTC=0Xff;

DDRA=0Xff;
PORTA=0Xff;

DDRB=0Xff;
PORTB=0Xff;


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

void main(void)
{
smg_init();
twi_init();
while(1)
{
key();
display();
}
}

void key()
{
uchar i;
if(jia())
{
b++;
}
if(jian())
{
b--;
}
if(xie())
{
write_data(b,0x05);
}
if(du())
{
b=read_data(0x05);
}
}

QQ截图20130623164112.png (21.3 KB )

QQ截图20130623164112.png

相关帖子

沙发
qin552011373| | 2013-6-24 22:41 | 只看该作者
如果仿真已经通过了  多半是延时的问题了

使用特权

评论回复
板凳
gdxizhilang| | 2013-6-26 16:50 | 只看该作者
qin552011373 发表于 2013-6-24 22:41
如果仿真已经通过了  多半是延时的问题了

有可能,延时会解决IIC通讯的很多问题。

使用特权

评论回复
地板
lingzijue|  楼主 | 2013-6-26 22:06 | 只看该作者
gdxizhilang 发表于 2013-6-26 16:50
有可能,延时会解决IIC通讯的很多问题。

具体应该怎么修改啊 ,详细的说明一下吧

使用特权

评论回复
5
airwill| | 2013-6-28 14:18 | 只看该作者
仿真没有问题 但是实物不行, 试试增加上电延时

使用特权

评论回复
6
gdxizhilang| | 2013-6-29 07:58 | 只看该作者
:)

使用特权

评论回复
7
qin552011373| | 2013-6-29 23:17 | 只看该作者
lingzijue 发表于 2013-6-26 22:06
具体应该怎么修改啊 ,详细的说明一下吧

具体参照iic手册设置延时

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
gaoyang9992006 + 10
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝