Hallo Ist es möglich an den Ports A0-A3 eine SD card Anzuschalten??? Port A0=CLK Port A1=CS Port A2=DI Port A3=DO wie schalte ich den Software SPI ??? Am Hardware SPI PortB hängt eine Nokia Display deswegen benötige ich ein Software SPI. Hat jemand einen Source dafür??? danke
> Am Hardware SPI PortB hängt eine Nokia Display deswegen > benötige ich ein Software SPI Warum das? SPI ist ein multi-slave bus.
Dass Du mehrere SPI devices an den selben Bus hängen kannst. Welches angesprochen wird, kannst Du über die CS (chip select) Leitung(en) bestimmen. Die einfach an normale IO pins am Controller anschliessen.
Also richtig verstanden greife ich parallel an den Port B wo das Display angeschaltet ist auch die SD Card ab. Den CS Port setzte ich für die SD Card z.B an Port A0. Habe ich das richtig verstanden????
Komme nicht weiter mit SDCARD und ATMEGA 128 und OSFT SPI. Hard SPI fällt aus da ich ein Display 3000 Board habe und nicht and die Ports B Hardware SPI rankomme. habe mal von ullrich radig die mmc lib ausprobiert und dort kann man ja den Software SPI einschalten =0 Port =A Pins zugeordnet aber leider kommt immer wieder Karte nicht erkannt Programm bleibt in der Schleife while (mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten { Print("Karte nicht erkannt"); } Print("Karte erkannt"); Die mmc.c ist unverändert. die mmc.h sieht so aus /*###################################################################### ################# Connect AVR to MMC/SD Copyright (C) 2004 Ulrich Radig ######################################################################## ###############*/ #ifndef MMC_H #define MMC_H //If use MMC-Card then set to 1 #define USE_MMC 1 //EXPERIMENTAL NOT READY!!!! #define SPI_Mode 0 //1 = Hardware SPI | 0 = Software SPI //#define SPI_Mode 0 #define MMC_Write PORTA //Port an der die MMC/SD-Karte angeschlossen ist also des SPI #define MMC_Read PINA #define MMC_Direction_REG DDRA #if defined (_AVR_ATmega128_) #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist #define SPI_Clock 0 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist #define SPI_SS 5 //Nicht Benutz muß aber definiert werden #endif #if defined (_AVR_ATmega32_) #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist #define SPI_SS 4 //Nicht Benutz muß aber definiert werden #endif //Prototypes inline unsigned char Read_Byte_MMC(void); inline void Write_Byte_MMC(unsigned char); extern void MMC_Read_Block(unsigned char *,unsigned char *,unsigned int); extern unsigned char mmc_init(void); extern unsigned char mmc_read_sector (unsigned long,unsigned char *); extern unsigned char mmc_write_sector (unsigned long,unsigned char *); extern unsigned char Write_Command_MMC (unsigned char *); extern unsigned char Read_CSD_MMC (unsigned char *); extern unsigned char Read_CID_MMC (unsigned char *); //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) #define MMC_Disable() MMC_Write|= (1<<MMC_Chip_Select); //set MMC_Chip_Select to low (MMC/SD-Karte Aktiv) #define MMC_Enable() MMC_Write&=~(1<<MMC_Chip_Select); #define nop() _asm__ __volatile_ ("nop" ::) #endif //_MMC_H_ Der MEGA läuft mit externen Quarz 16MHZ.
Hallo Hans Peter, beim Software SPI kann ich Dir keine Hilfe geben, aber warum denkst Du nicht nochmal über das nach, was Thorsten geschrieben hat? SPI ist ein BUS, d.h. Du kannst mehrere Slaves (das Display und die Karte) an die selben Pins parallel anschließen. Über Chip Select wählst Du dann den Slave aus... Oder habe ich jetzt irgendwas falsch verstanden?! Gruß, Nils
Wenn du die angegebene Beschaltung >Port A0=CLK >Port A1=CS >Port A2=DI >Port A3=DO und die weiter unten angegebenen Sourcen benutzt kann das nichts werden, da du es falsch konfiguriert hast. Ich verstehe aber auch nicht, warum du nicht das HardwareSPI benutzt.
Hallo Habe versucht die SD CARD an den Hardware SPI anzuschalten. Zwei LED sollen mir sagen ob die karte erkannt wurde oder nicht. es leuchtet kurz die nichterkannt led und geht nach ca 0,5 s aus. danach leuchet die erkannt led. Ich glaube jetzt gehts. Nur kommt jetzt mein zweites Prob. Das LCD Display was auch am SPI hängt seitdem wird es nicht initialisiert. Wenn ich die routine mmc_init ausklammerer dann ghet auch wieder mein display. while ( mmc_init() !=0) //ist der Rückgabewert ungleich NULL ist ein Fehler aufgetreten { PORTLEDC &= ~(1<<LEDFAULT); } PORTLEDC |= (1<<LEDFAULT); // LED PORTPIN "1" LED LOW ACTIV PORTLEDC &= ~(1<<LEDOK); lcdinit(); clsdsp(weiss); hier die display init von der nokia 6100 c +h void lcdinit (void) { SPIDDR=(1<<SDA)|(1<<CLK)|(1<<CS)|(1<<RESET); //Port-Direction Setup int i; CS0 SDA0 CLK1 RESET1 RESET0 waitms(10); RESET1 CLK1 SDA1 CLK1 sendCMD(0x01); waitms(10); sendCMD(0x11); waitms(40); sendCMD(0x29); waitms(40); sendCMD(0x3a); sendData(0x02); sendCMD(0x20); sendCMD(0x36); sendData(0x00); sendCMD(0x2d); //FARBTABELLE 254 unsigned char lcdinitd[]={0x00 , 0x02 , 0x04 , 0x06 , 0x09 , 0x0B , 0x0D , 0x0F , 0x00 , 0x02 , 0x04 , 0x06 , 0x09 , 0x0B , 0x0D , 0x0F , 0x00 , 0x04 , 0x0B , 0x0F}; for (i=0;i<20;i++) { sendData(lcdinitd[i]); } //DISPLAY LÖSCHEN clsdsp(weiss); } void clsdsp(unsigned char color) { lcd_box(0,131,0,131,color); } void lcd_box(int lx1,int lx2,int ly1,int ly2,unsigned char color) { Lcd_window(lx1,lx2,ly1,ly2); int px; int py; int pixel; int i; px = lx2 - lx1; px++; py = ly2 - ly1; py++; pixel = px * py; for (i= 0;i<=pixel;i++) { sendData(color); } } //Fenster AdressBereich setzen void Lcd_window(int lx1,int lx2,int ly1,int ly2) { sendCMD(0x2A); sendData(lx1); sendData(lx2); sendCMD(0x2B); sendData(ly1); sendData(ly2); sendCMD(0x2C); } void shiftBits(byte b) { CLK0 if ((b&128)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&64)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&32)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&16)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&8)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&4)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&2)!=0) SDA1 else SDA0 CLK1 CLK0 if ((b&1)!=0) SDA1 else SDA0 CLK1 } //send data void sendData(byte data) { CS0 CLK0 SDA1 //1 for param CLK1 shiftBits(data); } //send cmd void sendCMD(byte data) { CS0 CLK0 SDA0 //1 for cmd CLK1 shiftBits(data); } habe bei senCMD und sendDATA ein CS0 eingesetzt Chip select ist das richtig??? Wie muß man rangehen um das entsprechende gerät anzusteuern. Mal die SD CARD mal das Display. Das display ist paralel an die SDCARD angebunden.
also nochmal ganz einfach, über die CS-Leitung des jeweiligen Gerätes wählst du aus WELCHES gerät du ansprechen willst. Das andere CS-Leitung sollte dabei INAKTIV sein. Dein "Code" legt sehr nahe das du die CS Leitung des Display's aktivierst aber nicht wieder deaktivierst. Wenn du das bei der MMC vorher genauso gemacht hast, ist es kein Wunder das es nicht funktioniert. BTW: dein Code ist nichtssagend bzw. es fehlen sämtliche Teile die ein Verständnis fördern würden,poste entweder den ganzen Code oder auch sämtliche Makros die du verwendest.
So ich habe mal die ganzen sources beigelegt Ich hoffe man kommt zurecht damit. Mein Problem ist in der SPI init. habe es dort dokumentiert
Wie schon geschrieben du kannst nicht GLEICHZEITIG auf beide Geräte zugreifen sondern musst immer das, welches du benutzen willst, vor dem Zugriff mit der jeweiligen CS Leitung aktivieren und danach wieder DEAKTIVIEREN. Für das Display ist dies nicht erkennbar. BTW: Wenn du willst das andere mit deinem Programcode ohne Schaltung zurechtkommen,schreib hin ob das jeweilige Signal High oder Lowaktiv ist.
Hallo Also ich komme absolut niucht weiter CS High oder LOW bringt alles nichts. SPCR=(1<<SPIE)|(1<<SPE)|(1<<MSTR)|(1 << CPOL) | (1 << CPHA) | (1 << SPIE); Die Ursache liegt bei 1<<SPE //Enable SPI. Wenn ich es rausnehme aus SPCR dann geht das display wenn ich zuvor die CS des Displays auf low setze. aber wenn ich danach die CS des Displays wieder auf hight setzte und die CS der SDCARD wird die SDCARD nicht angesprochen LEDS bleiben aus. Wenn ich in SPCR die 1<<SPE mit eingebe und wieder das gleiche mache dann wird das Display nicht initialisiert aber die SDCARD. kann es sein das das Display nicht Master Slave tauglich ist???
Ich nehme nicht an das du den Code selber geschrieben hast, wenn du schon fremden Code verwendest solltest du ihn auch verstehen. Die Display ansteuerung ist in Software geschrieben mit "Pinwackeln" die MMC ansteuerung die du versuchst ist über die Hardwarespischnittstelle. Wenn du also die Hardwarespischnittstelle anschaltest geht nur die MMC sonst nur das Display. Du wirst dies nicht über die gleichen Pins machen können!
Ja genaus das Meine ich am Anfang meiner Frage. Deshalnb würde ich gerne die MMC über Software SPI Steuern.
Mit SOftware SPI gehts gar nicht auch mit dem Beispiel Source von Ullrich Radig. SPI Mode auf 0 für Software SPI Port A0=CLK Port A1=CS Port A2=DI Port A3=DO Karte wird nicht gefunden. Habe wieder die SD an den Hardware SPI angeschlossen MOSI=B2 auf Display Eingabg und SDCard Pin 2 MISO=B3 nicht auf Display nur auf SDCard pin 7 CLK=B1 auf Display und SDCard pin 5 SS = B0 nicht angeschlossen CSDisplay = B5 auf Display CSSDCard = A1 auf SDCard Pin1 Reset =B6 auf Display habe mal das display ausen vor gelassen um nur die MMC anzusteuern. CS vom Display auf High. PORTB|=(1<<5); Wenn ich jetzt in meinen Terminal schaue kommt folgendes Karte nicht gefundenKarte gefundena 1f dd d1 31 e7 9b 9f 7b 9d 62 56 ce e 4b cb Directory Cluster = cfd7 DirA = ab Size= 16059 FileName = çåhÿɾäM.O« Cluster = 14f3 DirA = 2f Size= -3829 FileName = ¹Ý:ZÇÜS.Ý\< Cluster = bf7c DirA = ee Size= 4451 FileName = ñ}¯¾ÈÅ}.CnK Cluster = fde4 DirA = 9b Size= -2107 FileName = 2Ûºÿ¼þý.vK Cluster = f9a8 DirA = 4f Size= 24531 FileName = :Íy÷¾.³^^ Cluster = c700 DirA = c3 Size= 215 FileName = d[g²~/A.~r Cluster = 7dae DirA = 29 Size= 24377 FileName = +7à½øO.µØ Cluster = 7edc DirA = 2a Size= -14389 FileName = Zÿûé§ÿñ.÷¸o Cluster = 5671 DirA = f0 Size= -16859 FileName = Çýÿ¥sÎ.[qC Cluster = 3bfe DirA = d6 Size= -6557 FileName = þä{ÁÏ.ܽK Cluster = ffb4 DirA = fb Size= -217 FileName = ÷Õ}ûWÛÿ.óo Cluster = f3dc DirA = 58 Size= -18565 FileName = Oû¾ÇÖ.Þj Cluster = edea DirA = b0 Size= -2058 FileName = ïsȲ³Òî.÷?á Cluster = d747 DirA = 65 Size= 30575 FileName = ìÙn~Õ.Pÿ× Cluster = 2bf5 DirA = 60 Size= 31444 FileName = Í<;fçßì.° Cluster = be6e DirA = 2e Size= -10083 FileName = Í<;fçßì.... Cluster = cfd7 DirA = ab Size= 16059 FileName = çåhÿɾäM.O« Cluster = 14f3 DirA = 2f Size= -3829 FileName = ¹Ý:ZÇÜS.Ý\< Cluster = bf7c DirA = ee Size= 4451 FileName = ñ}¯¾ÈÅ}.CnK Cluster = fde4 DirA = 9b Size= -2107 FileName = 2Ûºÿ¼þý.vK Cluster = f9a8 DirA = 4f Size= 24531 FileName = :Íy÷¾.³^^ Directory Ende FERTIG!! Normalerweise ist die SDcard leer(frisch foramtiert mit FAT16. was hat das zu bedeuten. Source ist die von Ullrich radig 2.5 1:1 übernommen. Nur die Ports Angepasst. #ifndef MMC_H #define MMC_H #include "typedefs.h" #include "main.h" #define SPI_Mode 1 //1 = Hardware SPI | 0 = Software SPI //#define SPI_Mode 0 #define MMC_Write PORTB //Port an der die MMC/SD-Karte angeschlossen ist also des SPI #define MMC_Write1 PORTA //Port an der die MMC/SD-Karte angeschlossen ist also des SPI #define MMC_Read PINB #define MMC_Direction_REG DDRB #define MMC_Direction_REG1 DDRA #if defined (_AVR_ATmega128_) #define SPI_DI 3 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist #define SPI_DO 2 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist #define SPI_Clock 1 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) #define MMC_Chip_Select 1 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist #define SPI_SS 0 //Nicht Benutz muß aber definiert werden #endif #if defined (_AVR_ATmega32_) #define SPI_DI 6 //Port Pin an dem Data Output der MMC/SD-Karte angeschlossen ist #define SPI_DO 5 //Port Pin an dem Data Input der MMC/SD-Karte angeschlossen ist #define SPI_Clock 7 //Port Pin an dem die Clock der MMC/SD-Karte angeschlossen ist (clk) #define MMC_Chip_Select 3 //Port Pin an dem Chip Select der MMC/SD-Karte angeschlossen ist #define SPI_SS 4 //Nicht Benutz muß aber definiert werden #endif //Prototypes inline U08 mmc_read_byte(void); inline void mmc_write_byte(U08); extern void mmc_read_block(U08 *,U08 *,U16); extern U08 mmc_init(void); extern U08 mmc_read_sector (U32,U08 *); extern U08 mmc_write_sector (U32,U08 *); extern U08 mmc_write_command (U08 *); extern U08 mmc_read_csd (U08 *); extern U08 mmc_read_cid (U08 *); //set MMC_Chip_Select to high (MMC/SD-Karte Inaktiv) #define MMC_Disable() MMC_Write1|= (1<<MMC_Chip_Select); //set MMC_Chip_Select to low (MMC/SD-Karte Aktiv) #define MMC_Enable() MMC_Write1&=~(1<<MMC_Chip_Select); #define nop() _asm__ __volatile_ ("nop" ::) #endif //_MMC_H_ SPI buslänge ca 3cm.(SDCARD->ATMEGA128. Warum zeigt er mir nicht im Terminal das es keine Verzeichnisse gibt???
>Deshalnb würde ich gerne die MMC über Software SPI Steuern.
dann mach es doch...
Wenn du fremden Code benutzt, musst du dich auch damit
auseinandersetzen und ihn verstehen und richtig konfigurieren. So wie
du es gemacht hast
ist es falsch konfiguriert. Ich würde vorschlagen du zeichnest dir
einen Schaltplan und gehst die konfigurationsdatei Schritt für Schritt
durch
und setzt die Parameter richtig. Wenn du willst das dir jemand hilft
setze den Schaltplan ins Forum. Lies dir die Dokumentation durch und
wenn du da Verständnisprobleme hast lies noch andere Dokumentation.
Wenn es dann immer noch Probleme gibt, stell die Fragen im Forum.
Eine Frage wie
Was bedeutet das für mich???
zeigt sehr deutlich das du dich mit der Problematik noch nicht
auseinandergesetzt hast. Der Thread erweckt sehr den Anschein das du
fremden Code genommen hast, diesen zusammengestöpselt hast,es nicht
funktioniert hat und du jetzt erwartest das irgendjemand es zum
funktionieren bringt.
DU bist dieser irgendjemand, es ist natürlich sehr ungünstig wenn du
die Antworten nicht verstehst.
Wieso falsch konfiguriert??? Auf der Seite von AVR DOS gibt es eine Shematic die Zeigt wo dei SDCARd angeschaltet wird dieses habe ich auch gemacht. Mein Mega 128 ist ein Board von Display 3000 D62. Dort hängt am SPI PortB standartmäßig ein Display dran. Parallel dazu habe ich die SDCARD so wie es im Netzt zu finden ist. Ich habe die Schaltung geprüft und stimmt mit dem von AVR DOS überein. Das Board besitz einen Levelshifter (5V>3V 3V>5V). das heist ich kann direkt ohne Spannungsteiler an die Pins. MOSI habe ich direkt an das Beinchen des 128Mega gelötet B3. Wenn man schon schreibt das es falsch konfiguriert ist dann bitte auch warum. Wenn ich die Source von Ullrich Radig nehme steht ja man muß nur die Ports anpassen was kann daran verkehrt sein. Beim Display genau das gleiche.
Mach endlich mal einen Schaltplan, schau dir an an welche Pins du das einzelne angeschlossen hast und welche Pins in der Konfigurationsdatei angegeben sind für clk di do. Das was du aus dem Netz ziehst ist jeweils Code für diesen Schaltplan. Dein Display mit GPIO Pins angesteuert deine MMC mit SPI das wird nichts zusammen!!!
Hier mal so wie es angeschlossen ist. Der Levelshifter ist nicht eingezeichnet. Pin B3 ist direkt mit dem Pin 7 der SD angeschlossen. So wie im Schaltplan von Ullrich radig der mit dem Spannungsteilern ohne Transistoren. Ich hoffe es hilft.
Ich glaube du hast recht das Display wird mit Software angesteuert und ist aber am SPI Hardware Ports angeschlossen. Nur habe ich auch die Lib von APATECH probiert nur da geht das display nicht wird nicht initialisiert.
Warum probierst du noch weitere Libs aus statt das was du hast auf deinen Fall anzupassen? 1. Display und MMC am gleichen Port Hardware SPI dazu müsstest du die Ansteuerung des Displays und der MMC verstehen sowie SPI und mindestens die Ansteuerung des Displays neuschreiben. 2. MMC an HardwareSPI Display in Software Dazu muestest du das Display an andere Pins anhängen die MMC an den SPI Port den das fkt. ja schon. Änderungen an der Displayansteuerung sind notwendeig halten sich aber im Rahmen. 3. Display bleibt wo es ist MMC an andere Portpins, anpassung der Software von der MMC. Das hast du zwar schon probiert allerdings falsch konfiguriert.
Display lässt sich nicht an andere Ports anschalten da es ein Fertiges Modul ist. Warum habe ich dei Ports falsch konfiguriert wo steht das???
Wenn Du das meinst das DO und DI vertauscht seien könnte habe ich schon probiert bringt nichts.
Hier nochmal die Anschaltung Ist vieleicht der MISO der Fehler weil er direkt am Port B3 hängt 5Volt LEvel.Muß er etwa auch 3 Volt Level haben????
Warum hängt die MMC am SPI Port? Ich denke du hast dort das Display und wir haben doch schon festgestellt das das Display und MMC nicht auf den gleichen PINs liegen können. Mach doch bitte mal einen kompletten Schaltplan so wie du es beschaltet hast und sag welche Variante du haben willst.
Also der Hardware SPI und MMC funktionieren jetzt prima das Ergebnis aus dem Hyperterminal Karte gefunden0 2d 0 32 13 59 83 c9 f6 d9 cf 80 16 40 0 33 Directory Cluster = 3 DirA = 20 Size= 10 FileName = MMC.TXT Directory Ende File Found!! test hallo das sieht soweit gut aus. Jetzt muß nur noch das Display in den Hardware SPI versetzt werden.
>Jetzt muß nur noch das Display in den Hardware SPI versetzt werden.
viel spass beim umschreiben des Programmcodes des Displays.
So habe es geschafft das Dispaly über SPI Anzusteuern leiderist ein Hacken dran es ist ziemlich lahm ich kann zuschauen wie es pixel für pixel setzt oder löscht.Mit der Software Routine gings blitzschnell hatz das Auge nicht bemerkt. Kann es mit dem SPI Timing zusammenhängen?????
Hallo Hans Peter, ich weiß das Thema ist schon Uralt, vielleicht schaust du ja aber doch ab und zu rein. Ich habe das selbe Problem mit dem D62 Board vom selben Hersteller. Wie hast du es schlussendlich gelößt? Beste Grüße Markus
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.