微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ATMEGA16通过TWI对24C02进行读写

ATMEGA16通过TWI对24C02进行读写

时间:11-23 来源:互联网 点击:

单片机》289页
return TWI_ERR;
if(TWI_Write_RADDR((Maddr&0xfe)|TWI_READ)==TWI_ERR) //参看《深入浅出AVR单片机》289页
return TWI_ERR;
if(TWI_ReciveDATA_NACK(pdata)==TWI_ERR) //读取数据时,最后1字节的数据读取完成以后发送NAK而不是ACK
return TWI_ERR;
TWI_Stop();
return TWI_CRR;
}

uchar TWI_R_Data(uint Maddr,uchar Saddr,uchar *pdata,uchar num)
{
uchar i;
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_WADDR((Maddr&0xfe)|TWI_WRITE)==TWI_ERR)
return TWI_ERR;
if(TWI_SendData(Saddr)==TWI_ERR)
return TWI_ERR;
if(TWIREStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_RADDR((Maddr&0xfe)|TWI_READ)==TWI_ERR)
return TWI_ERR;
for(i=0;i {
if(TWI_ReciveDATA_ACK(pdata+i)==TWI_ERR)
return TWI_ERR;
}
if(TWI_ReciveDATA_NACK(pdata+i)==TWI_ERR) //读取数据时,最后1字节的数据读取完成以后发送NAK而不是ACK,这点很重要
return TWI_ERR;
TWI_Stop();
return TWI_CRR;
}

uchar TWI_W_NAddr(uchar addr,uchar data)
{
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_WADDR(addr)==TWI_ERR)
return TWI_ERR;
if(TWI_SendData(data)==TWI_ERR)
return TWI_ERR;
TWI_Stop();
return TWI_CRR;
}

uchar TWI_R_NAddr(uchar addr,uchar *pdata)
{
if(TWIStart()==TWI_ERR)
return TWI_ERR;
if(TWI_Write_RADDR(addr)==TWI_ERR)
return TWI_ERR;
if(TWI_ReciveDATA_NACK(pdata)==TWI_ERR)
return TWI_ERR;
TWI_Stop();
return TWI_CRR;
}
#endif

#include
#include "IIC.h"
void port_init(void)
{
DDRB=0XFF;
PORTB=0XFF;
TWCR=0X44;
DDRD=0XFF;
PORTD=0XFF;
}

uchar temp1[8]={18,17,16,15,14,13,12,11};
uchar temp2[8]={0};
uchar temp3[8]={0,0,0,0,0,0,0,0};
void main(void)
{
TWI_Init();
port_init();
if(TWI_W_Data(0Xa0,0x00,temp1,8)==TWI_ERR)
PORTD&=~(BIT(PD0));
delay(5); //这里的延时很重要,如果不加,读出来的数据很是匪夷所思
if((TWI_R_Data(0Xa1,0x00,temp2,8))==TWI_ERR)
PORTD&=~BIT(PD7);
if(temp2[1]==17)
PORTB=0X00;
while(1)
{
if(temp2[0]==18)
{
PORTB=0XFE;
delay(100);
PORTB=0XFF;
delay(50);
}
if(temp2[1]==17)
{
PORTB=0XFD;
delay(100);
PORTB=0XFF;
delay(50);
}
if(temp2[2]==16)
{
PORTB=0XFB;
delay(100);
PORTB=0XFF;
delay(50);
}

if(temp2[3]==15)
{
PORTB=0XF7;
delay(100);
PORTB=0XFF;
delay(50);
}

if(temp2[4]==14)
{
PORTB=0XEF;
delay(100);
PORTB=0XFF;
delay(50);
}

if(temp2[5]==13)
{
PORTB=0XDF;
delay(100);
PORTB=0XFF;
delay(50);
}

if(temp2[6]==12)
{
PORTB=0XBF;
delay(100);
PORTB=0XFF;
delay(50);
}

if(temp2[7]==11)
{
PORTB=0X7F;
delay(100);
PORTB=0XFF;
delay(50);
}
}
}

仿真PROTUES7.5图如下



示波器查看波形如图


IIC接收数据查看如图

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

网站地图

Top