Moin Moin,
habt ihr ne Idee, wieso ich vom Slave nichts empfange? Senden klappt..
Ist was an der Lese Routine falsch?
Es handelt sich um einen I2C Touch Controller (QT2120 von ATMEL)..
Habe einen Pin als GPIO konfiguriert und dort ne LED angeschlossen.
Diese kann ich an und aus schalten. Die ID lesen von dem Chip schlägt
jedoch fehl.
1 | uint8_t twi_read(TWI_t *twi, uint8_t slave_addr, uint8_t reg)
|
2 | {
|
3 | uint8_t ret=0;
|
4 |
|
5 | // twi->MASTER.ADDR = (slave_addr<<1);
|
6 | // while(!(twi->MASTER.STATUS&TWI_MASTER_WIF_bm));
|
7 | //
|
8 | // twi->MASTER.ADDR = reg;
|
9 | // while(!(twi->MASTER.STATUS&TWI_MASTER_WIF_bm));
|
10 | //
|
11 | //
|
12 | // twi->MASTER.ADDR = ((slave_addr<<1)|0x01);
|
13 | // while(!(twi->MASTER.STATUS & TWI_MASTER_RIF_bm));
|
14 | //
|
15 | // ret = twi->MASTER.DATA;
|
16 | //
|
17 | // twi->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc;
|
18 |
|
19 |
|
20 | twi->MASTER.ADDR = slave_addr<<1 & ~0x01;
|
21 | while (!(twi->MASTER.STATUS & TWI_MASTER_WIF_bm) || (twi->MASTER.STATUS & TWI_SLAVE_RXACK_bm));
|
22 | twi->MASTER.DATA = reg;
|
23 | while (!(twi->MASTER.STATUS & TWI_MASTER_WIF_bm));
|
24 |
|
25 | twi->MASTER.ADDR = slave_addr | 0x01;
|
26 | while (!(twi->MASTER.STATUS & TWI_MASTER_RIF_bm));
|
27 | ret = twi->MASTER.DATA;
|
28 | TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
|
29 |
|
30 | return ret;
|
31 | }
|