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?