Forum: Mikrocontroller und Digitale Elektronik MAX 7219 mit SPI ansteuern?


von Christina (Gast)


Lesenswert?

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 :)

von Stefan K. (_sk_)


Lesenswert?

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

von Christina (Gast)


Lesenswert?

danke! ich werde das morgen mal ausprobieren.

p.s.: wie kann ich eigentlich den code so wie du anzeigen lassen?

von Christina (Gast)


Lesenswert?

es lebt! :D

danke für die hilfe!

von Stephan H. (stephan-)


Lesenswert?

Vorsicht, der 7219 ist nicht 100% SPI kompatibel.
Das ist erst der 7221. MAXIM sagt beim 7219 "serial 3 Wire ".
Also auf die Flanken und das MSB achten.

Gruß Stephan

von Peter D. (peda)


Lesenswert?

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

von Christina (Gast)


Lesenswert?

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

von Stephan H. (stephan-)


Lesenswert?

@Peter,
genau deswegen betont Maxim den Unterschied auf Seite 6 im Datenblatt, 
und
erwähnt " and its serial Interface is fully SPI comtatible" ist..

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.