Ich habe jetzt nochmal etwas rumgedoktort.
Irgendwie ist das seltsam. Also Stop kann man setzen, nach dem Lesen
(wenn man ACK = 0 (NACK) hat, also nichts weiter mehr lesen möchte,
macht der das Stop wirklich selber. Trzd. habe ich es manuell nochmal
reingefügt.
Aber wo das eigentliche Problem liegt (keine Ahnung warum):
Das hintereinander senden, also erst Leseregister vom Slave setzen,
danach auslesen (wie ich das beim Mega sonst auch gemacht habe),
funktioniert hier nicht. Keine Ahnung warum, ob man da noch was
einstellen muss. Kein Plan.
Ich mache es jetzt so, ich setze den Pointer vom TC74 einmal auf das
Ausleseregister am Anfang, danach kann ich dauerhaft auslesen, das
klappt.
Anbei mal mein Code, kann bestimmt jmd. noch gebrauchen/erweitern.
Feedback habe ich nicht drin (Busfehler), brauche ich bei der Anwendung
nicht. Ist nur der Temperatursensor am Bus dran.
1 | #define TW_WRITE 0
|
2 | #define TW_READ 1
|
3 |
|
4 |
|
5 | inline void i2c_init(uint32_t BAUD_RATE)
|
6 | {
|
7 | TWI0.MBAUD = ((F_CPU / BAUD_RATE) / 2);
|
8 | TWI0.MSTATUS = TWI_BUSSTATE_IDLE_gc;
|
9 | TWI0.MCTRLA = (TWI_ENABLE_bm | TWI_TIMEOUT_DISABLED_gc | TWI_QCEN_bm);
|
10 | }
|
11 | inline void i2c_start(uint8_t slaveAddr, uint8_t _readMode)
|
12 | {
|
13 | TWI0.MADDR = (slaveAddr | _readMode);
|
14 | }
|
15 | inline void i2c_stop(void)
|
16 | {
|
17 | TWI0.MCTRLB |= (1<<TWI_ACKACT_bp); // Set acknowledge action to NACK
|
18 | TWI0.MCTRLB |= (TWI_MCMD_gm); //Triggers Master to execute acknowledge action (NACK), succeeded by issuing STOP condition
|
19 | }
|
20 | inline void i2c_send(uint8_t DataByte)
|
21 | {
|
22 | TWI0.MDATA = DataByte;
|
23 | }
|
24 | inline uint8_t i2c_receive(uint8_t ack)
|
25 | {
|
26 | if (ack) TWI0.MCTRLB &= ~(1<<TWI_ACKACT_bp);
|
27 | else TWI0.MCTRLB |= (1<<TWI_ACKACT_bp);
|
28 |
|
29 | return TWI0.MDATA;
|
30 | }
|
31 |
|
32 |
|
33 | //Optional
|
34 | int8_t TC74_readTemp(void)
|
35 | {
|
36 | int8_t temp = 0;
|
37 |
|
38 | i2c_start(0b10010000, TW_READ);
|
39 | temp = (int8_t)i2c_receive(0);
|
40 | i2c_stop();
|
41 |
|
42 | return (temp);
|
43 | }
|
44 |
|
45 | inline void TC74_setReadReg(void)
|
46 | {
|
47 | i2c_start(0b10010000, TW_WRITE);
|
48 | i2c_send(0x00);
|
49 | i2c_stop();
|
50 | }
|