Hi,
ich hab mal den Code zusammengeschrumpft und getestet die Fehler bleiben.
Nun soll der Slave einfach nur die Daten einlesen / der Master nur senden.
Code:
#define NACK 0
#define ACK 1
void twi(void)
{
cli();
//Pullups
DDRC &= ~((1<<PC1) | (1<<PC0));
PORTC |= ((1<<PC1) | (1<<PC0));
//TWI Init
TWBR = 10;
TWAR = (15<<1);
TWCR = (1<<TWEN)|(1<<TWEA);
uint8_t i = 0;
while(1)
{
// If TWINT set
if (TWCR & (1<<TWINT))
{
switch (TWSR)
{
// Slave & Read Flag
case 0x60:
i = twi_read(ACK);
dectohex(i);
i = twi_read(NACK);
dectohex(i);
//TWI Stop
TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWEA) | (1<<TWSTO));
break;
}
}
}
}
uint8_t twi_read(uint8_t ack_flag)
{
if (ack_flag)
{
TWCR = ((1<<TWINT) | (1<<TWEN) | (1<<TWEA));
} else {
TWCR = ((1<<TWINT) | (1<<TWEN));
}
while (!(TWCR & (1<<TWINT)));
return TWDR;
}
Code:
$regfile = "m168def.dat"
$crystal = 14745000
$baud = 19200
$lib "i2c_twi.lbx" ' Für Hardware TWI
' Externe Pullups vorhanden
Config Scl = Portc.5
Config Sda = Portc.4
'Funktioniert nur mit Waitms 1
Config Twi = 50000 ' Init TWBR und TWS
'Funktioniert
'Config Twi = 400000 ' Init TWBR und TWS
Twcr = &B00000100 ' nur TWEN setzen
Dim A As Byte
Do
I2cstart 'start condition
A = &B00011110
I2cwbyte A 'slave address
A = &H30
I2cwbyte A 'slave address
A = &H30
I2cwbyte A 'slave address
I2cstop
' Waitms 1
Loop
End
Lesezeichen