Например TDA7294

Форум РадиоКот • Просмотр темы - Вопрос по SPI на asm
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Вт сен 30, 2025 10:26:17

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 29 ]  1,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Вопрос по SPI на asm
СообщениеДобавлено: Сб мар 16, 2019 23:32:57 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт апр 04, 2014 09:34:08
Сообщений: 113
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
посоветуйте где я накосячил?) хочу передать по 1 байту между 2 МК атмега8 по SPI. число передаю 0b10000111 но приходит в оба МК не эти числа, ощущение что не хватило 1 такта что бы все число пришло?

фото симуляции Изображение
светодиоды в симуляции типа индикаторы.

прошивка мастера
Спойлер
Код:
;шаблон для атмега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


 
     sbi PortB,2                   ; устоновим в 1 бит  РВ2(SS) заблокируем передачу  данных  ведомого МК высоким  уровнем сигнала
   
                         


nop
nop
nop
nop
nop
nop
nop
nop
nop


     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:



     sbi PortB,2                   ; устоновим в 1 бит  РВ2(SS) заблокируем передачу  данных  ведомого МК высоким  уровнем сигнала

nop
nop
nop
nop
nop
     in r16, SPDR    ; читаем регистр данных SPDR
     out PORTD, r16  ; пишем число из регистра SPDR в PORTD
nop
nop
nop





  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:


     ldi r16, SPDR    ;читаем регистр данных SPDR модуля SPI
     out PORTD, r16   ;пересылаем эти данные в порт D

     


reti

_________________
глаза боятся, а руки что то не делают))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 00:53:37 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
Слейв мастеру начинает слать что-то по spi
У мастера срабатывает прерывание, т.к. по шине начинается передача..
И что же как вы думаете делает мастер!?
Барабанная дробь!!
Первой инструкцией в обработчике прерываний,вместо того чтоб принять байт, он запрещает слейву что слать и только потом читает регистр с данными, в котором конечно же мусор.

Меня всерьёз принимать не стоит. Предупреждаю что сам только знакомлюсь с миром микроконтроллеров и наверняка могу ошибаться...

Добавлено after 9 minutes 57 seconds:
Я бы попробовал сначала дождаться пока данные обменяются, а только потом запретил передачу.. х.з. могу и ошибаться

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 09:18:35 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15177
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Прячем тексты исходника под спойлер!
Иначе собственные вопросы/ответы искать кошмарус будет.
8)
С собственно с аппаратным блоком SPI я пока не занимался - там и согласований/настроек моного и применение только "стандартными" 8-битными посылками. Добавляем настройку и обработку прерываний по завершению передачи/приема (при необходимости их анализ и перенастройку режимов работы), согласование скоростей обмена, внутренний буфер данных для приема и передачи, логику определения размера пакета и типа данных.
Тогда уже и результат будет.
Штука простая, если приемник аппаратный - вида "регистр с мозгами".
А между МК обмен значительно посложнее (с учетом того, что и своих основных задач там достаточно).
Вобщем разбираться надо в том числе и с аппаратной начинкой.
К примеру...
По протоколу мастер выполнил передачу и ждет данные от слейва.
Следовательно модуль SPI мастера должен быть сразу же после передачи перенастроен на прием, а слейв перед своей передачей обязан выдержать определенную технологическую паузу.
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 10:01:50 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18406
Откуда: Новочеркасск
Рейтинг сообщения: 6
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
BOB51 писал(а):
По протоколу мастер выполнил передачу и ждет данные от слейва.
Следовательно модуль SPI мастера должен быть сразу же после передачи перенастроен на прием, а слейв перед своей передачей обязан выдержать определенную технологическую паузу.
не говорите ерунды: обмен по SPI всегда идет ОДНОВРЕМЕННО, поэтому когда мастер закончил передачу, он уже имеет ответ ведомого. если технически невозможно реализовать одновременный обмен, вводится "лишний" байт для обмена: мастер передает первый байт, на который слейв реагирует, а потом байт-пустышку (обычно 0xFF, не вжано, лишь бы восемь фронтов SCK было), а слейв, принв первый байт тут же ставит в SPDR свой ответ и уже сам игнорирует пришедший байт-пустышку.

никакой перенастройки мастера и/или слейва не требуется!

разница между ними только в том, что слейв не генерирует фронты SCK, а мастер - генерирует.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 10:35:50 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15177
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Это при условии, что передающей определена только одна из сторон.
Т.е. один МК только как мастер и один МК только как слейв, генератором тактов может быть только мастер.
Так же как и инициатором цикла обмена данными также является только мастер.
8)
А если каждый из МК может быть инициатором обмена?
Причем в произвольный момент времени ("мультимастер")...
:roll:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 10:46:30 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18406
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
:facepalm:

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 11:13:07 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
Так что же у тс не так с кодом?

Добавлено after 30 seconds:
Re: Вопрос по SPI на asm
Аж самому интересно стало...

