MAX 7219 mit SPI ansteuern?

Gast #479364
Hallo,

ich möchte einen MAX 7219 7-segment-Treiber mit einem ATMega 8 über SPI 
steuern. Dabei soll, wenn ich es im Datenblatt vom 7219 richtig 
verstanden habe, nach dem transfer von 16 bit die Flanke von LOAD (PB2 
am uC) steigen.

Kann mir jemand sagen, ob ich die SPI-Methoden so richtig aufgebaut 
habe? (Mit SPI habe ich so gut wie garkeine Erfahrung...)


void SPI_MasterInit(void)
{
  // set MOSI and SCK output, all others input
        DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5);
        // enable SPI, Master, set clock rate fck/16
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);

  PORTB = 0x00;
}

void SPI_MasterTransmit(char cData)
{
  SPDR = cData;   // Start transmission
  while(!(SPSR & (1<<SPIF)));   // Wait for transmission complete

  PORTB |= (1 << PB2);
  PORTB &= ~(1 << PB2);
}


void transmit(char addr, char data) {
  SPI_MasterTransmit(addr);
  SPI_MasterTransmit(data);
}

Vielen Dank fürs lesen und helfen :)
#479379
Nein, so geht es nicht: Du machst bereits zwischen den beiden 
8-Bit-Transfers einen Puls an PB2.

Probier es mal so:
1
void transmit(char addr, char data) {
2
  SPDR = addr;                  // Start transmission
3
  while(!(SPSR & (1<<SPIF)));   // Wait for transmission complete
4

5
  SPDR = data;                  // Start transmission
6
  while(!(SPSR & (1<<SPIF)));   // Wait for transmission complete
7

8
  PORTB |= (1 << PB2);
9
  PORTB &= ~(1 << PB2);
10
}

Viele Grüße, Stefan
#479463
Stephan Henning wrote:
> Vorsicht, der 7219 ist nicht 100% SPI kompatibel.


Das ist Quatsch mit Soße.
Den 7219 interessiert nur die steigenden Flanke des LOAD zur Übernahme.
Beim 7221 muß der Pin aber schon während des Schiebens low sein.

D.h. die Ansteuerung für nen 7221 geht auch immer für nen 7219, aber 
nicht umgekehrt.


Peter
Gast #479591
so jetzt jäuft alles wie es soll. es müsste jetzt sogar auch mit dem 
7221 kompatibel sein:
1
void SPI_MasterInit(void){
2
  DDRB = (1<<PB2)|(1<<PB3)|(1<<PB5);   // set PB2, MOSI and SCK output, all others input
3
  SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);   // enable SPI, Master, set clock rate fck/16
4
  
5
  PORTB |= (1 << PB5)|(1 << PB2);
6
}
7

8
void transmit(char addr, char data) {
9
  PORTB &= ~(1 << PB2);
10

11
  SPDR = addr;           // Start transmission
12
  while(!(SPSR & (1<<SPIF)));       // Wait for transmission complete
13
  
14
  SPDR = data;           // Start transmission
15
  while(!(SPSR & (1<<SPIF)));       // Wait for transmission complete
16

17
  PORTB |= (1 << PB2);
18
}

danke nochmal für die hilfe

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.