USB-Stick an einem PSoC
von
am 02.08.2011 um 17:29 (4673 Hits)
Heyho
mit dem heutigem Beitrag möchte ich euch zeigen wie man einen USB-Stick an einen PSoC-Chip anschließt.
Hierfür habe ich dieses Modul verwendet:
http://de.rs-online.com/web/p/kommunikation/7080107/
Dieses Modul wird über UART mit einer Baudrate von 9600 angesprochen. Um diese Baudrate zu erreichen habe ich den 24MHz Systemtakt des PSoCs 2x geteilt, einmal durch 14 und dann einmal durch 21. Danach muss man das Ergebniss nochmal durch 8 teilen um auf die Baudrate zu kommen. Mit den beiden Teilern erreicht man eine Baudrate von 9523 Baud. In meinen Versuchen hat sich gezeigt das diese Baudrate ausreichend ist um mit dem Vinculum-Modul zu kommunizieren.
Nun müssen dem Modul noch Befehle geschickt werden. Dies wird durch eine einfache Stringausgabe gemacht.
Mit den beiden Befehlen:
UART_CPutString("mkd Test");
UART_PutChar(0x0D);
veranlasst man das Modul dazu einen Ordner mit dem Namen "Test" anzulegen.
Die erste Zeile übermittelt den Befehl als Text. Der Befehl heißt "mkd" und er sorgt dafür das ein Ordner mit dem danach genannten Namen erzeugt wird. In diesem Fall also ein Ordner mit dem Namen "Test". Die zweite Zeile sorgt dafür das das Modul den Befehl auch abarbeitet. Der Chip auf dem Modul möchte nach jedem fertigen Befehl ein "CR" oder 0x0D haben, sonst wird der Befehl nicht ausgeführt.
Anders funktioniert es bei der Erstellung von Textdateien. Hierfür braucht man drei Befehle:
UART_CPutString("opw Test.txt");
UART_PutChar(0x0D);
UART_CPutString("clf Test.txt");
UART_PutChar(0x0D);
In der ersten Zeile wird eine Datei mit dem Namen "Test.txt" erstellt oder geöffnet. Da mein USB-Stick leer ist und somit keine Datei mit dem Namen "Test.txt" enthält, wird nur eine erstellt. Danach kommt wieder das notwendige 0x0D. In der dritten Zeile wird die Datei "Test.txt" wieder geschlossen. Dies ist notwendig damit das Modul diese auch anlegt. Anschließend kommt wieder ein 0x0D damit der Befehl ausgeführt wird.
Die selben Zeilen werden auch benötigt wenn man in eine Datei was reinschreiben will, aber das klappt bei mir aus bisher unbekannten Gründen noch nicht.
Nun will ich aber auch sehen was das Modul mir zu sagen hat. Hierfür verwende ich folgende Befehle in einem Unterprogramm:
char UARTBuffer[80];
char *p;
*p = 0;
p = UARTBuffer;
while ((*p++ = UART_cGetChar()) != 0x0D);
LCD_Position(0,0);
LCD_PrString(UARTBuffer);
memset (UARTBuffer,' ',16);
Die Funktion funktioniert wie folgt:
Mit den Befehlen
char UARTBuffer[80];
char *p;
wird ein Char-Array aus 80 Zeichen mit dem Namen "UARTBuffer" generiert. Desweiteren wird ein Pointer mit dem Namen "p" generiert der auf einen Char zeigt. Das * zeigt das es sich bei der nachfolgenden Variable um einen Pointer handelt. Anschließend wird mit dem Befehl
*p = 0;
der Pointer auf 0 gesetzt und mit dem Befehl
p = UARTBuffer;
wird gesagt das der Pointer auf das Char-Array "UARTBuffer" zeigt. Nun kommt eine while-Schleife. Diese Schleife
while ((*p++ = UART_cGetChar()) != 0x0D);
ließt ein Zeichen aus dem Recievbuffer des PSoCs aus und speichert es an die Stelle auf die der Pointer zeigt. Da der Pointer auf eine Stelle des Char-Arrays zeigt wird das Zeichen in dieser Stelle gespeichert. Danach wird der Pointer um 1 erhöht und es wird eine Abfrage gemacht ob das Zeichen ein 0x0D ist (weil das Modul jede Ausgabe mit einem "CR" oder 0x0D abschließt). Wenn wir nun das erste Zeichen empfangen wird dieses Zeichen in der Stelle 0 des Char-Arrays "UARTBuffer" gespeichert (weil mit dem Befehl *p = 0 der Pointer auf 0 gesetzt wurde). Nun wird der Pointer um 1 erhöht und zeigt nun auf die zweite Stelle des Arrays. Dort wird dann das zweite Zeichen gespeichert. Wenn das zweite Zeichen nun ein 0x0D ist, wird die Schleife verlassen.
Mit den Befehlen
LCD_Position(0,0);
LCD_PrString(UARTBuffer);
wird der Inhalt des Arrays "UARTBuffer" auf dem Display angezeigt. Der Befehl "LCD_Position" sagt das der Text in Zeile 0 und bei Zelle 0 starten soll. Der Befehl "LCD_PrString" gibt einen String der im RAM gespeichert ist aus, also das was das Modul gesagt hat und was ich mit meiner Schleife im PSoC gespeichert habe.
Mit dem Befehl
memset (UARTBuffer,' ',16);
leere ich das Char-Array dann wieder, weil ich nicht den Datenmüll der letzten Übertragung behalten will.
Die Displayanzeige funktioniert noch nicht so ganz richtig.....weiß noch nicht warum aber der zeigt ab und an den kompletten Text an und ansonsten lässt er immer ein paar Zeichen weg. Naja mal nach dem Fehler suchen
Das Programm ist noch nicht ganz ausgereift aber für den Anfang sollte es gehen
So dies erstmal vorweg. Nun bin ich noch fleißig am testen wie ich Daten in eine Datei reingeschrieben kriege
Wenn es was neues zu dem Thema gibt melde ich mich.
Im Anhang wie immer das Programm und falls ihr mehr Infos zu dem Modul haben wollt schreibt mir eine PN! Dann kann ich euch gerne ein Manual und ein Datenblatt senden.
Bis dahin
Daniel