Nabend Jungens,
stehe irgendwie vor geschlossenen Türen.
| 1 | uint8_t twi_read(TWI_t *twi, uint8_t reg, uint8_t slaveAddr)
 | 
| 2 | {
 | 
| 3 |   uint8_t ret = 0;
 | 
| 4 |   
 | 
| 5 |   twi->MASTER.ADDR = slaveAddr + TWI_WRITE;
 | 
| 6 |   while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
 | 
| 7 |  
 | 
| 8 |   twi->MASTER.DATA = reg;
 | 
| 9 |   while( ! ( twi->MASTER.STATUS & TWI_MASTER_WIF_bm ) );
 | 
| 10 |  
 | 
| 11 |   twi->MASTER.ADDR = slaveAddr + TWI_READ;
 | 
| 12 |   while( ! ( twi->MASTER.STATUS & TWI_MASTER_RIF_bm ) );
 | 
| 13 |   
 | 
| 14 |   ret = twi->MASTER.DATA;
 | 
| 15 |  
 | 
| 16 |   twi->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
 | 
| 17 | 
 | 
| 18 |   return ret;
 | 
| 19 | }
 | 
Versuche gerade mit dem oben genannten xMega mit einem I2C Slave zu 
kommunizieren.
Meine Init. sieht so aus..
| 1 | #ifndef F_CPU
 | 
| 2 | #define F_CPU                    2e6
 | 
| 3 | #endif
 | 
| 4 | 
 | 
| 5 | #define TWI_READ                  0x01
 | 
| 6 | #define TWI_WRITE                  0x00
 | 
| 7 | 
 | 
| 8 | #define F_TWI                    4e5
 | 
| 9 | #define TWI_BAUD( FREQUENCY_CPU , FREQUENCY_TWI )  (uint8_t)((FREQUENCY_CPU / (2 * FREQUENCY_TWI)) - 5)
 | 
| 10 | #define TWI_BAUDSETTING                TWI_BAUD( F_CPU , F_TWI )
 | 
| 11 | 
 | 
| 12 | void twi_init(TWI_t * twiname)
 | 
| 13 | {      
 | 
| 14 |   twiname->MASTER.CTRLB  |= TWI_MASTER_SMEN_bm;
 | 
| 15 |   twiname->MASTER.BAUD  |= TWI_BAUDSETTING;
 | 
| 16 |   twiname->MASTER.CTRLA  |= TWI_MASTER_ENABLE_bm;
 | 
| 17 |   twiname->MASTER.STATUS  |= TWI_MASTER_BUSSTATE_IDLE_gc;
 | 
| 18 | }
 | 
PullUps sind vorhanden und gehen an die richtigen Pins.
Die Belegung ist auch korrekt.
Übrigens der Slave ist ein "HMC58831"
| 1 | #define HMC58831_ADDR  ( 0x1E << 1 )
 | 
| 2 | #define HMC58831_READ  ( ( HMC58831_ADDR << 1 ) | 0x01 )
 | 
| 3 | #define HMC58831_WRITE  ( HMC58831_ADDR << 1 )
 | 
Jemand auf anhieb eine Idee?