Hallo jim,
also ich kann keinen Fehler finden. Hier ist mal meine Funktionen:
so funktioniert es:
int16_t temperature;
temperature = read_MLX_RAM(0x00, 0x07);
und so funktioniert es nicht:
int16_t temperature;
temperature = read_MLX_RAM(0x55, 0x07);
/* Function read 16-bit RAM data */
uint16_t read_MLX_RAM(uint8_t slaveADDR, uint8_t ADDR)
{
uint8_t data_4lsb;
uint8_t data_4msb;
uint8_t data_crc;
uint8_t regAddress;
uint8_t rc;
uint16_t data;
regAddress = 0;
rc = twiWrite( slaveADDR, ®Address, 1 );
rc = twiWrite( ADDR|RAM_access, ®Address, 1 );
rc = twiWrite( slaveADDR|0x01, ®Address, 1 );
rc = twiRead( slaveADDR, data_4lsb, 1 );
rc = twiRead( slaveADDR, data_4msb, 1 );
rc = twiRead( slaveADDR, data_crc, 1 );
data |= data_4msb;
data |= data<<8;
data |= data_4lsb;
return data;
}
//**********************************************************************
*******
// twiWrite - Master Transmist
uint8_t twiWrite( uint8_t sla, uint8_t* data, uint8_t count )
{
uint8_t rc;
// send SLA+W
rc = sendSla( sla, TW_WRITE );
if ( rc != 0 ) return rc;
// send data byte(s)
do
{
// send next data byte
TWDR = *data++;
TWCR = _BV( TWINT ) | _BV( TWEN );
// wait for data byte transmitted
WAIT_FOR_TWINT;
// check for timeout and check status code
if ( !TWI_READY ) return 7;
if ( TW_STATUS != TW_MT_DATA_ACK )
{
if ( TW_STATUS == TW_MT_DATA_NACK ) generateStop( );
return 8;
} // end if
} while ( --count != 0 );
// generate STOP
rc = generateStop( );
if ( rc != 0 ) return rc;
return 0;
} // end twiWrite
//**********************************************************************
*******
// twiRead - Master Receive
uint8_t twiRead( uint8_t sla, uint8_t* data, uint8_t count)
{
uint8_t rc;
// send SLA+R
rc = sendSla( sla, TW_READ );
if ( rc != 0 ) return rc;
// read data byte(s)
do
{
// set up to receive next data byte
TWCR = _BV( TWINT ) | _BV( TWEN) | ( ( count != 1 ) ? _BV( TWEA ) :
0 );
// wait for data byte
WAIT_FOR_TWINT;
// check for timeout and check status
if ( !TWI_READY ) return 9;
if ( TW_STATUS !=
( ( count != 1 ) ? TW_MR_DATA_ACK : TW_MR_DATA_NACK ) )
{
generateStop( );
return 10;
} // end if
// read data byte
*(data++) = TWDR;
} while ( --count != 0 );
// generate STOP
rc = generateStop( );
if ( rc != 0 ) return rc;
return 0;
} // end read data