Hallo
also ich habe jetzt den code von Peter Fleury angewendet "I2C Master Interface" und mit einerm oszilloskop an PC1 geptüft ob daten gesendet werden.
Das klappt auch, aber ich kann leider keine daten an PD6 (INT/SQW) empfangen/messen.
ich versuche mal den code hier zu posten.
Vielleicht sieht ja einer von euch den Fehler, ich finde ihn leider nicht.
* TWI_Test.c
#define F_CPU 20000000UL
/* I2C clock in Hz */
#define SCL_CLOCK 100000L
#include <avr/io.h>
#include <util/twi.h>
/************************************************** ***********************
Initialization of the I2C bus interface. Need to be called only once
************************************************** ***********************/
void i2c_init(void)
{
/* initialize TWI clock: 100 kHz clock, TWPS = 0 => prescaler = 1 */
TWSR = 0; /* no prescaler */
TWBR = ((F_CPU/SCL_CLOCK)-16)/2; /* must be > 10 for stable operation */
}/* i2c_init */
/************************************************** ***********************
Issues a start condition and sends address and transfer direction.
return 0 = device accessible, 1= failed to access device
************************************************** ***********************/
unsigned char i2c_start(unsigned char address)
{
uint8_t twst;
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) return 1;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed and ACK/NACK has been received
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_MT_SLA_ACK) && (twst != TW_MR_SLA_ACK) ) return 1;
return 0;
}/* i2c_start */
/************************************************** ***********************
Issues a start condition and sends address and transfer direction.
If device is busy, use ack polling to wait until device is ready
Input: address and transfer direction of I2C device
************************************************** ***********************/
void i2c_start_wait(unsigned char address)
{
uint8_t twst;
while ( 1 )
{
// send START condition
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst != TW_START) && (twst != TW_REP_START)) continue;
// send device address
TWDR = address;
TWCR = (1<<TWINT) | (1<<TWEN);
// wail until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits.
twst = TW_STATUS & 0xF8;
if ( (twst == TW_MT_SLA_NACK )||(twst ==TW_MR_DATA_NACK) )
{
/* device busy, send stop condition to terminate write operation */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));
continue;
}
//if( twst != TW_MT_SLA_ACK) return 1;
break;
}
}/* i2c_start_wait */
/************************************************** ***********************
Terminates the data transfer and releases the I2C bus
************************************************** ***********************/
void i2c_stop(void)
{
/* send stop condition */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
// wait until stop condition is executed and bus released
while(TWCR & (1<<TWSTO));
}/* i2c_stop */
/************************************************** ***********************
Send one byte to I2C device
Input: byte to be transfered
Return: 0 write successful
1 write failed
************************************************** ***********************/
unsigned char i2c_write( unsigned char data )
{
uint8_t twst;
// send data to the previously addressed device
TWDR = data;
TWCR = (1<<TWINT) | (1<<TWEN);
// wait until transmission completed
while(!(TWCR & (1<<TWINT)));
// check value of TWI Status Register. Mask prescaler bits
twst = TW_STATUS & 0xF8;
if( twst != TW_MT_DATA_ACK) return 1;
return 0;
}/* i2c_write */
int main(void)
{ DDRC = (1<<PC0)|(1<<PC1);
PORTC = (1<<PC0)|(1<<PC1);
DDRD= (1<<PD6);
PORTD=(1<<PD6);
i2c_init();
// write 0x75 to EEPROM address 5 (Byte Write)
//i2c_start_wait(0xAA); // set device address and write mode
i2c_start(0x6;
i2c_write(0x0E); // write address = 5
i2c_write(0b00000000); // write value 0x75 to EEPROM
i2c_stop();
i2c_start(0x6;
i2c_write(0x0F); // write address = 5
i2c_write(0b00000100); // write value 0x75 to EEPROM
i2c_stop();
//TODO:: Please write your application code
while(1)
{
}
}
Lesezeichen