Hallo, ich versuche seit einiger Zeit das eDIP240-7 über das SPI anzusprechen. Leider ohne Erfolg... Wenn ich dagegen die Daten über die serielle Schnittstelle übertrage funktioniert es. Angeschlossen ist es wie folgt: (ATMEGA32) Pin 5 CLK -> PB7 (SCK) Pin 7 MISO-> PB6 (MISO) Pin 9 MOSI-> PB5 (MOSI) Pin 10 SS -> PB4 (SCK) CPOL,DORD,CPHA sind jeweils offen dh.(Log 1) -> richtig?? void SPI_MasterInit(void) { // Set MOSI and SCK output, all others input DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4); // disable \ss PORTB |= (1 << PB4); // Enable SPI, Master, set clock rate fck/16 SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0); } void linieZeichnen(void) { SPI_MasterTransmit(0x11); SPI_MasterTransmit(0x0A); SPI_MasterTransmit(0x1B); SPI_MasterTransmit(0x44); SPI_MasterTransmit(0x4C); SPI_MasterTransmit(0x1B); SPI_MasterTransmit(0x47); SPI_MasterTransmit(0x44); SPI_MasterTransmit(0x00); SPI_MasterTransmit(0x00); SPI_MasterTransmit(0xEF); SPI_MasterTransmit(0x7F); SPI_MasterTransmit(0xDA); } int main( void ) { uart_init( MYUBRR); SPI_MasterInit(); while(1) { _delay_ms(10); linieZeichnen(); } return 0; } Währe nett wenn mir jemand helfen könnte....komme echt nicht weiter. Vielleicht hat jemand auch mal ein funktionierendes Beispiel für mich. Mfg Sascha
Hallo Sascha, habe auch lange gebraucht um den eDIP über SPI zu laufen zu bekommen. Mir hat viel ein LA geholfen mit dem ich das Protokoll beobachtet habe. Ich sende dir mal mein Beispiel ohne Kommentar, arbeite mit SPI und INT0 Interrupt. Mal sehen ob du mit meinem Programmierstil was anfangen kannst. Ich will damit eine Steuerung für die Eisnenbahn, Drehscheibe, lokschuppen ... aufbauen Gruss W.G.
Hallo Sascha, noch ein Nachtrag, arbeitest du auch richtig mit dem SS Signal des SPI, ich hatte es ein bischen vernachläsigt. Nachdem ich es so wie im Datenblatt des eDIP abgebildet realisiert hatte funktionierte es bei mir. Gruss W.G.
Hallo und erstmal danke für den Versuch mir zu helfen ;-) Ich werde mich morgen mal durch deinen Code beissen... Was für einen Controller benutzt du? Das mit dem SS kann ich leider nicht genau sagen. Wäre schön gewesen wenn mir jemand sagen könnte wo der Fehler in meinem Code liegt. Frohe Ostern Sascha
>Angeschlossen ist es wie folgt: (ATMEGA32) >Pin 5 CLK -> PB7 (SCK) >Pin 7 MISO-> PB6 (MISO) >Pin 9 MOSI-> PB5 (MOSI) >Pin 10 SS -> PB4 (SCK) Welches Display benutzt du denn genau? Im Datenblatt (Reichelt) steht: Pin 9 CLK Pin 8 MISO Pin 7 MOSI Pin 6 SS Unterscheiden sich die Pinbelegungen der Displays?
Hallo, hatte das gleiche Problem mit dem e320DIP. Über die serielle ging es, aber über SPI nicht. Der Fehler war, man muss das ACK( 6) mit einem Dummybefehl, oder Du kannst es auswerten, aus dem Displaycontroller auslesen. Über die serielle schnittstelle geht das automatisch. Wenn man es nicht ausliest, dann verschluckt der Controller praktisch jeden 2 Befehl... Hoffe es hilft Dir Gruss und frohe Ostern Bernd
Sorry, klar...war die Belegung meiner Stiftleiste ;-) Ist Natürlich laut Datenblatt angeschlossen: >Pin 9 CLK -> PB7 (SCK) >Pin 8 MISO-> PB6 (MISO) >Pin 7 MOSI-> PB5 (MOSI) >Pin 6 SS -> PB4 (SCK) Display ist das eDIP240-7.. @Bernd hättest du mal einen Beispielcode? Kann mir jetzt nicht viel darunter vorstellen. Ist zum verzweifeln das Ding... Gruß Sascha
evtl. hilft dir meine asm-Lib, die ich für das Display geschrieben habe. Das Display lief sofort mit ASM und I2C :) Falls Du noch die I2C-Lib brauchst, dann melde Dich einfach noch mal. Über den PC und RS232 progge ich nur die Menues.
sorry... wer lesen kann ist klar im Vorteil :) Habe es jetzt erst begriffen, dass es um SPI geht ... vergebt einem alten Metaller noch mal.
Hallo zur zeit nicht, weil das ein Projekt auf der Arbeit war. Aber ganz einfach. spitransfer( befehle und daten mit crc lt Datenblatt); spitransfer(0); Wenn du das ACK(=6) nicht benötigst dummy = spitransfer(0); wenn du es auswerten willst, es kom´men ja verschiedene Erorrs zurück! durch diesen zusaetzlichen befehl wird automatisch ja ueber MISO das ACK ausgelesen, das Byte steht praktisch schon drin im Controller, man muss es nur lesen! Zum Lesen muss doch ein CLK Signal erzeugt werden, und genau das passiert dann. Verstanden..? Gruss Bernd
So zumindest bekommen ich nun mit folgendem Code schon mal eine Linie gezeichnet.... void spi_init(void) { // Aktivieren der Pins f?r das SPI Interface DDR_SPI |= (1<<P_SCK)|(1<<P_MOSI); //DDRB = (1<<PB5)|(1<<PB7)|(1<<PB4); PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO)); //PORTB |= (1 <<PB4); DDR_CS |= (1<<P_CS); PORT_CS |= (1<<P_CS); // Aktivieren des SPI Master Interfaces, fosc = fclk / 4 SPCR = (1<<SPE)|(1<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA); } uint8_t spi_putc( uint8_t data ) { // Sendet ein Byte SPDR = data; // Wartet bis Byte gesendet wurde while( !( SPSR & (1<<SPIF) ) ) ; delay_us(500); return SPDR; } void linie_zeichnen(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2) { char dummy=0; char bcc=0; bcc=(DC1+0x0A+ESC+0x44+0x4c+0x1B+0x47+0x44+x1+y1+x2+y2)%256; PORT_CS &= ~(1<<P_CS); spi_putc(DC1); spi_putc(0x0A);//len spi_putc(ESC); spi_putc(0x44); spi_putc(0x4c); spi_putc(0x1B); spi_putc(0x47); spi_putc(0x44); spi_putc(x1); spi_putc(y1); spi_putc(x2); spi_putc(y2); spi_putc(bcc); PORT_CS |= (1<<P_CS); //uart_Send(bcc); dummy = spi_putc(0x00); uart_Send(dummy); } Allerding scheint er wirklich jeden zweiten Befehl zu verschlucken... müsste mir die obige Funktion linie_zeichnen(); nicht so das ACK bzw. NAK ausgeben? Irgendwie ist mir die Sache mit dem SPI empfang noch unklar. Oder muss ich hierfür diese Funktion benutzen: char SPI_SlaveReceive(void) { /* Wait for reception complete */ while(!(SPSR & (1<<SPIF))) ; /* Return data register */ return SPDR; } Sorry wegen der vielen Fragen Mfg Sascha
Hallo Sascha war jetzt 2 Tage nicht online. Zur info, ich benutze den mega8315. Noch mal zu dem SS Signal, meine Erfahrung damit war, das der Prozessor keines erzeugt, es war bei mir immer low. Ich hatte auch immer Aussetzer. Das edip lief nicht stabil. Ich habe mir dann das Datenblatt des edip angeshen und meine Signale auf dem LA, um festgestellt das da beim SS Signal unterschiede waren. Danach habe ich nach jedem gesendeten Byte des SS wieder deaktiviert (High), und vor jedem Senden wieder akitviert und sofort wurde das edip stabil. Man sollte sicher sein das das Verhalten aus dem Datenblatt auch durch das SPI exakt nachgebide wird. Bist du auch sicher das deiner Checksumme richtig berechnet wird, im Zweifek mit Calculator kontrollieren. Nach dem Senden des bcc warte ich ein paar us und sende dann FF (dummy Byte) und sofort antwortet der edip mit dem ACK. Ich habe z.Z nur ein Problem das nach einer bestimmten Anzahl von Taste oder Schalter funktionen das edip aus dem Tritt kommt, und spinnt. gruss W.G.
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.