Binaire rommel op de UART bij het voeden van de RPi

Ik heb een vreemde kwestie die ik niet kan achterhalen. Ik heb een thermische printer ( https://www.adafruit.com/products/597 ) aangesloten op de UART (/ dev/ttyAMAO).

Ik heb de RPi geconfigureerd om de console op /dev/ttyAMA0 te verwijderen met het volgende:

echo "dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait" > /boot/cmdline.txt
systemctl disable [email protected]

Mijn project loopt goed, met uitzondering van een klein ding.

Onmiddellijk nadat de RPi is ingeschakeld, drukt de printer soms 5 willekeurige tekens af, alsof er iets naar de UART is verzonden.

Here is what it looks like (each line is a new powering of the RPi) binary_garbage

Enig idee waar het vandaan komt?

Extra informatie: - de RPi is een model B - het draait Raspbian Jessie Lite

4
U moet waarschijnlijk een uittrekweerstand toevoegen aan de RX/TX-kabels. Omdat deze pins zweven tijdens de bootloader (de eerste en de tweede, voordat de kernel wordt geladen) veroorzaken deze zwevende waarden rommel op de UART. Als je de printer kunt programmeren .. gebruik dan een CRC zoals. - de printer controleert de CRC en of deze juist is. het zal afdrukken. Dit voorkomt pull-downs, maar ook robuuster. Alle moderne printers gebruiken dit soort besturingselementen om ervoor te zorgen dat de gegevens geldig zijn.
toegevoegd de auteur ppumkin, de bron
Probeer een kaart te configureren om op te hangen in verschillende fasen van de opstart en te zien bij welke de tekens worden gegenereerd.
toegevoegd de auteur Chris Stratton, de bron

2 antwoord

De UART van de Pi heeft een fout (in de firmware). Wanneer de poort wordt geopend, is er een lage glitch van 30 μs op TXD.

Zie http://elinux.org/RPi_Serial_Connection#Unwanted_serial_garbage_input en zoek naar glitches.

U moet een tijdelijke oplossing vinden omdat de fout niet wordt verholpen.

8
toegevoegd
Ik heb de Adafruit-specificaties op de printer gecontroleerd en helaas heeft de printer geen RTS-invoer (verzoek om te verzenden), zodat je die niet als een omweg kunt gebruiken. Misschien kunt u een GPIO van de Pi aansluiten als een ingang naar een transistor om de printer aan te sturen en de printer alleen aan te zetten als de Pi volledig is geïnitialiseerd.
toegevoegd de auteur Pascal, de bron
Een 30uS glitch zou niet meerdere karakters genereren.
toegevoegd de auteur Chris Stratton, de bron
@ xavier.seignard De poort wordt vroeg geopend tijdens het opstarten. Tijdens Linux uncompression geloof ik, wat gebeurt voordat /boot/cmdline.txt wordt gelezen.
toegevoegd de auteur joan, de bron
@ChrisStratton Waarschijnlijk niet, als de regel net laag wordt, verwacht ik een enkel NULL-teken (0x00). Boot-berichten op 115200 bps zouden echter problemen veroorzaken voor de printer.
toegevoegd de auteur joan, de bron
@ChrisStratton Ik zou het bovenstaande moeten verduidelijken. De seriële poort ontvangt de decomprimerende Linux-foutmelding die door de software wordt uitgevoerd voordat /boot/cmdline.txt wordt gelezen en de seriële uitvoer wordt uitgeschakeld. Om dat bericht te voorkomen, denk ik dat je ofwel je eigen kernel moet bouwen of een uitgepakte opstartinstallatiekopie moet gebruiken.
toegevoegd de auteur joan, de bron
Thx joan, ik heb dit al gezien, maar zoals ik al zei, de glitch gebeurt direct na het voeden van de RPi, dus het systeem is nog niet begonnen. Dus kan het zijn wat je noemt?
toegevoegd de auteur Kaustubh, de bron
Bedankt jongens voor het nemen van de tijd om me te beantwoorden, zeer gewaardeerd! Ik denk dat ik ga voor een transistor of een USB naar TTL-kabel, omdat het bouwen van mijn eigen kernel uit mijn klasse is! Bedankt!
toegevoegd de auteur Kaustubh, de bron

Als dit foutieve baud-rate is van de berichten die door de Kernel-opstartcode worden gegenereerd, kunt u deze verwijderen door de regels in arch/arm/boot/gecomprimeerd/misc.c uit te schrijven of uit te schakelen. die deze produceren, meestal iets als:

putstr("Uncompressing Linux...");

en

putstr(" done, booting the kernel.\n");

plus enkele atypische foutgevallen, die je misschien intact wilt laten.

The actual justification for this answer though, is that if you don't feel like setting up a build environment for the kernel, you could also leverage the fact that these are null-terminated strings, by using a hex editor on the raw kernel file to overwrite the initial characters of each argument ("U" en " ") with null (ie, 0x00). Make sure if you do this that you overwrite rather than insert, as the latter would render the remainder of the kernel meaningless.

Een elektrische poort van de zendgegevenslijn met een GPIO moet ook vrij eenvoudig zijn.

2
toegevoegd
Heel, heel interessant. Ik had gedacht dat deze berichten alleen werden weergegeven als earlyprintk was ingeschakeld!
toegevoegd de auteur user17730, de bron