Das Funkgerät stört die I2C-Buskommunikation

Ich habe eine Platine mit einem Mikrochip PIC18F97J60 darauf und jedes Mal, wenn ich ein 5-Watt-Funkgerät drücke, das mit 144 MHz neben der Platine sendet, wird der Prozessor zurückgesetzt. Der Prozessor wird zurückgesetzt, wenn er versucht, über den I2C-Bus zu kommunizieren. Der Watchdog-Timer läuft ab und wartet darauf, dass das MSSP-Interrupt-Flag (Master Synchronous Serial Port) gesetzt wird. Dies geschieht am häufigsten, wenn auf das Interrupt-Flag gewartet wird, nachdem der Master (PIC18F97J60) einen Neustart oder ein NACK gesendet hat.

Ich verwende 2-kOhm-Pull-up-Widerstände und betreibe den Bus mit ~ 96 kHz. Auf dem Oszilloskop sieht es so aus, als ob die Interferenz auf dem Bus stark genug ist, um die SCL- und SDA-Leitungen von 5 V auf 2,6 V herunterzuziehen. Was kann getan werden, um die i2c-Bussignale vor Interferenzen zu schützen, damit der Prozessor währenddessen nicht zurückgesetzt wird? Warten auf einen Interrupt vom MSSP-Modul?

Ich habe gerade die Anstiegszeit des Taktsignals gemessen und die Buskapazität auf 486 pF berechnet. Wird das ein Problem sein?

Antworten (2)

Anscheinend bringt die Funkstörung die IIC-Buskommunikation durcheinander, sodass der Slave nicht denkt, dass er angesprochen wird, und es kein ACK gibt. Wie Steven betonte, ist es ein schlechtes Softwaredesign, wenn ein verpasstes ACK den Prozessor zurücksetzt. Dies muss behoben werden, aber Ihre Frage bezieht sich hauptsächlich auf das Problem der Interferenz. Sie hatten Glück, dass die Störung einen weiteren lauernden Fehler in Ihrem Code verschlimmert hat. Beheben Sie das, während es leicht reproduziert werden kann.

2-kΩ-Pullups auf den IIC-Leitungen sind so niedrig wie möglich, sodass dort nichts mehr getan werden kann. Sie sagen nicht, welche Frequenz und Leistungsstufe dieses Radio hat, das neben der Platine steht. Ein gewisses Maß an Nähe und Leistungsabgabe wird zu einem Ausfall führen. Anders ausgedrückt, es gibt nur so viele Volt pro Meter, dass Ihr Board aufnehmen kann, bevor es falsch funktioniert. Das erste, was Sie sich fragen müssen, ist, ob der Grad der Strahlung, die auf das Board trifft, angemessen ist, um sich davor zu schützen. Eine Lösung könnte lauten: "Nun, tun Sie das nicht". Platzieren Sie den Sender quer durch den Raum, schirmen Sie ihn richtig ab, bewegen Sie die Antenne usw.

Wenn Sie die Platine weniger empfindlich für diese HF machen müssen (auch hier wäre es nützlich, die Frequenz und den Leistungspegel zu kennen, mit denen Sie es zu tun haben), dann gibt es wahrscheinlich verschiedene Dinge zu beheben. Höchstwahrscheinlich ist dieses Problem auf ein schlechtes Layout, insbesondere die Erdung, und die Unachtsamkeit gegenüber hochfrequenten Schleifenströmen zurückzuführen. All die gleichen Dinge, die Sie tun, um Emissionen zu reduzieren, wirken symmetrisch, um die Anfälligkeit für empfangene Strahlung zu reduzieren. Anders ausgedrückt sagt uns die Physik, dass alles, was als Sendeantenne funktioniert, auch als Empfangsantenne funktioniert und umgekehrt.

Zeigen Sie also das Layout, insbesondere die Erdungsstrategie, Ihres Boards. Achten Sie auch genau auf alles, was von Bord geht, da es sich um Antennen handelt. Da Sie einen 18F97J60 verwenden, der über einen Ethernet-MAC/PHY verfügt, haben Sie wahrscheinlich ein Ethernet-Kabel, das von der Platine kommt. Welche HF-Reduktion ist auf der Netzseite des Transformators? Hat der Trafo netzseitig einen eingebauten Balun? Beseitigt sich das Problem, wenn Sie das Ethernet-Kabel abziehen?

