8x8 LED driver MAX7219 - začátečník C - nereaguje

Zdravím… tak pokračuju zas s tím Cčkem. Troufnul jsem si tentokrát na jeden takový pěkný obvod, MAX7219, což je driver pro matici 8x8LED (nebo 8 kusů 8 segmentových displejů LED). Problém je, že se mi to absolutně vůbec nedaří rozchodit, a nevím proč. (TOto je můj úplně první pokus s SPI, v ASM jsem s SPI nic nepodnikal)
Mohl by mi to někdo ochotný a zdatný zkouknout, kde tam dělám chybu(y) ?
Datasheet MAX7219: datasheetcatalog.org/datashe … AX7221.pdf

Atmega8: Zapojený mám displej “DIG0”. Pin “DIN” mám zapojený na MOSI, “CLK” je napojený na SCK, a pin “LOAD” mám připojený na SS (PB2) a ovládám ho ručně. (nic dalšího jako pullupy atd. tam nemám, programátor ISP odpojuju)

Nemám tušení, kde mám chybu… možná v nastavení komunikace po SPI (nejpravděpodobněji), nebo možná posílám špatně ty příkazy do toho MAXe…

Zdroják zde:



#include <avr/io.h>

#define F_CPU 4000000U
#include <util/delay.h>

void main (void) 
{
  SPCR = 0b01010001;     /* SPI enable, MSB first, Master, 
                           SCK low when idle, Leading edge = sample
                          */

  DDRB = 0b00000100;
  PORTB = 0b00000100;
  
  _delay_ms(10);

  MAX_SendCMD(0x0C, 0x01);
  MAX_SendCMD(0x01, 0x0F); 

  while (1) ;  
}


void SPI_SendByte (char c) 
{
  SPDR = c;
  while ( !(SPSR & (1<<SPIF)) ) ;  // pockame na odeslani
}

void MAX_SendCMD(char adr,  char dta)
{
  PORTB = 0b00000000;
  SPI_SendByte(adr);
  SPI_SendByte(dta);
  PORTB = 0b00000100;
}

Všem, kteří pomohou, předem moc dík!

Nejdříve bych zkusil vložit časové smyčky např. delayus(20) nebo delší.
Záleží co píše datashit.MSB first bit máš správně.
Může to také dělat nízká frekvence oscilátoru.Možná zkus změnit SPCR , když by to pořád nešlo.

void MAX_SendCMD(char adr, char dta)
{
PORTB = 0b00000000;
delayus(20);
SPI_SendByte(adr);
SPI_SendByte(dta);
delayus(20);
PORTB = 0b00000100;
}

jinak co se týče :
void SPI_SendByte (char c)
{
SPDR = c;
while ( !(SPSR & (1<<SPIF)) ) ; // pockame na odeslani
}

tato funkce je správně , protože jí rovněž používám

delay(20us) je podle mě zbytečné, protože pokud nahlédneš do datasheetu, tak pokud jsme to správně pohopil, signál LOAD může jít zároveň se signálem CLK. Navíc ten MAX má SPI do 10MHz, a já ho mám taktované myslím na cca 200kHz (safra, zapoměl jsem udělat komentář do zdrojáku, na kolik že jsem to nataktil). Navíc to PB2 (LOAD) má předstih teoreticky pár instrukcí, což budou nějaké možná stovky nanosekund, takže to je podle mě naprosto dostačující mezera. Ale zkusím.
Především jsem ale chtěl, aby jste mi pomohli prosím zkontrolovat, jestli mám to SPI správně zinicializované, tedy správně tak, aby to odpovídalo požadavkům v datasheetě od MAXe…
Dík, H.

Tak už jsem to nějak rozjel, a ani nevim jak :open_mouth:
Ještě ten program musim doodladita a zrychlit (všude jsou čekací smyčky). Pak sem dam vysledny zdrojak. Treba to někomu pomůže, až narazí na stejný IO.

On je problém se signálem SS někde jsem to četl,m yslím na MCU, že musí být snad nastaven když se ta jednotka inicializuje. Nevím zkus to tam projít

Jo. to je taky jedna z věcí, kterou jsem měl blbě. U SPI se musí asi ručně nastavit SS a MOSI jako výstupní piny. Přestože v datsheetě jsem to nikde výslovně nenašel napsané.
Stav na SS si řídím ručně, ale nepracuju s tím jako se SS, ale prostě jen využívám tenhle pin jako řídící pro ten MAX. (ovládám s ním vstup LOAD - zápis do latch)
Jak řikám, ještě ten program musím doodzkoušet, a pak uvidim.