请看到此贴的 仁兄们 帮忙看一下程序 小弟再此 谢过。 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);
}
} |