АААААА!!! я схожу с ума, вроде почитал, разобрался в SPI, сделал примерно все по апноуту в даташите, даже протеус заработал! а вот на деле спаял и ничего не пашет, лампочка на слейве горит и горит, а должна бы гаснуть при нажатии кнопки на мастере. Оговорюсь что контроллеры соеденены портами MISO, MOSI, SCK, GND, VCC, RESET. Ну просто это те порты через которые я прошиваю контроллер программатором, на обоих макетках были одинаковые гнезда и я просто обжал шестижильный кабель и соединил эти гнезда. Мастер питается от телефонной зарядки 4,9В\700мА. и шестижильный кабель, будучи соединённым с GND и VCC - передает питание слейву, ну лампочка горит на нем по крайней мере. Контроллеры Atmega8A.
Мастер:
CODE:
.include "m8Adef.inc"
.org 0x000 rjmp Init ; Reset Handler
Init:
ldi r16,(1<<PB3)+(1<<PB5)+(1<<PB2)
out DDRB,r16 ;mosi, SS и sck выходы
ldi r16,(1<<PB2)
out PORTB,r16 ; 1 в SS делает контроллер мастером
ldi r16,0
out DDRD,r16 ;Порт D сконфигурирован как вход
ldi r16,255 ; начальные значения на D - выс лог уровни
out PORTD,r16
;Настройка SPI
ldi r16,(1<<SPR0)+(1<<SPE)+(1<<MSTR)
out SPCR,r16 ;Enable SPI, Master, set clock rate fck/16
SPI_MasterTransmit:
; Start transmission of data (r16)
in r16,PIND
out SPDR,r16
Wait_Transmit:
; Wait for transmission complete
sbis SPSR,SPIF
rjmp Wait_Transmit
rjmp SPI_MasterTransmit
Слейв:
CODE:
.include "m8Adef.inc"
.org 0x000 rjmp Init
Init:
;init ports
ldi r16,(1<<PB4)
out DDRB,r16 ;miso выход, SS и остальные - входы
ldi r16,(0<<PB2)
out PORTB,r16 ;SS установлен в 0, чтобы мк мог принимать данные от мастера
ldi r16,255
out DDRD,r16 ;порт D - выход
ldi r16,255 ; Зажигаем светодиод
out PORTD,r16
;настройка SPI
ldi r16,(1<<SPE)
out SPCR,r16 ;SPI включен
SPI_SlaveReceive:
; Wait for reception complete
sbis SPSR,SPIF
rjmp SPI_SlaveReceive
; Read received data and return
in r16,SPDR
out PORTD,r16
rjmp SPI_SlaveReceive