avrrobot
19.01.2012, 18:30
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:
#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);
Die LED leuchtet dann, aber geht nicht aus, also bleibt der Controller irgendwo in der Schleife hängen.
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)
#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);
}
}
Wenn ein paar includes zu viel sind, ich lass die immer da, wenn ich die Controller für andere Sachen getestet habe.;)
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
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:
#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);
Die LED leuchtet dann, aber geht nicht aus, also bleibt der Controller irgendwo in der Schleife hängen.
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)
#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);
}
}
Wenn ein paar includes zu viel sind, ich lass die immer da, wenn ich die Controller für andere Sachen getestet habe.;)
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