Ein Beispiel, wie die Master-Funktionen aussehen:
Code:
#include <avr/io.h>
#include "i2cmaster.h"
#include "twi_register.h"
/***************************************
sendet einen befehl plus parameter
zum m8-slave
****************************************/
void twi_send( unsigned char befehl, unsigned char parameter )
{
i2c_start_wait(TWI_ADR+I2C_WRITE); // verbindung aufbauen
i2c_write( befehl ); // befehl für den slave
i2c_write( parameter ); // parameter des befehls
i2c_stop(); // verbindung beenden
}
/**********************************************
liest ein port-pinregister vom m8-slave
***********************************************/
unsigned int twi_get( unsigned char befehl )
{
unsigned char c;
i2c_start_wait(TWI_ADR+I2C_WRITE); // verbindung aufbauen
i2c_write( befehl ); // befehl für den slave
i2c_write( 0 ); // befehl benötigt keinen parameter
i2c_rep_start(TWI_ADR+I2C_READ); // wiederhole start + read
c = i2c_readNak(); // read byte
i2c_stop(); // verbindung beenden
return(c);
}
/**********************************************
liest einen adc-kanal (2Byte) vom m8-slave
***********************************************/
unsigned int twi_get_adc( unsigned char befehl )
{
unsigned int i,j;
i2c_start_wait(TWI_ADR+I2C_WRITE); // verbindung aufbauen
i2c_write( befehl ); // befehl für den slave
i2c_write( 0 ); // befehl benötigt keinen parameter
i2c_rep_start(TWI_ADR+I2C_READ); // wiederhole start + read
i = (unsigned int)i2c_readAck(); // lower byte
j = (unsigned int)i2c_readNak(); // upper byte
i2c_stop(); // verbindung beenden
i += (j <<= 8);
return(i);
}
Für den Master benutze ich die Software i2cmaster.s von Peter Fleury's Homepage (man muss ja nicht immer das Rad neu erfinden).
http://jump.to/fleury
Peter (Ronny10)
Lesezeichen