Добавлено after 4 minutes 39 seconds:
Re: Вопрос по SPI на asm
Исходя из информации от arv передачу инициализирует мастер и только он.. значит мастеру прерывание spi без надобности, а вот слейв в этом прерывании должен какие-то данные пихать в spdr, правильно ли я понимаю?

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 11:24:53 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18406
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
лично я никогда слейвов на SPI не делал - нужда не возникала. а мастер делается проще пареной репы, особенно в случае единствнного слейва.
но по логическому размышлению сделать слейва без прерываний затруднительно, и таки да, по прерыванию он должен посмотреть, что получил от мастера и побыстрее выдать ответ.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 11:43:34 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
Я тоже только датчики опрашивал по спи. А прерывание интересно когда срабатывает, перед тем как первый бит поступит или после первого бита? Вы там что то про запасной бит писали..

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 11:50:15 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2119
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18406
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
при чем тут первый бит? прервание возникает после приема/передачи последнего, т.е. 8-го бита.

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 12:08:54 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15177
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
:facepalm:

Понятно, что в таком случае I2C полезнее, но всегда хочется "вроде бы попроще".
8)


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 12:15:24 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт апр 04, 2014 09:34:08
Сообщений: 113
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
3 вечера боюсь с этой проблемой) пока не догоняют в чем дело. Одновременный обмен байтом, и посыл обоих в порт д, чтоб зажеч светодиоды и радостно улыбался мол все работает, ан нет, где то косяк) прибывал всякое, менял полярность передачи в прошивках, норы добавлял и убирал, в симуляторе подтягивал линии к земле и к питанию через резюки,не помогает

_________________
глаза боятся, а руки что то не делают))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 12:29:09 
Друг Кота
Аватар пользователя

Карма: 96
Рейтинг сообщений: 1472
Зарегистрирован: Вт мар 16, 2010 22:02:27
Сообщений: 15177
Откуда: ДОНЕЦК
Рейтинг сообщения: 0
Ежли б местом назначения был не МК, а обычный 595й регистр и/или какой дисплейчик с протоколом SPI - никаких проблем не будет.
Однако запхнуто ДВА МК -
тут или жестко ставить один из них в режим приема а другой только на передачу (до прояснения более сложных вариантов), либо применять I2C/UART в качестве аппаратных модулей.
:dont_know:


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 12:40:06 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт апр 04, 2014 09:34:08
Сообщений: 113
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
Боб51 да разобраться бы хотелось. 2 однотипных мк , передача по 1 байта и засада

_________________
глаза боятся, а руки что то не делают))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 13:39:30 
Друг Кота

Карма: 64
Рейтинг сообщений: 1015
Зарегистрирован: Пт мар 07, 2008 06:54:43
Сообщений: 4349
Откуда: Ижевск
Рейтинг сообщения: 0
Чтение лучше делать так :)
Код:
   IN   R16,SPDR
;     ldi r16, SPDR    ;?????????????????????????;читаем регистр данных SPDR модуля SPI
     out PORTD, r16   ;пересылаем эти данные в порт D
   reti


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 20:25:24 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
при чем тут первый бит? прервание возникает после приема/передачи последнего, т.е. 8-го бита.

Соответственно алгоритм опроса слейва мне видится так:
СпойлерМастер шлёт байт (возможно команда какие именно данные хочет мастер)
После передачи первого байта, мастер имеет мусор в посылке от слейва(прерывания то ещё нет)
У слейва как только обменялся последний бит, срабатывает прирывание, в котором он считывает команду из spdr и в соответствии с командой сует в шину данные.
Далее мастер, чтобы получить актуальные данные, делает ещё одну передачу(нулей например) и получает от слейва актуальные данные соответственно команде из предыдущей посылке.
Слейв получил байт.
Сработало прерывание.
Видит что нули и ничего не делает(как вариант пихает нули обратно)
Как то так???

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 21:07:16 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт апр 04, 2014 09:34:08
Сообщений: 113
Откуда: Санкт-Петербург
Рейтинг сообщения: 1
akl спасибо за подсказку) в жизнь б не заметил такой недочет) в коде ведомого мк накосячил а в мастере правильно написал)

вот исправленные исходники)
Код:
;шаблон для атмега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







Изображение

_________________
глаза боятся, а руки что то не делают))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 21:13:47 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
Работает?

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Вс мар 17, 2019 21:22:58 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пт апр 04, 2014 09:34:08
Сообщений: 113
Откуда: Санкт-Петербург
Рейтинг сообщения: 0
bafomet911 да работает, скрин симуляции выше в картинке)

_________________
глаза боятся, а руки что то не делают))


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Вопрос по SPI на asm
СообщениеДобавлено: Пн мар 18, 2019 09:14:13 
Открыл глаза
Аватар пользователя

Зарегистрирован: Чт янв 31, 2019 18:49:04
Сообщений: 76
Откуда: Воронежская область
Рейтинг сообщения: 0
Ага, спасибо. Скоро тоже буду подобное делать. Только я буду делать ответ в зависимости от команды мастера..

_________________
Изображение


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  1,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 53


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y