微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于AVR ATMEGA 16 TWI读取AT24c02 问题

关于AVR ATMEGA 16 TWI读取AT24c02 问题

时间:10-02 整理:3721RD 点击:
最近在做ATMEGA16 TWI功能读取AT24C02的 程序,再读取的时候一直读取的8位 都是1,哪位大哥 可以帮着看看程序,问题出现在哪,小弟非常感谢。#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 1;
write(0xa0);
wait();
if((TWSR&0xf8)!=MT_SLA_NOACK)
return 1;
write(adress);
wait();
if((TWSR&0xf8)!=MT_DATA_NOACK)
return 1;
write(date);
wait();
if((TWSR&0xf8)!=MT_DATA_NOACK)
return 1;
stop();
return 0;
}
unsigned char read_IIC(unsigned char adress)
{unsigned char temp;
start();
wait();
if((TWSR&0xf8)!=START)
return 1;
write(0xa0);
wait();
if((TWSR&0xf8)!=MT_SLA_NOACK)
return 1;
write(adress);
wait();
if((TWSR&0xf8)!=MT_DATA_NOACK)
return 1;
start();
wait();
if((TWSR&0xf8)!=RE_START)
return 1;
write(0xa1);
wait();
if((TWSR&0xf8)!=MR_SLA_NOACK)
return 1;
TWCR=(1<<TWINT)|(1<<TWEN);
wait();
if((TWSR&0xf8)!=MR_DATA_ACK)
return 1;
PORTD=TWDR;
stop();
return temp;

}
void main(void)
{DDRD=0xff;
DDRC=0xff;
DDRA=0x0f;
PORTB=0xff;
TWBR=0x20;
TWCR=0x04;
TWSR=0;
DDRB=0xff;PORTD=0Xff;
PORTB=write_IIC(0x03,0x03);
while(1)
{
delay(1000);
PORTA=read_IIC(0x03);
delay(1000);

}
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top