Hallo,
Ich hatte schon einmal Probleme mit dem I2C, damals habe ich es dann aber zum laufen gekriegt.
Jetzt habe ich aber ein neues Board gebaut, hier sind die Bedingungen etwas verändert:
Als master habe ich einen Mega32 (getestet mit 2/10 Mhz), dieser hat diesen Code:
Die LED leuchtet dann, aber geht nicht aus, also bleibt der Controller irgendwo in der Schleife hängen.Code:#include <avr/io.h> #include <util/delay.h> #include <inttypes.h> #include "i2cmaster.h" #include "uart.h" #include <avr/interrupt.h> #include <util/twi.h> #include <stdlib.h> #define BAUD 2400 #define SLAVE_ADRESSE 0x50 void uart_puti(int val ) { char buffer[8]; uart_puts( itoa(val, buffer, 10) ); } uint8_t b1 = 0; uint8_t b2 = 0; int main() { DDRC |= (1<<PC6); uart_init((UART_BAUD_SELECT((BAUD),F_CPU))); i2c_init(); sei(); uart_puts("Test des I2C am Board:\n"); while(1) { i2c_start_wait(SLAVE_ADRESSE+I2C_WRITE); i2c_write(0x01); i2c_rep_start(SLAVE_ADRESSE+I2C_READ); b1 = i2c_readAck(); uart_puti(b1); _delay_ms(200); b2 = i2c_readNak(); uart_puts(b2); i2c_stop(); _delay_ms(500); PORTC ^=(1<<PC6);
Als Slave habe ich einen Mega8, natürlich auch Pullups, 4,7k. Taktfrequenz: getestet mit 4Mhz bzw. 16 Mhz.
Der Slave läuft mit folgendem Code: (Die Libs sind vom RN-Wissen, bzw von Peter Fleury)
Wenn ein paar includes zu viel sind, ich lass die immer da, wenn ich die Controller für andere Sachen getestet habe.Code:#include "twislave.h" #include <util/twi.h> #include <avr/interrupt.h> #include <stdint.h> #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> #define SLAVE_ADRESSE 0x50 int main() { init_twi_slave(SLAVE_ADRESSE); i2cdata[0] = 5; i2cdata[1] = 2; while(1) { i2cdata[0]++; i2cdata[1]++; _delay_ms(500); } }
Aber nun zum Hauptproblem:
Wenn ich die Leitungen mit dem Oszilloskop nachmesse, dann ist SDA stets auf High, keine Signale etc.
SCL ist (unerklärlicherweise) stets auf low, ebenfalls keine anderen Signale.
Hat hierzu jemand eine Idee?
MfG avrrobot







Zitieren

Lesezeichen