Forum: Mikrocontroller und Digitale Elektronik eDIP240-7 und SPI


von Sascha (Gast)


Lesenswert?

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

von Wolfgang G. (wgrimm55)


Angehängte Dateien:

Lesenswert?

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.

von Wolfgang G. (wgrimm55)


Lesenswert?

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.

von Sascha (Gast)


Lesenswert?

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

von Jupp (Gast)


Lesenswert?

>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?

von Bernd B. (behbeh)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Metaller (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Metaller (Gast)


Lesenswert?

sorry... wer lesen kann ist klar im Vorteil :) Habe es jetzt erst 
begriffen, dass es um SPI geht ... vergebt einem alten Metaller noch 
mal.

von Bernd B. (behbeh)


Lesenswert?

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

von Sascha (Gast)


Lesenswert?

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

von Wolfgang G. (wgrimm55)


Lesenswert?

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
Noch kein Account? Hier anmelden.