打印
[AVR单片机]

基于 AVR ATMEGA 16TWI 功能读取 AT24c02

[复制链接]
1245|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
a2900755|  楼主 | 2015-5-3 11:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请看到此贴的 仁兄们 帮忙看一下程序 小弟再此 谢过。 AVR ATMEGA 16TWI 功能读取 AT24c02 ,小弟刚开始用AVR TWI功能。在读取AT24c02的时候 用PROTEUS 可以做到仿真,无任何问题,但是在PCB板上,不能正确的通信,读取的8位都是1. 外部晶振是4M的     请大哥们看一下程序,能给我一份程序最好不过,谢谢了。在线等候。


#include<iom16v.h>
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x30

#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
unsigned  int a,b;
void delay(unsigned int time)
{
for(a=0;a<10;a++)
for(b=0;b<time;b++);
}
void start(void)
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTA);
}
void stop(void)
{
TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
void wait(void)
{
while(!(TWCR&(1<<TWINT)));
}
void write(unsigned char date)
{
TWDR=date;
TWCR=(1<<TWINT)|(1<<TWEN);
}
void re_set(void)
{
TWCR=(1<<TWINT)|(1<<TWEN);
}
unsigned char write_IIC(unsigned char adress,unsigned char date)
{
start();
wait();
if((TWSR&0xf8)!=START)
return 0x01;



write(0xa0);
wait();
if((TWSR&0xf8)!=MT_SLA_ACK)
return 0x02;

write(adress);
wait();
if((TWSR&0xf8)!=MT_DATA_ACK)
return 0x04;

write(date);
wait();
if((TWSR&0xf8)!=MT_DATA_ACK)
return 0x08;
stop();
stop();
return 0x55;
}

unsigned char read_IIC(unsigned char adress)
{unsigned char temp;
start();
wait();
if((TWSR&0xf8)!=START)///////此处 用PROTEUS 返回的是 START,但在PCB板上返回的是RE_START
return 0x01;

write(0xa0);
wait();
if((TWSR&0xf8)!=MT_SLA_ACK)
return 0x02;

write(adress);
wait();
if((TWSR&0xf8)!=MT_DATA_ACK)
return 0x04;

start();
wait();
if((TWSR&0xf8)!=RE_START)
return 0x08;


write(0xa1);
wait();

;

if((TWSR&0xf8)!=MR_SLA_ACK)
return 0x10;

TWCR=(1<<TWINT)|(1<<TWEN);

wait();

if((TWSR&0xf8)!=MR_DATA_NOACK)
return 0x20;



temp=TWDR;


stop();
return temp;


}
void main(void)
{DDRD=0xff;
DDRC=0xff;
DDRA=0x0f;
PORTB=0xff;
TWBR=0x70;
TWCR=0x04;
TWSR=0x00;
TWAR=0;
DDRB=0xff;PORTD=0Xff;
PORTB=write_IIC(0x05,0x0F);
PORTD=read_IIC(0x05);
while(1)
{
delay(1000);

delay(1000);


}

}

PRITEUS仿真.zip

145.3 KB

程序仿真

相关帖子

沙发
JY-DX-JY| | 2015-5-3 21:04 | 只看该作者
对照手册看时序。

使用特权

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

本版积分规则

1

主题

2

帖子

1

粉丝