eDIP240-7 und SPI

Gast #819918
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
#820023
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.
Angehängte Dateien:
Gast #820438
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
Gast #820445
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?
#820457
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
Gast #820633
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
#820806
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
Gast #821389
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
#821554
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren