Сб мар 16, 2019 23:32:57
Вс мар 17, 2019 00:53:37
Вс мар 17, 2019 09:18:35
Вс мар 17, 2019 10:01:50
не говорите ерунды: обмен по SPI всегда идет ОДНОВРЕМЕННО, поэтому когда мастер закончил передачу, он уже имеет ответ ведомого. если технически невозможно реализовать одновременный обмен, вводится "лишний" байт для обмена: мастер передает первый байт, на который слейв реагирует, а потом байт-пустышку (обычно 0xFF, не вжано, лишь бы восемь фронтов SCK было), а слейв, принв первый байт тут же ставит в SPDR свой ответ и уже сам игнорирует пришедший байт-пустышку.BOB51 писал(а):По протоколу мастер выполнил передачу и ждет данные от слейва.
Следовательно модуль SPI мастера должен быть сразу же после передачи перенастроен на прием, а слейв перед своей передачей обязан выдержать определенную технологическую паузу.
Вс мар 17, 2019 10:35:50
Вс мар 17, 2019 10:46:30
Вс мар 17, 2019 11:13:07
Вс мар 17, 2019 11:24:53
Вс мар 17, 2019 11:43:34
Вс мар 17, 2019 11:50:15
Вс мар 17, 2019 12:08:54
Вс мар 17, 2019 12:15:24
Вс мар 17, 2019 12:29:09
Вс мар 17, 2019 12:40:06
Вс мар 17, 2019 13:39:30
IN R16,SPDR
; ldi r16, SPDR ;?????????????????????????;читаем регистр данных SPDR модуля SPI
out PORTD, r16 ;пересылаем эти данные в порт D
reti
Вс мар 17, 2019 20:25:24
Вс мар 17, 2019 21:07:16
;шаблон для атмега8
;
;настройка SPI , МК настроим в режим Master
;
;
;однократная передача байта по SPI от нашего МК(Master) к ведомому МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;пин РВ2(SS) нашего МК подключен к транзистору, а транзистор подключен к пину РВ2(SS) инверсно. (смысл решения таков,если наш пин РВ2 выставить в 1, то пин РВ2 ведомого МК сбросится в 0)
;
;
;
;
;
;
;
;;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org $000 rjmp RESET ;Reset Handler
;.org $001 reti ;rjmp EXT_INT0 ; IRQ0 Handler
;.org $002 reti ;rjmp EXT_INT1 ; IRQ1 Handler
;.org $003 reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org $004 reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org $005 reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org $006 reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org $007 reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org $008 reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org $009 reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org $00a rjmp SPI_STC ; SPI Transfer Complete Handler
;.org $00b reti ;rjmp USART_RXC ; USART RX Complete Handler
;.org $00c reti ;rjmp USART_UDRE ; UDR Empty Handler
;.org $00d reti ;rjmp USART_TXC ; USART TX Complete Handler
;.org $00e reti ;rjmp ADC ; ADC Conversion Complete Handler
;.org $00f reti ;rjmp EE_RDY ; EEPROM Ready Handler
;.org $010 reti ;rjmp ANA_COMP ; Analog Comparator Handler
;.org $011 reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org $012 reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;***********************************************************************
RESET:
cli ;запретить все прерывания
ldi r16, low(RAMEND) ;загрузка указателя стека
out SPL, r16
ldi r16, high(RAMEND) ;загрузка указателя стека
out SPH, r16
ldi r16, 0b11111111 ; порт D на выход
out DDRD, r16
ldi r17, (1<<PB3)|(1<<PB5)|(1<<PB2)
out DDRB, r17 ; биты РВ3(MOSI), РВ5(SCK), РВ2(SS) настроим на выход (Для ведущего настроить MOSI, SCK, SS на выход, MISO на вход)
ldi r16, (1<<SPE)|(1<<MSTR)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE) ; выставим бит номер 6(SPE) в 1, включим модуль SPI, выставим бит номер 4(MSTR) в 1 настроим наш МК в режим Master. бит SPIE разрешает прерывание по SPI
out SPCR, r16 ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных передается 7-ой старший бит
; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0, биты 1(SPR1) , 0(SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128
cbi PortB,2 ; сбросим в 0 бит РВ2(SS) активизируем ведомый МК низким уровнем сигнала на передачу данных
; .
ldi r16, 0b10000111 ; запишем число в регистр данных SPDR и передача байта по SPI автоматически началась
out SPDR, r16
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;***********************************************************************************************
SPI_STC:
in r16, SPDR ; читаем регистр данных SPDR и пишем прочтеное в r16
out PORTD, r16 ; пишем число из регистра r16 в PORTD
reti
;шаблон для атмега8
;
;настройка SPI , МК настроим в режим Slave
;
;
;однократный прием байта по SPI от МК(Master) к нашему МК(Slave). оба атмега8
;режим работы SPI 0
;скорость работы fclk/128
;
;пин РВ2(SS) нашего МК подключен к транзистору, а транзистор подключен к пину РВ2(SS) инверсно. (смысл решения таков,если наш пин РВ2 выставить в 1, то пин РВ2 ведомого МК сбросится в 0)
;
;
;
;
;
;
;
;;****************************************************************************************
.cseg
.include "m8Adef.inc"
;
;;***********************************************************************
.org $000 rjmp RESET ;Reset Handler
;.org $001 reti ;rjmp EXT_INT0 ; IRQ0 Handler
;.org $002 reti ;rjmp EXT_INT1 ; IRQ1 Handler
;.org $003 reti ;rjmp TIM2_COMP ; Timer2 Compare Handler
;.org $004 reti ;rjmp TIM2_OVF ; Timer2 Overflow Handler
;.org $005 reti ;rjmp TIM1_CAPT ; Timer1 Capture Handler
;.org $006 reti ;rjmp TIM1_COMPA ; Timer1 CompareA Handler
;.org $007 reti ;rjmp TIM1_COMPB ; Timer1 CompareB Handler
;.org $008 reti ;rjmp TIM1_OVF ; Timer1 Overflow Handler
;.org $009 reti ;rjmp TIM0_OVF ; Timer0 Overflow Handler
.org $00a rjmp SPI_STC ; SPI Transfer Complete Handler
;.org $00b reti ;rjmp USART_RXC ; USART RX Complete Handler
;.org $00c reti ;rjmp USART_UDRE ; UDR Empty Handler
;.org $00d reti ;rjmp USART_TXC ; USART TX Complete Handler
;.org $00e reti ;rjmp ADC ; ADC Conversion Complete Handler
;.org $00f reti ;rjmp EE_RDY ; EEPROM Ready Handler
;.org $010 reti ;rjmp ANA_COMP ; Analog Comparator Handler
;.org $011 reti ;rjmp TWSI ; Two-wire Serial Interface Handler
;.org $012 reti ;rjmp SPM_RDY ; Store Program Memory Ready Handler
;***********************************************************************
RESET:
cli ;запретить все прерывания
ldi r16, low(RAMEND) ;загрузка указателя стека
out SPL, r16
ldi r16, high(RAMEND) ;загрузка указателя стека
out SPH, r16
ldi r16, 0b11111111 ;порт D на выход целиком
out DDRD, r16
ldi r17, (1<<PB4) ;
out DDRB, r17 ; бит PB4(MISO) устанавливаем в 1, у ведомого МК (MISO) ставится на выход а (MOSI), (SS), (SCK) на вход
ldi r16, (1<<SPE)|(1<<SPR1)|(1<<SPR0)|(1<<SPIE) ; выставим бит номер 6(SPE) в 1, включим модуль SPI, бит номер 4(MSTR) сброшен в 0, наш МК в режим (Slave). разрешим прерывание битом (SPIE)
out SPCR, r16 ; биты номер 3(CPOL) и 2(СPHA) сброшены в 0, настроен режим работы 0 по умолчанию
; бит номер 5(DORD) сброшен в 0 по умолчанию, поэтому первым в передаче данных передается 7-ой старший бит
; бит (SPI2X) регистра SPSR по умолчанию сброшен в 0, биты (SPR1) , (SPR0) регистра SPCR выставим в 1 и работает режим скорости fclk/128
ldi r16, 0b10000111 ; запишем число в регистр данных SPDR для отправки мастеру, чтоб видеть что передача произошла
out SPDR, r16
sei ;разрешаем прерывания
;***********************************************************************************************
MAIN:
rjmp MAIN
;**********************************************************************************************
SPI_STC:
in r16, SPDR ;читаем регистр данных SPDR модуля SPI и пишем число в регистр r16
out PORTD, r16 ;пересылаем эти данные в порт D из регистра r16
reti
Вс мар 17, 2019 21:13:47
Вс мар 17, 2019 21:22:58
Пн мар 18, 2019 09:14:13