реклама на сайте
подробности

 
 
> не работает SPI, помогите запустить SPI
skef
сообщение Nov 4 2009, 18:06
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



есть 2 мк ATMEGA8, необходимо организовать обмен данными между ними по SPI
CODE
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
rjmp RESET ; Reset Handler
reti;rjmp EXT_INT0 ; IRQ0 Handler
reti;rjmp EXT_INT1 ; IRQ1 Handler
reti;rjmp TIM2_COMP ; Timer2 Compare Handler
reti;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti;rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
reti;rjmp USART_RXC ; USART RX Complete Handler
reti;rjmp USART_UDRE ; UDR Empty Handler
reti;rjmp USART_TXC ; USART TX Complete Handler
reti;rjmp ADC ; ADC Conversion Complete Handler
reti;rjmp EE_RDY ; EEPROM Ready Handler
reti;rjmp ANA_COMP ; Analog Comparator Handler
reti;rjmp TWSI ; Two-wire Serial Interface Handler
reti;rjmp SPM_RDY ; Store Program Memory Ready Han

reset:
ldi r16,(1<<PB3)+(1<<PB5)
out ddrb,r16 ;mosi and sck is output

ldi r16,255
out portd,r16 ;input port (key)

ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16 ;spi enableand, spi int. enable, master mode


ldi r16,high(RAMEND)
out SPH,r16 ;Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
sei ;Enable interrupts

main:
rjmp main ;Main program start

SPI_STC:
ldi r16,(1<<mstr)
out spcr,r16 ;master mode

in r16,pind ;read keyport
out spdr,r16 ;spi data transmitter write
reti


и программа slave:

CODE
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
rjmp RESET ; Reset Handler
reti;rjmp EXT_INT0 ; IRQ0 Handler
reti;rjmp EXT_INT1 ; IRQ1 Handler
reti;rjmp TIM2_COMP ; Timer2 Compare Handler
reti;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti;rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
reti;rjmp USART_RXC ; USART RX Complete Handler
reti;rjmp USART_UDRE ; UDR Empty Handler
reti;rjmp USART_TXC ; USART TX Complete Handler
reti;rjmp ADC ; ADC Conversion Complete Handler
reti;rjmp EE_RDY ; EEPROM Ready Handler
reti;rjmp ANA_COMP ; Analog Comparator Handler
reti;rjmp TWSI ; Two-wire Serial Interface Handler
reti;rjmp SPM_RDY ; Store Program Memory Ready Han

reset:
ldi r16,(1<<pb4)
out ddrb,r16 ;miso is out

ldi r16,255
out ddrd,r16 ;output port (led)

ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi enableand spi int. enable


ldi r16,high(RAMEND)
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
sei ; Enable interrupts

main:
rjmp main ; Main program start

SPI_STC:
in r16,spdr
out portb,r16
reti


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


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 12)
Злодей
сообщение Nov 4 2009, 23:06
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Перывания SPI Transfer Complete не происходит, поскольку Transfer-а не было... Сделайте первую передачу после инициализации.

Мастер
Код
reset:
;...
sei;Enable interrupts

call SPI_STC;           <-- как-то так

main:
rjmp main;Main program start

SPI_STC:
ldi r16,(1<<mstr)
out spcr,r16;master mode

in r16,pind;read keyport
out spdr,r16;spi data transmitter write
reti;
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 5 2009, 03:58
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



вставил. результат тот же.
еще в обработчике вместо

SPI_STC:
ldi r16,(1<<mstr)
out spcr,r16 ;master mode

вставил
SPI_STC:
ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16;master mode

на шинах появились данные и синхронизация
УРА!!! передатчик работает!

а приемник нет.
аналогично добавил в обработчик приемника

SPI_STC:
ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi enableand spi int. enable
in r16,spdr
out portb,r16
reti

а он все то же. и судя по симуляции он в прерывание вообще не заходит.
и еще... протеус сообщил у мастера write collision. мне кажется это со вставленным rcall SPI_STC связано...


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 5 2009, 05:38
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



А чипселект-то мастер дергает? SS называется в интерфейсе SPI. Он автоматом вроде как не обслуживается, самому надо!
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 5 2009, 05:46
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



а в какой момент (в программе) мастер должен им дергать?


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
arttab
сообщение Nov 5 2009, 06:02
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



то ли мне не поглазам: где выдача данных от слейва?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 5 2009, 06:55
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Цитата(skef @ Nov 5 2009, 15:46) *
а в какой момент (в программе) мастер должен им дергать?

Перед посылкой мастер должен установить SS в 0 и не отпускать до окончания сеанса обмена. Я связку двух процев не использовал, а проц-флэш,модем и пр. периферия - очень много. В инструкции к периферии временные диаграммы всегда расписаны.
Да, и нужно помнить, что обменом всегда управляет мастер, т.е. он при приеме данных всегда посылает в spdr пустые данные, чтобы выдавался тактирующий сигнал.

Сообщение отредактировал V_G - Nov 5 2009, 06:58
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 5 2009, 08:37
Сообщение #8


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



дописал

ldi r16,(1<<PB3)+(1<<PB5)+(1<<PB2)
out ddrb,r16 ;mosi, SS and sck is output

ldi r16,(0<<PB2)
out portb,r16 ;записать в SS 0,

результаты те же.

обмен данными пока односторонний, от slave ничего не идет.


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
V_G
сообщение Nov 5 2009, 08:58
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 818
Регистрация: 15-10-09
Из: Владивосток
Пользователь №: 52 955



