max7311 I2C-16HS sporadisch kein Acknowledge Kategorie: I²C-Bus (von Klaus - 8.04.2005 21:07) | |
| |
Hallo Leute, ich brauche mal Eure fachliche Hilfe.(eine Herqausforderung für alle I2C Fachmänner/Frauen) Ich habe bei André u.a. das max7311 I2C-RT16HS Modul gekauft und wollte eigentlich auch das die MAX-Porterweiterung nachkaufen. Allerdings habe ich ein Problem bei der Inbetriebnahme. Der MAX7311 antwortet zwischendurch nicht korrekt auf die Befehle, sendet anschinen kein ACK. Speziell, wenn nach zum auslesen eines Registers zunächst die Moduladresse zum Schreiben und anschlie�end das Command-Byte (welches das Register angibt) gesendet wird, bevor dann der Lesevorgang beginnt. Die Besonderheit: in diesem Fall arbeite ich ohne CC2, d.h. ich nutze ein PC Modul zur Ansteuerung. Das funktioniert soweit auch ganz prima, speziell nutze ich es erfolgreich mit einigen PCF8574. Sehr gut bei dem Modul: Es gibt Echos für Erfolg oder Fehler auf dem I2C Bus, d.h. den Fehler kann man sehr gut zuordnen, d.h. feststellen, bei welchem gesendeten Byte auf den Bus etwas nicht hinhaut. Wie sieht das nun aus? : Ich habe mir (orientiert am Datenblatt des MAX7311 und an dem Treiber für die CC2) zunächst einfache Befehle gebaut, die es mir ermöglichen, Register zu setzen und zu lesen. Der Einfacheit halber lese bzw. schreibe ich zunächst immer volle Register high + lwo Byte (Funktionen s.u.). Das Ganze funktioniert auch ganz gut, wenn ich die Funktionen z.B. als Event auf einen Button im der Anwendung aufrufe. Allerdings gibt es Probleme, wenn der Rechner etwas mehr unter Damp steht. Dies ist z.B. der Fall, wenn das Programm in der Entwicklungsumgebung startet, oder zwischendurch mal die Last auf 100% geht. DAS PROBLEM: Näheres Hinschauen hat ergeben, dass das Senden einzelner Bytes keine zu lange Pause verträgt. Setze ich ein Sleep von z.B. 20 ms zwischen den einzelnen zu sendenen Bytes (s.u.), so antwortet der MAX7311 nicht korrekt. Aber das dürfte eigentlich nicht sein, denn der Master gibt ja den Takt vor und da sich die Flanke für den Max ggf. für die beispielhaften 20 ms nicht ändert, so sollte es eigentlich keine Auswirkungen haben. Die Frequenzen sind ja nur bis oben und nicht nach unten begrenzt. Oder gibt es da maximale Pausen, bis das Command-Byte/register empfangen werden muss? Im regulären Betrieb, komme ich in einer Nacht auf ca. 3 fehlerhaft Commandos. Je höher die Last ist, desto mehr Fehler werden gelogged. Mir hat auch einer berichtet, dass er ähnliche Probleme mit dem MAX7300 gehabt hat, die er bisher noch nicht kösen. Auch da kam in besonderen Fällen kein Acknowledge zurück. ES W�RE SUPER; WENN JEMAND EINE ERKL�RUNG ODER EINEN ANSATZ H�TTE. Momentan überlege ich tatsächlich den MAX als Fehlkauf einzustufen und ganz auf PCF umzusteigen. Wenn ich mit dem Ding eine Sirene oder ein Licht ein/ausschalten will, muss ich auch sicher sein, dass es tatsächlich passiert, sonst macht es keinen Sinn. Schönen Dank für alle Feedbacks!!!!! Klaus private bool MAX7311SetReg(byte modul, byte register, byte lowByte, byte highByte) { // Low-Level SEND WRITE ADDRESS WITH START byte[] b1 = {87,MAX7311[modul].Address}; // 'W' xport.Sendi2cCommand(b1); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; // low-Level SEND BYTE byte[] b2 = {66,register}; // 'B' xport.Sendi2cCommand(b2); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; // Low-Level SEND BYTE byte[] b3 = {66,lowByte}; // 'B' xport.Sendi2cCommand(b3); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; // Low-Level SEND BYTE byte[] b4 = {66,highByte}; // 'B' xport.Sendi2cCommand(b4); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; return true; } private bool MAX7311GetReg(byte modul, byte register) { MAX7311_GetReg_Register=register; // Low-Level SEND WRITE ADDRESS WITH START byte[] b1 = {87,MAX7311[modul].Address}; // 'W' xport.Sendi2cCommand(b1); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; !!!!Hier Pasue eine Pause von 20 ms macht Probleme // Low-Level SEND BYTE byte[] b2 = {66,register}; // 'B' xport.Sendi2cCommand(b2); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; // mehrer Bytes mit RXN lesen byte[] b9 = {114,MAX7311[modul].Address,2}; // 'r' xport.Sendi2cCommand(b9); while (xport.returnval==-1) {Application.DoEvents();} if (xport.returnval==256) return false; return true; } | |
Antwort schreiben Antworten: |