Hi Leute! Ich hab hier an der Uni einen nagelneuen Analog Devices BF537 (dh. keiner hat Erfahrung damit). Wir wollen mit ihm verschiedene Sensoren mit I2C auslesen und die Daten später verarbeiten. Wir benutzen Visual DSP++. Mein Problem: Ich finde leider nirgends eine Anleitung, ein Datasheet oder ähnliches, in dem erklärt wird, wie man den Blackfin in C vernüfntig programmiert. Ich hab hier nur was für Assembler. Ich hab bisher µC immer auch nur in Assembler programmiert, deswegen weiß ich nicht wie ich beginnen soll. Das Gute: Ich habe schon ein funktionierendes Codefragment, mit dem ich den I2C-Bus auslesen und beschreiben kann, siehe unten. Jedoch ist das sehr billig ohne Fehlerbehandlung und sonstiges. Vernünftig programmiert sollte es so aussehen wie auf dem angehängtem Bild. Meine konkreten Fragen: 1. Sind meine Fragen alle Blödsinn weil es irgendwo eine Dokumentation für C mit dem Blackfin gibt? :-D 2. Wie beginne ich eine Interruptroutine in C? 3. Ist es sinnvoll im Codefragment diese while()-Schleifen zu benutzen, die warten bis ein Interrupt gesetzt wurde, da diese den Prozessor davon abhalten, was anderes zu tun und Leistung verbraten? Gibt es eine professionellere Lösung oder ist das unproblematisch? 4. Wir haben das Board mittels dem JTAG-Interface ADZS-HPUSB-ICE von Analog per USB am Rechner hängen und können ihn so debuggen und flashen. Ist es auch möglich damit die Pins über eine gewisse Zeit auszulesen? (Ich konnte dies einmal mit einem XC164 mithilfe eines Intronix Logicport machen, wunderbar komfortabel...) Oder beim Debuggen die Werte der Register zu sehen? Ich hab in VirtualDSP++ keine Möglichkeit hierzu gefunden... Vielen Dank Johannes Anhang 2: I2C Codefragment // INIT *pTWI0_CONTROL = TWI_ENA | 0xA; // enable TWI controller *pTWI0_CLKDIV = CLKHI(0x08<<2) | CLKLOW(0x11<<2); // CLKDIV = CLKHI + CLKLOW = TWI SCL period / 10 MHz time reference *pTWI0_MASTER_ADDR = 0x53; // Definition of Adress to write to *pPORTFIO_DIR = 0x0330; // set Input/Output directions on PortxIO for(i=0; i<100000; i++){} // takes some time...... // ##################################################################### // Cheap and dirty I2C reading sequence: *pTWI0_MASTER_CTRL=TWICount(0x01) | MDIR | MEN; // initializing the transmit, reading x Bytes, MDIR is for reading // *pTWI0_MASTER_CTRL=TWICount(0x01) | MDIR | MEN | FAST; while(!(*pTWI0_FIFO_STAT & 0xC)){} // waits until two Bytes are in Fifo buffer // while(!(*pTWI0_FIFO_STAT & 0x1)){} // waits until one Byte is in Fifo buffer data = *pTWI_RCV_DATA8; // the 1 Byte that was read // data = *pTWI_RCV_DATA16; // the 2 Bytes that were read // #####################################################################
wie blöd muss man sein.... Hab das C-Manual endlich gefunden. Für alle, die es auch suchen: http://www.analog.com/static/imported-files/software_manuals/50_blackfin_cc.rev5.1.pdf Könnt ihr vielleicht trotzdem meine Fragen 2-4 beantworten, wenn sie schon hier stehen? :-D Va. die letzte wäre mir wichtig, hab ich mit meinem Equipent die Ports ubd Reguster auszulesen? Viele Grüße Johannes
Such mal hier nach "blackfin shell", da gibts ne Menge Beispielcode zum i2c. Die i2c-Sachen laufen auch unter uClinux super. IMHO ist VDSP nur teurer Schrott, aber muss jeder selber wissen. Ich arbeite mit GCC und nem icebear-JTAG, laeuft einwandfrei und ohne die nervigen Crashs.
Ich hab mittlerweile alles zum laufen gebracht, kann die Chips auch auslesen. Ist eigentlich gar nicht so aufwändig, nur ist der Blackfin I2C-Controller halt so mächtig und kompliziert dokumentiert, dass die Sache wiederum kompliziert wirkt. @ hemul: Was kann man mit dem Icebear Jtag machen? watches auf Register und Pins setzen und diese über eine bestimmte Zeit auslesen? Und nochmal meine Frage: Das sollte doch auch über den Analog Devices ZS-HPUSB-ICE und VDSP gehen oder? Ich wil ja nur beim Debuggen gewisse Register auslesen, so schwierig kann das doch bei so edlem Equipment nicht sein oder?
Hallo hoderlump, hoderlump schrieb: > 1. Sind meine Fragen alle Blödsinn weil es irgendwo eine Dokumentation > für C mit dem Blackfin gibt? :-D Blödsinn eh kaum, wie ging noch mal die lehrerhafte Floskel: Es gibt keine dummen Fragen.. Gibt leider von ADI nicht gerade Unmengen an lehrreichem Source, fuers meiste muss man extra bezahlen. Aber in den VDSP-Ordnern findest Du einiges an Beispielen. Unter uClinux gibts natuerlich ne Menge, da muss man sich aber auch meist nicht mehr mit der Hardware-Ansteuerung rumschlagen. Damit ist aber der Blackfin quasi zu einer MCU verdammt (nix mehr totale Latenzkontrolle). > 2. Wie beginne ich eine Interruptroutine in C? Hmm. Möglicherweise gibt's ein "interrupt" attribute, aber bin mir gerade nicht mehr so sicher, ob das bei VDSP gilt. > 3. Ist es sinnvoll im Codefragment diese while()-Schleifen zu benutzen, > die warten bis ein Interrupt gesetzt wurde, da diese den Prozessor davon > abhalten, was anderes zu tun und Leistung verbraten? Gibt es eine > professionellere Lösung oder ist das unproblematisch? Es gibt eine, und zwar, wenn Du den Blackfin in den IDLE-Zustand schickst ("idle"-Assembler-Befehl). Bei einem Interrupt kannst Du mit entsprechender Konfiguration den Core wieder aufwecken. > 4. Wir haben das Board mittels dem JTAG-Interface ADZS-HPUSB-ICE von > Analog per USB am Rechner hängen und können ihn so debuggen und flashen. > Ist es auch möglich damit die Pins über eine gewisse Zeit auszulesen? > (Ich konnte dies einmal mit einem XC164 mithilfe eines Intronix > Logicport machen, wunderbar komfortabel...) Oder beim Debuggen die Werte > der Register zu sehen? Ich hab in VirtualDSP++ keine Möglichkeit hierzu > gefunden... Wenn du spezifisch Pins monitoren willst, geht das nur über Boundary-Scan. Soweit ich weiss, können das die ADI-Tools nicht, aber einige teure generische Tools (oder der ICEbear Plus im Prinzip). Du kannst damit aber kein sauberes Monitoring machen, die Abtastung ist zu langsam. Die Werte der Register oder Variablen kannst du in VDSP per Watch-Window prima anschauen. Kann dir allerdings auch gerade nicht sagen wo, da ich auch nur noch mit dem ICEbear arbeite. Vom Debuggen her können die ADI-ICE und der ICEbear dasselbe, die Unterschiede liegen aber im Support für die jeweiligen Compiler und Binärformate (die zueinander nicht mehr kompatibel sind). Aber nicht verwirren lassen. Viel Erfolg mal :-) Gruesse, - Strubi
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.