Hallo zusammen,
ich bin noch relativ neu in der Arduino Szene. Aktuell versuche ich mich im Rahmen des Studiums daran, einen MGC3130 Mikrocontroller von Microchip auszulesen. Dieser wertet Daten von fünf kapazitiven Sensorelektroden aus. Ich möchte gerne die gespeicherten Positionsdaten über I2C auslesen. Microchip stellt dafür eine Dokumentation bereit. Leider habe ich bisher nichts mit derartigen Aufgaben zu tun gehabt.
Mit meinen Kenntnissen und einigen Beispielen aus dem Netz habe ich ein Skript erstellt, welches sporadisch funktioniert. Soll heißen: Es zeigt gibt mir für eine gewisse Zeit die Daten aus, die ich haben möchte, irgendwann hängt es sich jedoch auf und bei erneutem hochladen bekomme ich nur noch Nullen heraus. Wann es wieder funktioniert ist vollkommen unvorhersehbar. Ich denke daher, dass ich irgendetwas im Kommunikationsprotokoll übersehe oder falsch gemacht habe.
Zusätzlich zu SDA und SCL verwendet der Controller außerdem eine TS und ein RST Signal. Ich hänge einmal mein Skript und die wichtigsten Informationen von Microchip an.
Wäre super, falls jemand den Fehler erkennt. Und seid bitte nicht zu hart
#include <Wire.h>
int ts = 9; // TS Line
int rst = 8; // Reset Line
uint8_t i2addr = 0x42; // Adresse MGC3130
unsigned char i2cdat[132]; // Daten Setup
unsigned char i2cdat_temp[132]; // Daten Loop
int valid; // noch ungenutzt
void setup() {
Serial.begin(9600);
delay(1000);
Wire.begin();
pinMode(ts, INPUT);
pinMode(rst, OUTPUT);
digitalWrite(rst, LOW);
delay(50);
pinMode(rst, INPUT);
Wire.beginTransmission(i2addr);
Wire.write(byte(0x0C));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x06));
Wire.write(byte(0x83));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.write(byte(0x00));
Wire.endTransmission();
delay(200);
// ursprünglich Test, Firmware Daten ausgeben am Anfang
Wire.requestFrom((uint8_t) i2addr, (uint8_t) 26);
while(Wire.available()){
for (uint8_t i = 0; i < 26; i++){
i2cdat[i] = Wire.read();
}
for (uint8_t i=0; i < 26; i++){
Serial.print((i2cdat[i]), HEX);
Serial.print(" ,");
}
}
}
void loop(){
// Daten empfangen:
if (digitalRead(ts) == 0){
pinMode(ts, OUTPUT);
digitalWrite(ts, LOW);
Wire.requestFrom((uint8_t) i2addr, (uint8_t) 132);
for (uint8_t i=0; i<0x84; i++)
{
i2cdat[i] = Wire.read();
}
digitalWrite(ts, HIGH);
pinMode(ts, INPUT);
valid = 1;
delay(6);
} else {
valid = 0;
}
// Positionsdaten berechnen (unfertig)
i2cdat_temp[0] = (i2cdat[21]<<4)+i2cdat[20];
i2cdat_temp[1] = (i2cdat[23]<<4)+i2cdat[22];
i2cdat_temp[2] = (i2cdat[25]<<4)+i2cdat[24];
Serial.print(i2cdat[0],HEX);
Serial.print(" ,");
Serial.print(i2cdat[1],HEX);
Serial.print(" ,");
Serial.print(i2cdat[2],HEX);
Serial.print(" ,");
Serial.print(i2cdat[3],HEX);
Serial.println();
// Positionsdaten ausgeben (unfertig)
for (uint8_t i=0; i<3; i++)
{
Serial.print(i2cdat_temp[i]);
Serial.print(" ,");
}
}
Habe auch einen leicht geänderten Loop getestet, aber da tritt das gleiche Problem auf:
void loop(){
// Daten auslesen:
Wire.requestFrom((uint8_t) i2addr, (uint8_t)132);
if(digitalRead(ts) == 0){
pinMode(ts, OUTPUT);
digitalWrite(ts, LOW);
while(Wire.available()){
for (uint8_t i=0; i<0x84; i++){
i2cdat[i] = Wire.read();
}
}
digitalWrite(ts, HIGH);
pinMode(ts, INPUT);
valid = 1;
delay(6);
} else {
valid = 0;
}
Offizielle Infos:
Hier das Schema aus meinem Setup:
Seltsamer weise ändert sich quasi gar nichts, wenn ich andere Write- Befehle nutze..
Es sollte wie folgt ablaufen, wenn ich das richtig verstehe:
Nähere Informationen bzw. das vollständige Datenblatt gibt es hier oder im Anhang:
Außerdem nutze ich das Hillstar Entwicklungskit, welches zunächst über den PC kalibriert wurde.
PS: Ich nutze einen Arduino UNO
40001718E.pdf (831 KB)