Forum: Mikrocontroller und Digitale Elektronik Ansteuerung eDIP 240-7 mit AT90CAN über SPI klappt nicht


von josh (Gast)


Lesenswert?

Hallo,

ich versuche schon leicht verzweifelt ein eDIP 240-7 über SPI 
anzusteuern. Ich benutze das STK500 /STK 501 und einem AT90CAN128. Zum 
Programmieren benutze ich das AVR Studio 4.16.
Ich bin gerade dabei mich in die Materie einzuarbeiten, d.h. ich habe 
mir den Code zusammenkopiert und so verändert, das er hoffentlich 
funktioniert.

Am Display habe ich folgende Pins angeschlossen:

PIN  1  = GND
PIN  2  = VDD
PIN  5   = VDD
PIN  6  = CS (PB0)
PIN  7  = MOSI (PB2)
PIN  8  = MISO (PB3)
PIN  9  = CLK (PB1)
PIN 11 = GND

Der Code sieht in etwa so aus:

#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#define P_CS     PB0
#define P_SCK    PB1
#define P_MOSI   PB2
#define P_MISO   PB3
#define PORT_SPI PORTB
#define PORT_CS  PORTB
#define DDR_SPI  DDRB
#define DDR_CS   DDRB

void SPI_MasterInit(void)
{
    // Aktivieren der Pins für das SPI Interface
  DDR_SPI |= (1<<P_SCK)|(1<<P_MOSI);
  PORT_SPI &= ~((1<<P_SCK)|(1<<P_MOSI)|(1<<P_MISO));

  DDR_CS |= (1<<P_CS);
  PORT_CS  |= (1<<P_CS);


SPCR =     (1 << MSTR) | /* Master mode */
           (1 << SPE)  | /* SPI Enable */
           (1 << DORD) | /* Data Order: LSB first */
           (1 << CPOL) | /* Clock Polarity: SCK High when idle */
           (0 << CPHA) | /* Clock Phase: sample on rising SCK edge */
           (1 << SPR1) | /* Clock Frequency: f_OSC / 64 */
           (0 << SPR0);
           SPDR = 0xff;
}

uint8_t spi_putc( uint8_t data ) {

    PORT_CS &= ~(1<<P_CS);
    SPDR = data; // Sendet ein Byte

    // Wartet bis Byte gesendet wurde
    while( !( SPSR & (1<<SPIF) ) );

    PORT_CS |= (1<<P_CS);
    _delay_us(15);
    return SPDR;

}
void test()
{
  spi_putc(0x11);
  spi_putc(0x01);
  spi_putc(0x43);
  spi_putc(0x55);
  spi_putc(0x00);
}

int main(void)
{
SPI_MasterInit();

while(1)
  {
    test();
   }
}

Ich habe jetzt schon verschiedene Sachen versucht zu senden, wie z.B. 
versucht eine Linie zu Zeichnen oder das Display auszuschalten. Wenn ich 
mir das ganze mit dem Oszi anschaue sieht es auch aus, als ob die Daten 
richtig auf dem Bus liegen. Trotzdem bekomme ich nichts anderes als ein 
blinkenden Cursor auf meinem Display zu sehen.
Hat jemand vielleicht eine Idee wo das Problem liegt?
Schon mal vielen Dank

Josh

von josh (Gast)


Lesenswert?

Ok Fehler gefunden.

(0 << CPHA) | /* Clock Phase: sample on rising SCK edge */

CPHA muss (1 << CPHA) sein.

Danke Tim!!

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.