Технический форум по робототехнике.
Cosworth » 19 июн 2010, 16:03
Доброго времени суток, форумчане! Возникла необходимость подключать внешнюю ПЗУ 25хх, которая работает через SPI. В процессе изучения столкнулся с проблемой - данные от МК уходят нормально, а память по запросу, не зависимо от адреса, возвращает 0xFF, хотя файл прошивки заполнен. Передача начинается по нажатию кнопки вот код:
- Код: Выделить всё • Развернуть
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m48def.inc"
.def tmp=R16
.cseg
.org 0x0000
rjmp Init
.org PCI1addr
rjmp RcvInit
Init:
ldi tmp,(1<<PCINT8)
sts PCMSK1,tmp
ldi tmp,(1<<PCIE1) ;External interrupt presetting
sts PCICR,tmp
clr tmp
out DDRC,tmp
ser tmp
out DDRD,tmp ;PortD for input data dispatching
ldi tmp,0b00101100 ;MOSI,SS,SCK-out, MISO-in
out DDRB,tmp
ldi tmp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)
out SPCR,tmp
sei
Start:
nop
nop
rjmp Start
RcvInit:
ldi tmp,3 ;READ instruction
out SPDR,tmp
SendAddr:
in tmp,SPSR
sbrs tmp,SPIF
rjmp SendAddr ;Waiting for previous transfer complete
in tmp,SPDR
ldi tmp,0x01 ;Read from 0x01
out SPDR,tmp
RcvData:
in tmp,SPSR
sbrs tmp,SPIF ;Waiting for previous transfer complete
rjmp RcvData
in tmp,SPDR
out PORTD,tmp ;Out PortD
reti
Почему может не работать?
На всякий случай приложу проект целиком.
- Вложения
-
Prog.zip
- EEPROM mem.bin + Proteus test.dsn + AVR Studio test.aps
- (34.43 КиБ) Скачиваний: 0
Michael_K » 19 июн 2010, 16:39
вы бы хоть почитали и разобрались, как работает SPI...
Ну вообще же ерунда написана.
Cosworth » 19 июн 2010, 17:42
Michael_K писал(а):вы бы хоть почитали и разобрались, как работает SPI...
Ну вообще же ерунда написана.
Правильно ли я понимаю суть: в ведомом и в ведущем устройстве стоят сдвиговые регистры. При передаче на каждый такт эти регистры обмениваются битом, сдвигаясь влево/вправо (в зависимости от режима). Если я пошлю байт с адресом в память, то данные с этого адреса прийдут только во время следующей посылки? Поправьте если я не прав.
Duhas » 19 июн 2010, 17:46
смысл верный...
вообще это все описывается вроде в ДШ на ИМС
Cosworth » 19 июн 2010, 18:12
Пробую такой алгоритм: Отправить код операции -> Дождаться конца, считать SPDR -> Отправить адрес -> Дождаться конца, считать SPDR -> Отправить заглушку -> Считать ответ ПЗУ -> Вывести в порт. Все равно ерунда. Может я что-то настраиваю неправильно?
- Код: Выделить всё • Развернуть
ldi tmp,(1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<CPOL)
out SPCR,tmp
ldi tmp,0b00101100
out DDRB,tmp
Такой вопрос, если я ставлю MSTR=1, то на чип селекте постоянно 0. Почему во время простоя SPI МК не подтягивает его сам?
Duhas » 19 июн 2010, 18:26
Мк не обязан трогать чип селект.. пин SS он для выбора МК как слейва... чип селект уж сами как нить дергайте )
Michael_K » 19 июн 2010, 18:42
SS на мастере должен быть настроен как выход или подтянут кверху снаружи
(иначе ваш мастер в режим слейва самопроизвольно будет падать).
ногой, которая идет на CS слейва вы должны управлять из своей программы.
Cosworth » 19 июн 2010, 19:52
Michael_K писал(а):SS на мастере должен быть настроен как выход или подтянут кверху снаружи
(иначе ваш мастер в режим слейва самопроизвольно будет падать).
ногой, которая идет на CS слейва вы должны управлять из своей программы.
Спасибо. Похоже все работает, тоесть перед каждой операцией скидываю SS в 0:
- Код: Выделить всё • Развернуть
cbi PORTB,2
ldi tmp,0x03 ;код операции чтения
rcall Snd
ldi tmp,0x00 ;адрес 1
rcall Snd
ldi tmp,0x01 ;адрес 2
rcall Snd
ldi tmp,0x02 ;адрес 3
rcall Snd
sbi PORTB,2
А не работало, потому что протеус как всегда глючит. Перед запуском указываю в настройках ПЗУ файл прошивки, а если во время симуляции открыть инспектор, то там одни FF. Кто-нибудь знает как пофиксить?
--
Сам себе отвечу Debug->Reset presistent model data