Ansteuerung eines SparkFun AS7265x Triad Sensors
Ich habe Probleme das oben genannte Sensor Board über I2C anzusprechen.
Anscheinend gibt es da 4 Register die man ansprechen kann.
Der Rest ist in sogenannten virtuellen Registern.
Über I2C kann man doch eigentlich nur die Adresse des Bausteins angeben und eines oder mehrere Bytes senden bzw. empfangen.
Wie kann man z.B. das Status Register auslesen? Gibt man die Adresse des Bausteins mit einem Lesebefehl an, kann man die Register doch nicht mehr addressieren.
Das Datenblatt gibt sich da kryptisch.
Im Pseudocode werden da direkt die Registeradressen mit 0x00 bis 0x03 angesprochen.
Die Arduino library hab Ich mir auch angesehen, aber auch daraus werd Ich nicht schlau, zudem werden da auch noch weitere Bibliotheken der ARDUINO Plattform verwendet.
Hat sich da schon mal wer damit beschäftigt?
Liste der Anhänge anzeigen (Anzahl: 1)
Ich denke Ich hab jetzt die Routinen soweit im Griff, das alles funktionieren sollte, allerdings reagiert der Sensor nicht wie erwartet.
Anhang 36015
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?