Hallo Ich habe einen I2C Code geschrieben, der auf einem Atmega644PA läuft. Ich wollte jetzt diesen auf den Atmega2560 transferieren. Jedoch funktioniert dieser code dort überhaupt nicht mehr. Ich dachte die Register bleiben gleich oder stehe ich da falsch im Bild. Oder sieht jemand den fehler im Code.
1 | #include <avr/io.h> |
2 | |
3 | #include "i2c.h" |
4 | //Initialisierung
|
5 | void i2c_init(void) |
6 | {
|
7 | TWBR = 8; |
8 | TWCR = 0x84; |
9 | TWSR = 0x00; |
10 | }
|
11 | //I2C Starten, Adresse angeben
|
12 | void i2c_start(uint8_t address, uint8_t read) //schreiben 0 lesen 1 |
13 | {
|
14 | // TWI START
|
15 | TWCR = 0xA4; |
16 | |
17 | // TWI SEND: address first brick
|
18 | while(!(TWCR & 0x80)); |
19 | TWDR = address | read; |
20 | TWCR = 0x84; |
21 | }
|
22 | //I2C stopen
|
23 | void i2c_stop(void) |
24 | {
|
25 | // TWI STOP
|
26 | while(!(TWCR & 0x80)); |
27 | TWCR = 0x94; |
28 | }
|
29 | //I2C schreiben, Daten angeben
|
30 | void i2c_write(uint8_t data) |
31 | {
|
32 | // TWI SEND: data
|
33 | while(!(TWCR & 0x80)); |
34 | TWDR = data; |
35 | TWCR = 0x84; |
36 | }
|
37 | //I2C lesen, Register angeben und ACK oder NACK
|
38 | uint8_t i2c_read(uint8_t sendACK) |
39 | {
|
40 | // TWI READ: send zero
|
41 | while(!(TWCR & 0x80)); |
42 | TWDR = 0xFF; |
43 | TWCR = 0x84 | (sendACK ? 0x40 : 0x00); |
44 | while(!(TWCR & 0x80)); |
45 | return TWDR; |
46 | }
|