Kleine Korrektur, 1,8-kOhm-Pullups sind auf dem I2C-Bus üblich (also sind 2 kOhm "ungefähr" so niedrig wie möglich, aber es gibt einen kleinen Betrag, den Sie gehen könnten). Ich glaube, der empfohlene Bereich liegt bei 1,8k - 4,7k, wobei niedrigere Werte schnellere Anstiegsflanken auf dem Bus ergeben ...
@vicatcu - Die 1,8 k Ω ist an der unteren Grenze, denn laut Norm muss ein Gerät nicht mehr als 3 mA ziehen, und die bekommt man mit 1,7 k Ω ; Pullup bei 5 V. Die Obergrenze hängt von der Kapazität des Kabels ab: Eine steigende Flanke sollte nicht länger als 1 sein μ S. Und seien wir mal ehrlich: sind nicht 2 k Ω genau das gleiche wie 1,8 k Ω ? :-)
@vicatcu: Deshalb habe ich "ungefähr" gesagt. Ich wollte nicht auf all diese Details eingehen, weil ich dachte, sie würden vom Wesentlichen ablenken. Für die Zwecke der HF-Aufnahme machen 17% weniger Impedanz keinen großen Unterschied. Auch hier vermute ich, dass das eigentliche Problem ein schlechtes Layout und eine schlechte Erdung ist.
Ich habe versucht, die 5-VDC-Bordstromversorgung mit einem Oszilloskop zu überwachen, und festgestellt, dass die Versorgung manchmal bis zu 6,25 VDC springen kann, wenn ich das Funkgerät genau richtig einstelle. Ist das normal für HF-Störungen?
Wir haben immer noch ein Problem mit dem ausgesteckten Ethernet-Kabel. Ich denke, der Ethernet-Transformator ist in den Impulsbuchsenanschluss eingebaut, den wir J1006F01PNL verwenden.

2 kΩ sollten niedrig genug sein, um nicht viel Rauschen im Signal zu bekommen.

Aber wie es aussieht, liegt dein Problem woanders. Es scheint nicht, dass das Geräusch den Controller zurücksetzt. Solange der Controller ordnungsgemäß funktioniert, sollte er den Watchdog-Timer zurücksetzen, damit er niemals abläuft, um den Controller zurückzusetzen. Wenn die serielle Nachricht nicht richtig empfangen wird, sollte Ihr Protokoll dies beheben. Das Zurücksetzen ist für Notfälle, wenn die Software verrückt spielt oder eine Stromstörung die Hardware blockiert. Es ist schlecht, den Watchdog-Timeout zuzulassen, weil Sie auf eine Bestätigung oder einen Neustart der Übertragung warten.

Wenn ich den Prozessor nicht zurücksetze, wartet er ewig auf das Interrupt-Flag und blockiert. Wenn ich einen separaten Timer verwendet habe, um ein Timeout zu erstellen, habe ich am Ende eine halb abgeschlossene i2c-Transaktion und die Daten sind beschädigt.
Wenn der I2C-Slave nicht bestätigen kann, sollte er diesen Befehl verwerfen. Der Master, der keine Bestätigung sieht, sollte den Befehl erneut senden. Keine beschädigten Daten.
I2C-Slaves können den Bus hängen lassen, wenn Taktimpulse fehlen. Die Wiederherstellungsaktion kann ein Bitschlagen des Taktstifts erfordern, bis der Slave den Bus freigibt. I2C kann eine schlechte Wahl sein, wenn der Bus nicht ausreichend zuverlässig gemacht werden kann.
Ich habe ein Timeout hinzugefügt und den Watchdog-Timer zurückgesetzt, während ich auf den MSSP-Interrupt warte. Der Prozessor wird manchmal immer noch zurückgesetzt, wenn ich das Radio drücke.