|
求助:ATMEGA8 TWI读写AT24C64不通
不知道怎么回事,TWI怎么都不通。
#define __TWI_C__
#include "config.h"
#define TWI_START() TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define TWI_RESTART() TWCR =(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)
#define TWI_STATUS() (TWSR&0xf8)
#define TWI_LOADDATA(x) TWDR=(x),TWCR=(1<<TWINT)|(1<<TWEN)
#define TWI_STOP() TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
#define TWI_WAIT() while((TWCR&(1<<TWINT))==0)
void twi_init(void) //72K bps
{
TWCR= 0X00; //disable twi
TWBR= 0x20; //set bit rate
TWSR= _BV(TWPS1)|_BV(TWPS0);
TWCR= _BV(TWEN); //enable twi
}
#define TWI_ReStart() TWI_Start()
uint8 TWI_Start(void)
{
TWI_START();
TWI_WAIT();
return TWI_STATUS();
}
void TWI_Stop()
{
TWI_STOP();
TWI_WAIT();
}
uint8 TWI_SendData(uint8 data)
{
TWI_LOADDATA(data);
TWI_WAIT();
return TWI_STATUS();
}
uint8 TWI_ReceiveData(uint8 *pdata,uint8 ack)
{
uint8 temp=_BV(TWINT)|_BV(TWEN);
if(ack)
{
temp|=_BV(TWEA);
}
TWCR=temp;
TWI_WAIT();
pdata[0]=TWDR;
return TWI_STATUS();
}
#ifdef TWI_SLAW
uint8 TWI_WriteByte(uint16 addr ,uint8 data)
#else
uint8 TWI_WriteByte(uint8 TWI_SLAW, uint16 addr ,uint8 data)
#endif
{
if(TWI_Start()!=TW_START) return 1;
if(TWI_SendData(TWI_SLAW)!=TW_MT_SLA_ACK) return 2;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 3;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 4;
if(TWI_SendData(data)!=TW_MT_DATA_ACK) return 5;
TWI_Stop();
return 6;
}
#ifdef TWI_SLAR
uint8 TWI_ReadeByte(uint16 addr, uint8 *pdata)
#else
unsigned char TWI_ReadeByte(uint8 TWI_SLAR, uint16 addr, uint8 *pdata)
#endif
{
if(TWI_Start()!=TW_START) return 0;
if(TWI_SendData(TWI_SLAR&0xfe)!=TW_MT_SLA_ACK) return 1;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 2;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 3;
if(TWI_ReStart()!=TW_REP_START)return 4;
if(TWI_SendData(TWI_SLAR)!=TW_MT_SLA_ACK) return 5;
if(TWI_ReceiveData(&pdata[0],0)!=TW_MT_DATA_ACK) return 6;
TWI_Stop();
return 7;
}
在TWI_WAIT()里死了 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|