SAM работает поллингом, проще некуда:
Код
bool ReadByteI2C(BYTE addr, BYTE* data)
{
//set device adr
AT91C_BASE_TWI->TWI_MMR = (addr << 16)| AT91C_TWI_MREAD;
//start
TWI_START();//macros
//write data
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_RXRDY));
*data = AT91C_BASE_TWI->TWI_RHR;
//stop
TWI_STOP();//macros
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
return true;
}
bool WriteByteI2C(BYTE addr, BYTE data)
{
//set device adr
AT91C_BASE_TWI->TWI_MMR = (addr << 16);
AT91C_BASE_TWI->TWI_THR = data;
//start
TWI_START();//macros
//write data
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXRDY));
//stop
TWI_STOP();//macros
while(!(AT91C_BASE_TWI->TWI_SR & AT91C_TWI_TXCOMP));
return true;
}
bool - потому что предполагается добавить обработку статуса транзакции.
Мега живет на прерывании
привожу только имеющее отношение к делу:
Код
SIGNAL(SIG_2WIRE_SERIAL)
{
//TEST0_ON();
TWCB.sta = TWSR & 0xf8;
switch(TWCB.sta)
{
//SLAVE RECEIVE
case TWS_SLAW_ACK:
//SLAVE device has been addressed by SLAW
{
TWCR = TW_EXE_ACK; //generate ACK
break;
}
case TWS_DATAR_ACK_SLAW:
//SLAVE has been got a byte, ACK will generated
{
//TEST1_ON();
data = TWDR;
TWCR = TW_EXE_ACK; //switch to adressed mode
break;
}
case TWS_STOP:
//stop condition has been detected
{
TWCR = TW_EXE_ACK; //& generate ACK
break;
}
//SLAVE TRANSMIT
case TWS_SLAR_ACK:
//SLAVE device has been addressed by SLAR
{
TWDR = 0x55;
TWCR = TW_EXE_NACK; //generate NACK
break;
}
case TWS_DATAW_ACK:
//SLAVE has been transmit a byte and got ACK
//SLAVE transmit next byte
{
break;
}
case TWS_DATAW_NACK:
//SLAVE has been transmit a byte and got NACK
//end of transmision
{
TWCR = TW_EXE_ACK; //switch to adressed mode
break;
}
}
}//switch
}
//
//
//
//TW commands
#define TW_EXE_STA (1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWSTA) //make start condition
#define TW_EXE_STO (1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWSTO) //make stop condition
#define TW_EXE_ACK (1<<TWINT)|(1<<TWIE)|(1<<TWEN)|(1<<TWEA) //transmit byte and wait ACK
#define TW_EXE_NACK (1<<TWINT)|(1<<TWIE)|(1<<TWEN) //transmit byte and wait NACK
//SLAVE RECEIVER
#define TWS_SLAW_ACK 0x60
#define TWS_ARB_LOST_SLAW 0x68
#define TWS_GEN_CALL 0x70
#define TWS_ARB_LOST_GC 0x78
#define TWS_DATAR_ACK_SLAW 0x80
#define TWS_DATAR_NACK_SLAW 0x88
#define TWS_DATAR_ACK_GC 0x90
#define TWS_DATAR_NACK_GC 0x98
#define TWS_STOP 0xa0
//SLAVE TRANSMITTER
#define TWS_SLAR_ACK 0xa8
#define TWS_ARB_LOST_SLAR 0xb0
#define TWS_DATAW_ACK 0xb8
#define TWS_DATAW_NACK 0xc0
#define TWS_DATA_LAST 0xc8