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 :)
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
danke! ich werde das morgen mal ausprobieren. p.s.: wie kann ich eigentlich den code so wie du anzeigen lassen?
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
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
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
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.