Ich denke Ich hab jetzt die Routinen soweit im Griff, das alles funktionieren sollte, allerdings reagiert der Sensor nicht wie erwartet.
Im ersten Step wurde Adresse 0x92 ( Schreiben ) ausgewählt und die Adresse des Hardware Status Registers 0x00 angesprochen.
Beides wurde vom AS7265 mit ACK quittiert.
Der Master sendete dann Stop mit anschließenden Start.
Nun wurde die Adresse 0x93 ( Lesen ) ausgewählt der Slave quittiert und das Byte wurde ausgelesen.
Dieses enthielt aber leider den Wert 0x80, der aber nirgends dokumentiert ist.
Der Wert 0x01, 0x02 oder 0x03 wurde erwartet.
Der Master sendete NACK weil ja kein weiteres Byte mehr erwartet wurde.
Das Ganze hab Ich mit dem Debugger gemacht.
Lässt man den Controller frei Laufen hängt sich irgendwann die Bus Arbritation auf.
Manchmal vom Master Manchmal vom Slave und eine der Leitungen wird nach GND gezogen.
Code:
//Write to virtual Register
void i2m_AS72xx_topwrite(uint8_t virtualReg, uint8_t d)
{
uint8_t status;
TWI_timeout=TWI_timeout_time;
while (1)
{
//Read slave I²C status to see if the write buffer is ready.
TWI_Buffer[0]=I2C_AS72XX_SLAVE_STATUS_REG;
FEHLER = twi0_send(AS7265_adr,TWI_Buffer,0x01);
FEHLER = twi0_receive(AS7265_adr,TWI_Buffer,0x01);
status = TWI_Buffer[0];
if ((status & I2C_AS72XX_SLAVE_TX_VALID) == 0)
// No inbound TX pending at slave. Okay to write now.
break ;
if(TWI_timeout==0)
{
break;
FEHLER=20;
}
_delay_ms(AS7265X_POLLING_DELAY);
}
//Send Data to virtual Register
TWI_Buffer[0]=(virtualReg | 0x80);
//Send 1 Bytes
FEHLER = twi0_send(AS7265_adr,TWI_Buffer,0x01);
TWI_timeout=TWI_timeout_time;
while (1)
{
//Read slave I²C status to see if the write buffer is ready.
TWI_Buffer[0]=I2C_AS72XX_SLAVE_STATUS_REG;//****** Die Sequenz wurde hier gestoppt ******
FEHLER = twi0_send(AS7265_adr,TWI_Buffer,0x01);
FEHLER = twi0_receive(AS7265_adr,TWI_Buffer,0x01);
status = TWI_Buffer[0];
if ((status & I2C_AS72XX_SLAVE_TX_VALID) == 0)
// No inbound TX pending at slave. Okay to write now.
break ;
if(TWI_timeout==0)
{
break;
FEHLER=21;
}
_delay_ms(AS7265X_POLLING_DELAY);
}
//Send data
TWI_Buffer[0]=I2C_AS72XX_SLAVE_WRITE_REG;
TWI_Buffer[1]=d;
FEHLER=twi0_send(AS7265_adr,TWI_Buffer,0x2);
}
Hat da von Euch jemand eine Idee was da falsch läuft?
Lesezeichen