Ответ: ну не правда ну не пишет слейв в SPDR и всё тут... хоть вдоль хоть поперек читай
---------------------------
это слейв
---------------------------
pcon EQU 87h;
SPCR DATA 0D5H
SPSR DATA 0AAH
SPDR DATA 086H
MOSI BIT P1.5
MISO BIT P1.6
SCK BIT P1.7
SS BIT P1.4
transmit_completed BIT 20H.1;
serial_data data 30H;
receive_data data 31H;
examp data 32H
ORG 0000H ;[]
JMP INIT ;[]начало
ORG 0003H ;[] external interrupt 0 vector
reti ;[] undefined
ORG 000BH ;[]
;jmp TT0 ;[]прерывание по таймеру T0
reti
ORG 0013H ;[] external interrupt 1 vector
reti ;[] undefined
ORG 001BH ;[] timer 1 overflow vector
reti ;JMP TT1 ;[] undefined
ORG 0023H ;[] serial I/O interrupt vector
ljmp it_SPI ;
;reti
ORG 100h ;[]начало программы
INIT:
;setb MOSI
;clr MISO
;setb SCK
setb SS
clr p2.2 ;[1]
clr p2.4 ;[1]
clr P2.0
mov examp,#55h
clr transmit_completed
mov SPCR,#11000101b;
mov spdr,#01010000b;serial_data
setb ES
setb EA
main:
JNB transmit_completed,end_if
mov spdr, #55h
clr transmit_completed
end_if:
ljmp main
it_SPI:
cpl p2.2 ;[1]
mov 2dh,SPSR
jnb 6fh,break1
setb transmit_completed;
cpl p2.4 ;[1]
mov receive_data,spdr
break1:
mov 86h,examp; serial_data
reti
END
---------------------------
---------------------------
это мастер
---------------------------
pcon EQU 87h;
SPCR EQU 0D5H
SPSR EQU 0AAH
SPDR EQU 086H
MOSI BIT P1.5
MISO BIT P1.6
SCK BIT P1.7
SS BIT P1.4
transmit_completed BIT 20H.1;
serial_data equ 30H;
data_save equ 31H;
data_example equ 32H;
ORG 0000H ;[]
JMP INIT ;[]начало
ORG 0003H ;[] external interrupt 0 vector
reti ;[] undefined
ORG 000BH ;[]
; jmp TT0 ;[]прерывание по таймеру T0
reti
ORG 0013H ;[] external interrupt 1 vector
reti ;[] undefined
ORG 001BH ;[] timer 1 overflow vector
reti ;JMP TT1 ;[] undefined
ORG 0023H ;[] serial I/O interrupt vector
;jmp it_SPI
reti
ORG 80h ;[]начало программы
INIT:
;clr MOSI
;setb MISO
;clr SCK
setb SS
CLR P1.0
CLR P1.1
mov data_example,#55h ;
;CLR transmit_completed
clr sm0
setb sm1 ; задали режим работы 1
setb sm2
clr tr1 ; остановили таймер
mov th1,#0FDh ; автозагруж значение для 9600 Бод
mov TMOD,#00100001B ; режим автозагрузки таймера 1
setb tr1 ; запустили таймер КОМ-порта
mov pcon,#80h ; удвоили скорость до 19200 Бод
; SETB ES
; SETB EA ;[1] Общее разрешение всех прерываний
;===== Инициализация порта
mov SBUF,#0c7h
;=================================================================
;===== Конец Инициализации порта
;=================================================================
mov SPCR,#01010101b;
main:
call delay_nop
mov spdr,#1ch;data_example
break2:
mov r7,spsr
mov acc,r7
jnb acc.7,break2
mov serial_data,spdr;
JNB TI,$
MOV SBUF,serial_data
CLR TI
JNB TI,$
mov spdr,#0c3h
break3:
mov r7,spsr
mov acc,r7
jnb acc.7,break3
mov serial_data,spdr;
JNB TI,$
MOV SBUF,serial_data
CLR TI
JNB TI,$
mov spdr,#0c4h
break4:
mov r7,spsr
mov acc,r7
jnb acc.7,break4
mov serial_data,spdr;
JNB TI,$
MOV SBUF,serial_data
CLR TI
JNB TI,$
mov spdr,#0c5h
break5:
mov r7,spsr
mov acc,r7
jnb acc.7,break5
mov serial_data,spdr;
JNB TI,$
MOV SBUF,serial_data
CLR TI
JNB TI,$
mov spdr,#0c6h
break6:
mov r7,spsr
mov acc,r7
jnb acc.7,break6
mov serial_data,spdr;
JNB TI,$
MOV SBUF,serial_data
CLR TI
JNB TI,$
stop:
ajmp stop
send:
jnb ti, $
clr ti
ret
END
-
- Честно говоря с AT89 сталкиваться не приходилось. Я просто по аналогии с AT90 (AVR). Bill(1140 знак., 18.04.2005 21:54, )
- читай почту - mooh(18.04.2005 23:11, )
- Честно говоря с AT89 сталкиваться не приходилось. Я просто по аналогии с AT90 (AVR). Bill(1140 знак., 18.04.2005 21:54, )