MAX 7219 mit SPI ansteuern?

Gast #479364
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 :)
#479379
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
#479463
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
Gast #479591
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

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