最后的结果应该是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);
} |