SPI und EA DIP 204-4

OP #815263
Lesenswert?

Hallo Forum- Gemeinde,

ich möchte gerne mein EA DIP 204-4 über SPI ansteuern. Allerdings klappt 
das nicht so recht :o(
Könnt ihr mir vielleicht sagen was ich falsch mache?

Zur Hardware:
Lötbrücke auf der Rückseite ist gesetzt.
AT Mega 16, 4MHz.


Zur Software:

Spi-init sieht in etwa so aus:

-transmit msb first
-Init in master mode
-set clockrate (fosc / 16)
-data Mode 3 (Idle = high, Datenübernahme bei fallenden Flanke von SCLK)
-spi interrupt enabled
-spi on


Für die Initialisierung des Displays sende ich:

spi_send_data(0xF8); // Starbyte
spi_send_data(0x00); spi_send_data(0x10); // higher; lower Byte
pause()
spi_send_data(0x20); spi_send_data(0x40);
pause()
spi_send_data(0x00);spi_send_data(0xC0);
pause()
spi_send_data(0x20);spi_send_data(0x00);
pause()
spi_send_data(0x00);spi_send_data(0x60);
pause()
spi_send_data(0x20);spi_send_data(0x40);
pause()
spi_send_data(0x00);spi_send_data(0x90);
pause()
spi_send_data(0x02);spi_send_data(0x00);
pause()
spi_send_data(0x00);spi_send_data(0x10);

Die Reihenfolge der Initialisierung habe ich schon mehrere male geändert 
da ich nicht so genau weiß wie man das Display richtig initialisiert. 
Ich habe auch die Initialisierung laut Datenblatt probiert. Es gibt hier 
im Forum zwar ein paar Beispiele aber die konnten mir auch nicht weiter 
helfen. Ich habe ein billiges, PC Oszilloskop, die Daten werden schon 
richtig raus gesendet.
Ich würde gerne wissen in welcher Art das Display seriell angesteuert 
werden muss. Im 8 Bit, 4Bit oder ist es egal?? (im Bezug auf das DL Bit 
in „Function Set“)

Mir geht es in erster Linie darum, ob ich das Display so richtig 
initialisiert habe.

Sieht von Euch jemand auf Anhieb einen Fehler?

Vielen Dank für Eure Mühe.

Grüße, Marcel
Gast #815271
Lesenswert?

>Spi-init sieht in etwa so aus:

Und wie sieht die präzise aus ?

>-spi interrupt enabled

Na hoffentlich hast du auch eine Interrupt Routine
dafür programmiert.

>Ich habe auch die Initialisierung laut Datenblatt probiert.

Das ist in der Regel der richtige Weg.
OP #815279
Lesenswert?

Hallo Holger,

Die Init sieht so aus:

folgendes steht im Header.....

/////////////Definitionen /////////////////
// Bit 5 Übertragungsrichtung
#define DATA_ORDER 0x20
#define transmit_lsb_first() { SPCR |=  DATA_ORDER;}
#define transmit_msb_first() { SPCR &= ~DATA_ORDER;}
#define SPI_MODE 0x10
#define set_spi_master_mode() {SPCR |=  SPI_MODE;}

// Bit 3 Polarität von SCK
#define CLOCK_POLARITY 0x08
#define set_sck_idle_high() {SPCR |=  CLOCK_POLARITY;}
#define set_sck_idle_low()  {SPCR &= ~CLOCK_POLARITY;}

// Bit 2 Sende- Flanke
#define CLOCK_PHASE 0x04
#define set_send_from_idle_to_no_idle() {SPCR |=  CLOCK_PHASE;}
#define set_send_from_no_idle_to_idle() {SPCR &= ~CLOCK_PHASE;}



im .c Modul
////////////////// Funktionen //////////////////
void init_spi_master_mode(void)
{
  DDR_SPI |= (1<<SCK) | (1<<MOSI) | (1<<SS);// SCK, MOSI  und SS als 
output
  PORT_SPI |= (1<<SCK)|(1<<SS);// SCK und SS "driven high"
  set_spi_master_mode();

}

void set_data_mode(U8 mode)
{
  switch (mode)
  {
    case DATA_MODE_0:
      set_sck_idle_low();
      set_send_from_no_idle_to_idle();
    break;

    case DATA_MODE_1:
      set_sck_idle_low();
      set_send_from_idle_to_no_idle();
    break;

    case DATA_MODE_2:
      set_sck_idle_high();
      set_send_from_no_idle_to_idle();
    break;

    case DATA_MODE_3:
      set_sck_idle_high();
      set_send_from_idle_to_no_idle();
    break;
  }
}


void init_spi(void)
{
  transmit_msb_first();
  init_spi_master_mode();
  SPCR |= (1<<SPR0);
  set_data_mode(DATA_MODE_3);
   //spi_interrupt_enable();
  spi_enable();
}


Hmmm, aber mir fällt auf das ich ja gar keine ISR bräuchte…. Ich möchte 
ja nur Daten senden.

Viele Grüße,
Marcel
OP #816085
Lesenswert?

Hallo, ich habe da noch eine Frage zum MISO!! Wie muss der Pegel vom 
MISO aussehen?? Wenn ich mit dem Oszi schaue dann haben SCLK und MOSI 
Flanken von etwa 0 bis 4,5 Volt, MISO allerdings von 4 bis 5 Volt. Als 
nur einen Spannungshub von 1 Volt. Ich habe diese Spannung sowohl wenn 
der Controller mit dem Display verbunden ist also auch wenn die Leitung 
frei in der Luft hängt. Das ist doch viel zu wenig, oder?? Ich habe 
wegen der ISP- Programmierschnittstelle 10k Widerstände in den drei 
Leitungen MOSI,MISO, SCLK. Benötigt der Mega 16 überhaupt das MISO- 
Signal??
Ich würde mich über einen Hinweis sehr freuen!!

Viele Grüße,
Marcel

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