Hallo
versuche den Attiny 841 über den I2C Bus anzusprechen. Als Master verwende ich den ATmega 1284p. Das Progamm auf dem Master funktioniert ohne Probleme. Kann vom Master aus den Slave ansprechen und bekomme ein ACK zurück. Damit wird der Master erkannt und quittiert. Leider versteh ich die Eingabe nicht korrekt.
Das Programm:
CodeBox C
Vielleicht kann mir jemand dabei helfen es zu verstehen.
achim
versuche den Attiny 841 über den I2C Bus anzusprechen. Als Master verwende ich den ATmega 1284p. Das Progamm auf dem Master funktioniert ohne Probleme. Kann vom Master aus den Slave ansprechen und bekomme ein ACK zurück. Damit wird der Master erkannt und quittiert. Leider versteh ich die Eingabe nicht korrekt.
Das Programm:
CodeBox C
void I2C_init(void) { TWSA = I2C_SLAVE_ADDRESS; // TWI Adressregister TWSD = 0xFF; // Datenregister TWSCRA = (1<<TWEN)|(1<<TWSHE)|(1<<TWASIE)|(1<<TWSIE)|(1<<TWDIE); // Register A, TWEN-Schnittstelle Aktivieren, TWSHE-Haltezeit aktivieren, TWASIE-Adressenunterbrechung aktivieren, // TWSIE-Stop Unterbrechung aktivieren, TWDIE-Datenunterbrechung aktivieren TWSCRB = (1<<TWAA)|(1<<TWCMD1)|(0<<TWCMD0); // Register B, TWI Bestätigungsaktion, TWI Befehl sei(); // Interrups einschalten } ISR( TWI_SLAVE_vect ) { uint8_t status = TWSSRA & 0xC0; // Register A if (status & I2C_DATA_INTERRUPT) // Daten wurden vom Master empfangen oder werden angefordert { if (TWSSRA & (1 << TWDIR)) // Master fordert Daten vom Slave an { if(tx_buf_index >= sizeof(tx_buf)) { tx_buf_index=0; } TWSD = tx_buf[tx_buf_index]; tx_buf_index++; TWSCRB = (uint8_t) ((1<<TWCMD1)|(1<<TWCMD0)); } else // Master sendet Daten zum Slave { TWSCRB |= (uint8_t) ((1<<TWCMD1)|(1<<TWCMD0)); command = TWSD; } } else if (status & I2C_ADDRESS_STOP_MATCH) { if (TWSSRA & I2C_BUS_COLLISION) { TWSCRB = (uint8_t) (1<<TWCMD1); } else { if (TWSSRA & (1<<TWAS)) { // ACK TWSCRB = (uint8_t) ((1<<TWCMD1)|(1<<TWCMD0)); } else { // Stop Condition TWSCRB = (uint8_t) (1<<TWCMD1); } } } } int main(void) { //ADC_init(); I2C_init(); //Timer0_init; while(1) { if(command != 0x00) { switch(command) { case 0x01: // Test Daten tx_buf[0] = 0x01; tx_buf[1] = 0x02; tx_buf[2] = 0x03; tx_buf[3] = 0x04; tx_buf_index = 0; break; } command = 0x00; }
Vielleicht kann mir jemand dabei helfen es zu verstehen.
achim