Ножки SS у мастера и слейва, надеюсь, соединены?
А по ресету и вне обмена SS=1 ?
Можете ли отловить прерывание от приема данных в слейве?
А после перевода слейва в передачу тактируете ли ее мастером?

При тактировании мастером прерывание по приему данных должно возникнуть вне зависимости от того, послал слейв что-то, или нет. Просто приняты будут все нули или все единицы (в каком состоянии нога MISO).

Сообщение отредактировал V_G - Nov 5 2009, 09:00
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 5 2009, 16:28
Сообщение #10


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



похоже слэйв в прерывание не входит.
в мастере в главном цикле заносится 1 в SS.


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
Злодей
сообщение Nov 5 2009, 18:49
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 149
Регистрация: 29-04-08
Из: Петербург
Пользователь №: 37 142



Прикрепите, пожалуйста, проект.
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 6 2009, 03:51
Сообщение #12


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



вот... пока так.
Прикрепленные файлы
Прикрепленный файл  SPI.rar ( 137.75 килобайт ) Кол-во скачиваний: 19
Прикрепленный файл  SPI.rar ( 137.75 килобайт ) Кол-во скачиваний: 22
 


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post
skef
сообщение Nov 6 2009, 10:48
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 85
Регистрация: 29-10-09
Из: брежнев
Пользователь №: 53 292



и снова переписано...
мастер:
CODE
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
rjmp RESET ; Reset Handler
reti;rjmp EXT_INT0 ; IRQ0 Handler
reti;rjmp EXT_INT1 ; IRQ1 Handler
reti;rjmp TIM2_COMP ; Timer2 Compare Handler
reti;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti;rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
reti;rjmp USART_RXC ; USART RX Complete Handler
reti;rjmp USART_UDRE ; UDR Empty Handler
reti;rjmp USART_TXC ; USART TX Complete Handler
reti;rjmp ADC ; ADC Conversion Complete Handler
reti;rjmp EE_RDY ; EEPROM Ready Handler
reti;rjmp ANA_COMP ; Analog Comparator Handler
reti;rjmp TWSI ; Two-wire Serial Interface Handler
reti;rjmp SPM_RDY ; Store Program Memory Ready Han

reset:
ldi r16,(1<<PB3)+(1<<PB5)+(1<<PB2)
out ddrb,r16 ;mosi, SS and sck is output

ldi r16,(1<<PB2)
out portb,r16

in r16,pind ;read keyport
out spdr,r16 ;spi data transmitter write

ldi r16,255
out portd,r16 ;input port (key) with pull-up res

ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16 ;spi enableand, spi int. enable, master mode


ldi r16,high(RAMEND)
out SPH,r16 ;Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
sei ;Enable interrupts

rcall SPI_STC;

main:
inc r17
cpi r17,255
breq spi_transmit
rjmp main ;Main program start

SPI_STC:


ldi r16,(1<<spie)+(1<<spe)+(1<<mstr)
out spcr,r16 ;master mode

reti


spi_transmit:

in r16,pind ;read keyport
out spdr,r16 ;spi data transmitter write

ldi r16,(0<<PB2)
out portb,r16 ;ss pin->0
rjmp main


и слэйв:
CODE
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m8def.inc"
rjmp RESET ; Reset Handler
reti;rjmp EXT_INT0 ; IRQ0 Handler
reti;rjmp EXT_INT1 ; IRQ1 Handler
reti;rjmp TIM2_COMP ; Timer2 Compare Handler
reti;rjmp TIM2_OVF ; Timer2 Overflow Handler
reti;rjmp TIM1_CAPT ; Timer1 Capture Handler
reti;rjmp TIM1_COMPA ; Timer1 CompareA Handler
reti;rjmp TIM1_COMPB ; Timer1 CompareB Handler
reti;rjmp TIM1_OVF ; Timer1 Overflow Handler
reti;rjmp TIM0_OVF ; Timer0 Overflow Handler
rjmp SPI_STC ; SPI Transfer Complete Handler
reti;rjmp USART_RXC ; USART RX Complete Handler
reti;rjmp USART_UDRE ; UDR Empty Handler
reti;rjmp USART_TXC ; USART TX Complete Handler
reti;rjmp ADC ; ADC Conversion Complete Handler
reti;rjmp EE_RDY ; EEPROM Ready Handler
reti;rjmp ANA_COMP ; Analog Comparator Handler
reti;rjmp TWSI ; Two-wire Serial Interface Handler
reti;rjmp SPM_RDY ; Store Program Memory Ready Han

reset:
ldi r16,(1<<pb4)
out ddrb,r16 ;miso is out

ldi r16,(1<<pb2)
out portb,r16 ;pull-up for ss

ldi r16,255
out ddrd,r16 ;output port (led)

ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi enable and spi int. enable


ldi r16,high(RAMEND)
out SPH,r16 ; Set Stack Pointer to top of RAM
ldi r16,low(RAMEND)
out SPL,r16
sei ; Enable interrupts

main:
rjmp main ; Main program loop

SPI_STC:

in r16,spdr ;read data register
out portd,r16 ;and out to led port

ldi r16,(1<<spie)+(1<<spe)
out spcr,r16 ;spi enableand and spi int. enable

reti


вроде все работает...
однако случается что в мастере что-то происходит, протеус про data collision сообщает...


--------------------
на любой элемент найдется мощность, которая его сожжет.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 10:38
Рейтинг@Mail.ru


Страница сгенерированна за 0.01518 секунд с 7
ELECTRONIX ©2004-2016