.INCLUDE "M8def.inc"
.CSEG
.ORG $000
rjmp start
;main program
.ORG $0013
start:
cli
ldi r16, (1 < <DDB1)|(1 < <DDB2)|(1 < <DDB3)|(1 < <DDB5)
out DDRB, R16
sbi PORTB, PB2
cbi PORTB, PB1
ldi r16, (1 < <SPE)|(1 < <MSTR)|(1 < <CPHA)|(1 < <SPR1)
out SPCR, r16
in r16, SPSR
ldi r16, 0x55
rcall spi_mastertransmit
init_operation:
rcall delay_time
ldi r16, 0x04
rcall spi_mastertransmit
rjmp init_operation
delay_time:
;delay Xms here
nop
ret
spi_mastertransmit:
out SPDR, r16
wait_transmit:
sbis SPSR, SPIF
rjmp wait_transmit
;in r16, SPSR
;in r16, SPDR
ret
可以发现,单片机根本不能输出0x04,而只能连续输出0x55,在AVR Studio里做单步运行,可以发现原因可能是spsr寄存器中的spif位没有被清零,造成每次写spdr寄存器,都引起wcol位变成1,也就是说有冲突发生!
ATMEGA8的说明书中,说Spif位是只读的,只有通过硬件方式清零,或者用读该寄存器的方式清零,事实上不可以。(在wait_transmit子程序里把注释的去掉,也没有用!)
在此,请问各位高手,怎样才能连续向SPI端口写两个字节呢?或者如何才能真正用软件的方式将spif位清零呢?