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

 
 
 
Reply to this topicStart new topic
> Как сделать SPI Slave устройство на атмега?
inventor
сообщение Jul 16 2012, 17:46
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



проблема такая-на микропроцессоре не хватает свободных ножек, поэтому был сделан расширитель портов на атмега.
ну..чтобы чипселекты выставлять, проверять наличие всяких готовностей и прочего.
прикинул, что плодить навороченный протокол для SPI slave - это достаточно напряжная вешь.
очень навороченным его не сделать-нужно будет тогда снижать скорость обмена по SPI-d даташыте написано что SCLK не можето быть более половины тактовой частоты.
У меня тактовая частота атмеги 8 мегагерц, но и 4 мегагерца - это предел.
я начал писать на C для этого камня (на асме нельзя)
вот что получилось-хочу обращаться к этому камню со стороны основного процессора
так же как к обычному уись..
стройству.
я распределил какие типы команд я могу посылать DDRx PORTx и PINx соответственно протокол такой придумал-
первый байт это команда и к какому порту обращаюсь (PA PB PC итд) второй байт что туда нудно выставить.
то есть еслли m,s команда в атмеге выглядела бы так PORTA = 0x24
я бы паередавал эти два байта-код операции и запись...
то есть понятно что я имел ввиду
в устройстве slave на атмеге сделал прерывание "по окончанию записи байта мастером" - оно вроде так называется и в этом прерывании читаю то что там пришло в SPDR - так вроде SPI регистр называется.
но мне вот что непонятно-для SPI и чтение и запись это одно и тоже.
то есть если я в прерывании прочитал принятый байт - то я как бы уже автоматом должет передать в мастер dummy байт.
или я не прав?
как вот мне реализовать команду a = PINx
то есть чтение порта?
принял я команду и хочу в слеве передать ответ-как мне это правильно сделать?
прошу прощения, я не задавал бы вопрос, если бы у меня было настоящее устройство-я бы просто посидел с дебагером и разобрался-но у меня устройства пока нет, но код предварительный накидать надо.
спасибо!

Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 16 2012, 18:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(inventor @ Jul 16 2012, 20:46) *
даташыте написано что SCLK не можето быть более половины тактовой частоты.
У меня тактовая частота атмеги 8 мегагерц, но и 4 мегагерца - это предел.


В даташите говорится что частота spi не может быть больше половины тактовой в режиме мастера, для slave - 1/4 . Предел - 2 МГц.

Цитата
When the SPI is configured as Slave, the SPI is only guaranteed to work at fosc /4 or
lower.


Цитата(inventor @ Jul 16 2012, 20:46) *
SPI и чтение и запись это одно и тоже.
то есть если я в прерывании прочитал принятый байт - то я как бы уже автоматом должет передать в мастер dummy байт.
или я не прав?

Вы неправы. Чтение - просто чтение.
Передача байта мастером - это запись в SPDR.
Запись slave-ом в SPDR - это эагрузка байта в буфер который будет передан тогда когда мастер протактирует следующий байт.

Цитата(inventor @ Jul 16 2012, 20:46) *
как вот мне реализовать команду a = PINx
то есть чтение порта?
принял я команду и хочу в слеве передать ответ-как мне это правильно сделать?


А в чём тут проблема?

Код
unsigned char SpiState;
unsigned char NewSpiRxByte;
#pragma vector=SPI_STC_vect
__interrupt void SpiIsr()
{
switch (SpiState) {
case 0:// перепад на линии SS
    SpiState++;
    SPDR=PINA;// посылаем PINA в SPI
    break;
case 1:
    NewSpiRxByte=SPDR;// чтение команды
    SPDR=PINB; // посылаем PINB в SPI
    SpiState++;
    break;
case 2:// посылаем ещё что-нибудь
    break;

}
}

Go to the top of the page
 
+Quote Post
inventor
сообщение Jul 16 2012, 18:20
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 524
Регистрация: 25-12-08
Из: Москва
Пользователь №: 42 748



получается что SPDR=PINA
будет передано не в первом кейсе а в последующем
как бы с задержкой..я правильно понял?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Jul 16 2012, 18:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(inventor @ Jul 16 2012, 21:20) *
получается что SPDR=PINA
будет передано не в первом кейсе а в последующем

Вы о моём коде? Кстати, я не написал, что это реализация slave.
Будет передано тогда когда мастер протактирует, то есть может быть и никогда.


Цитата(inventor @ Jul 16 2012, 21:20) *
как бы с задержкой..я правильно понял?

Ну вобщем да, задержка определяется мастером.

P.S.
Поправка. Правильней в моём примере так делать:
Код
SPDR=PINB; // посылаем PINB в SPI
NewSpiRxByte=SPDR;// чтение команды

Сначала посылать, потом читать.
Go to the top of the page
 
+Quote Post
hd44780
сообщение Jul 17 2012, 07:49
Сообщение #5


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

Группа: Свой
Сообщений: 1 202
Регистрация: 26-08-05
Из: Донецк, ДНР
Пользователь №: 7 980



Чтобы мастер знал, что слейв хочет ему что-то передать, надо вводить систему прерываний либо сканировать слейв.


--------------------
Чтобы возить такого пассажира, необходим лимузин другого класса.
(с) Мария Эдуарда
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 06:50
Рейтинг@Mail.ru


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