I have a MAX7221 SPI 7-seg. LED driver linked to an AVR168P microcontroller.
Sometimes when powering on, everything works as expected. Other times the display blanks and remains blank. Other times the display illuminates all digits and remains "stuck" like that.
Can anyone give me any pointers as to what I could try to fix this?
(The 10K pull-up on CS is off-board - closer to the uC)
My code:
.MACRO spiDeselect
SBI PORTB, pinCS3
SBI PORTB, pinCS2
SBI PORTB, pinCS1
.ENDMACRO
.MACRO spiSelect2
SBI PORTB, pinCS3
SBI PORTB, pinCS1
CBI PORTB, pinCS2
.ENDMACRO
.MACRO spiOut ; value in portReg
OUT SPDR0, portReg
spiOutWait:
IN portReg, SPSR0 ; Can't use SBIS for port > 31
ANDI portReg, (1 << SPIF0)
BREQ spiOutWait
.ENDMACRO
.MACRO setupSpi
; Prevent SlaveSelect acting as an input
; or it'll force SPI into slave mode
LDI portReg, (1 << pinSS) | (1 << pinCS1) | (1 << pinCS2) | (1 << pinCS3) | (1 << pinBlink)
OUT DDRB, portReg
SBI PORTB, pinSS
SBI PORTB, pinBlink
LDI portReg, (1 << SPE0) | ( 1 << MSTR0 ) ;| spiDivide128
OUT SPCR0, portReg
; Setup SCK and MOSI pins AFTER enabling SPI, to avoid
; accidentally clocking in a single bit
SBI DDRB, pinMOSI
SBI DDRB, pinSCK
spiDeselect
.ENDMACRO
.MACRO max7221SetRegister
spiSelect2
MOV portReg, regReg ; MAX7221 register to set
spiOut
MOV portReg, valReg ; value to set
spiOut
spiDeselect
.ENDMACRO
.EQU Max7221RegisterDecodeMode=0x09
.EQU Max7221RegisterIntensity=0x0A
.EQU Max7221RegisterScanLimit=0x0B
.MACRO setupMax7221
LDI valReg, 0
LDI regReg, Max7221RegisterDecodeMode
max7221SetRegister
LDI valReg, 0x2
LDI regReg, Max7221RegisterIntensity
max7221SetRegister
LDI regReg, Max7221RegisterScanLimit
LDI valReg, 7 ; display 8 digits
max7221SetRegister
LDI regReg, Max7221RegisterShutdown
LDI valReg, 1 ; shutdown mode = 0
max7221SetRegister
.ENDMACRO
progStart:
CLI
setupStackAndReg
setupSpi
setupMax7221
................
Thanks.