PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Max 7221 über SPI ansteuern --> Probleme :(



Razer
30.04.2006, 12:22
Hall an alle

Ich versuch seit letzte Woche vergeblich den Max7221 mit dem Mega88 über SPI ansteuern. Leider werden all Digits eingeschalten.

Viellechr kann mir wer helfen :)

Hier der Code:



int main (void)
{
DDRC &= ~(1 << 1);
spi_init();
i2c_init();
segments_init();
adc_init();

spi_senden(0x0A, 0x0C); //Helligkeit
show_temp();

while(1)
{
PORTC^= (1 << 1);
delay(1000);
}
return 0;
}

void spi_init (void)
{
DDRB = ((1 << PB3) | (1 << PB5) | (1 << PB2)); //MOSI, SCK, SS Output, alle anderen Input
PORTB &= ~((1 << PB3) | (1 << PB5) | (1 << PB2));
SPCR = ((1 << SPE) | (1 << MSTR));
}

void spi_senden (uint8_t adress, uint8_t data)
{
PORTB &= ~(1 << PB2); //SS auf Low
SPDR = adress;
while (!(SPSR & (1 << SPIF))); //warten bis gesendet
SPDR = data;
while (!(SPSR & (1 << SPIF))); //warten bis gesendet
PORTB |= (1 << PB2); //SS auf high
}

void segments_init(void)
{
spi_senden(0x0B, 0x05); //6 Digits 0-5
spi_senden(0x0F, 0x00); //Display Test ausschaltren
spi_senden(0x0C, 0x01); //Normal Operation
spi_senden(0x09, 0xFF); //BCD Code für alle Digits
}

void show_temp(void)
{
uint8_t temp, nachkomma, zehner, einer;

readfromLM75(&temp, &nachkomma);

zehner = temp / 10;
einer = temp % 10;

spi_senden(0x09, 0x00); //Disable BCD Code
spi_senden(0x01, 0x4E); //C
spi_senden(0x02, 0x63); //°
spi_senden(0x09, 0xFF); //Enable BCD for all Digits

spi_senden(0x04, nachkomma);
spi_senden(0x05, einer);
spi_senden(0x06, zehner);
}


An den Segementanzeigen sollte eigentlich die Temperatur, die über einen LM75 Temperatursensor ausgelesen wird angezeigt werden.

Danke im Voraus

Gruß Robert

Hanni
30.04.2006, 12:38
Hmm, ich wäre vorsichtig mit dem SS Pin ...

Da gabs glaube ne Besonderheit ...
Schau mal im Datenblatt nach, mir ist jedenfalls so, als wenn der SS Pin nach Möglichkeit nicht auf L gezogen werden sollte.

Ansonsten könnte s noch helfen an die adresse 0x0A den Wert 0x0F zu schreiben ..

Razer
01.05.2006, 18:05
Hat leider nichts gebracht :(

SprinterSB
01.05.2006, 19:40
Das SPIF-Flag muss zurückgesetzt werden nach dem Senden. Ist etwas anders als mit den anderen AVR-Flags, steht aber im Hadbuch unter SPI.

Die Port-Richtungen brauchen nicht explizit gesetzt werden, das macht schon dieAVR-Hardware für dich. Ausnahme ist SS. Das muss explizit auf OUT. (Ansonsten wirst du Slave wenn es LOW geht).

Stimmen die Flanken?

Bist du sicher, daß der Slave lauscht, wenn SS auf LOW ist? Etwas seltsam das...

Ist der Baustein SPI-kompatibel? Oder steht irgendwo im Kleingedruckten so was wie "almost SPI-compatible"?

Razer
02.05.2006, 14:40
Hallo Georg Johann,

Ja SS muss auf low sein.


Chip-Select Input. Serial data is loaded into the shift register while CS is low. The last 16 bits of
serial data are latched on CS’s rising edge.

Das ist der Kommentar zum CS Pin (Der ist mit SS verbunden)

Wo steht das, dass ich die Flags rücksetzen muss? Bei den Beispielen im Datenblatt fine ich nichts dazu.

Gruß Robert

SprinterSB
02.05.2006, 16:16
Steht irgendwo bei der Registerbeschreibung am Ende des Kapitels, beim SPIF-Flag eben.