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

 
 
 
Reply to this topicStart new topic
> [MEGA8] Проблема с SPI slave
dW2005
сообщение Nov 16 2016, 07:36
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 4-10-06
Пользователь №: 20 960



Доброго времени суток, возникла необходимость допилить уже существующий девайс на восьмой меге, добавив туда измерение времени с выдачей результата мастеру на ADUC836.
Проблема в том, что постоянно возникают коллизии при записи ответа в SPDR, пробовал добавлять на мастере задержки между отправляемыми байтами - безрезультатно.

Кусок кода мастера (с51) выглядит так:

CODE
set_spi_ss(1);
delay_ms(1);

// signature
cs = 'F';
EA = 0;
SPIDAT = cs;
while(ISPI == 0);
ISPI = 0;
b = SPIDAT;
EA=1;
spi_test[0] = b;
//mode
cs += 5;
EA=0;
SPIDAT = 5;
while(ISPI == 0);
ISPI = 0;
b = SPIDAT;
EA = 1;
spi_test[0] = b;

... (тут остальные байты пакета данных)

set_spi_ss(0);
delay_ms(1);


Код мастера отлажен и работает с данным девайсом (только на передачу), ЦАПом, флешкой. Полярность/фаза у обоих естественно те же самые.

Код slave'a (avrgcc) покамест вообще обрезал до безобразия, убрав запись в буфер/проверку SPCR на коллизии, оставив только "голый" ответ:

CODE
void SPI_SlaveInit(void)
{
DDRB=(1<<PINB4) | (BIT(0)) | (BIT(1)); //MISO as OUTPUT
SPCR=(1<<SPE)|(1<<SPIE); //Enable SPI && interrupt enable bit
SPDR=0x88;
}

ISR (SPI_STC_vect)
{
UCHAR c = SPDR;
SPDR = 0x55; // that's what i'm trying to send back
}



В свое время делал подобный обмен по SPI на 8051-совместимых и STM32, подобных проблем не вылезало sad.gif.
Буду премного благодарен за любой пинок в нужном направлении.
Go to the top of the page
 
+Quote Post
Genadi Zawidowsk...
сообщение Nov 16 2016, 07:50
Сообщение #2


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

Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634



А почему в мастере дожидаетесь передачи не после всех выводов в SPIDAT?
Go to the top of the page
 
+Quote Post
dW2005
сообщение Nov 16 2016, 08:12
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 4-10-06
Пользователь №: 20 960



Цитата(Genadi Zawidowski @ Nov 16 2016, 10:50) *
А почему в мастере дожидаетесь передачи не после всех выводов в SPIDAT?


В передаче-приеме каждого байта есть ожидание конца передачи вида "SPIDAT = ХХХ; while(ISPI == 0);"
Go to the top of the page
 
+Quote Post
aiwa
сообщение Nov 16 2016, 17:49
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Полярность сигнала SS "наоборот". Проверьте его.
Go to the top of the page
 
+Quote Post
dW2005
сообщение Nov 17 2016, 09:26
Сообщение #5





Группа: Участник
Сообщений: 5
Регистрация: 4-10-06
Пользователь №: 20 960



Цитата(aiwa @ Nov 16 2016, 20:49) *
Полярность сигнала SS "наоборот". Проверьте его.


Полагаю, вас могли ввести в заблуждение аргументы функции set_spi_ss(), но с ними, увы, все хорошо. Это индекс слейвселекта для вывода на МС дешифратора; сейчас их используется 3 штуки.

CODE
void set_spi_ss(unsigned char ss)
{
SPI_SS1 = ss & 0x01;
SPI_SS2 = (ss & 0x02) >> 1;
}
Go to the top of the page
 
+Quote Post
aiwa
сообщение Nov 17 2016, 13:35
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Частота SPI не должна превышать четверть частоты меги.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 17 2016, 15:36
Сообщение #7


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Проверьте соответствие кол-во байт в запросе мастера, и ожидаемое им (мастером) кол-во байт ответа от слейва.
Кроме того, не понял какие могут быть коллизии (не спец по Atmaga) - ведь если речь о шине - то их там не может быть в принципе
(если не мультимастер).
ps
ISR (SPI_STC_vect) - не знаю принцип организации обработки прерываний в Atmega, но
как определяется причина "влета" в вектор ? Что является источником возникновения прерывания.
(пустой регистр передачи, пустой буферный регистр, принятый байт итд ) ?


Сообщение отредактировал k155la3 - Nov 17 2016, 15:42
Go to the top of the page
 
+Quote Post
dW2005
сообщение Nov 17 2016, 17:02
Сообщение #8





Группа: Участник
Сообщений: 5
Регистрация: 4-10-06
Пользователь №: 20 960



В меге SPI interrupt у слейва возникает после приема очередного байта от мастера. Коллизии возникают вида "запись в регистр во время активной передачи данных".
Частота SPI у ADUC'a самая медленная, Fclk/16.

Жаль что до понедельника напрочь отсутствует осциллограф, а вместе с ним и возможность взглянуть поподробнее на творящееся безобразие sad.gif
Go to the top of the page
 
+Quote Post
ivn
сообщение Nov 18 2016, 06:37
Сообщение #9





Группа: Участник
Сообщений: 13
Регистрация: 18-04-05
Пользователь №: 4 250



Попробуйте поменять чип. У меня был случай в готовом у-ве (с мега 644) в режим мастера, когда после перехода MISO в ноль стирался произвольный блок FLASH. После замены все нормально заработало. Наверно было короткое замыкание в кристалле. Правда, это маловероятно, но кто знает.
Go to the top of the page
 
+Quote Post
k155la3
сообщение Nov 18 2016, 07:20
Сообщение #10


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

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(dW2005 @ Nov 17 2016, 20:02) *
(1) В меге SPI interrupt у слейва возникает после приема очередного байта от мастера. Коллизии возникают вида "запись в регистр во время активной передачи данных".
. . . .
(2)Жаль что до понедельника напрочь отсутствует осциллограф, а вместе с ним и возможность взглянуть поподробнее на творящееся безобразие sad.gif

(1) я так понял буферизации нет.
(2) сильно облегчите себе жизнь исползуя лог. анализатор, который позволяет "разобрать" протокол. Посмотрите 2-3 месяца назад была тема по
разбору "полетов" на I2C тут (лог. анализатор) Saleae.
Цена вопроса 15 кваксов - если готовое.
Go to the top of the page
 
+Quote Post
dW2005
сообщение Nov 18 2016, 11:33
Сообщение #11





Группа: Участник
Сообщений: 5
Регистрация: 4-10-06
Пользователь №: 20 960



@ivn ->Чип менять пробовал (есть 2 идентичные платы)

@k155la3 -> 1) буферизация есть, во всяком случае если верить даташиту:

Цитата
The system is single buffered in the transmit direction and double buffered in the receive direction.
This means that bytes to be transmitted cannot be written to the SPI Data Register before
the entire shift cycle is completed. When receiving data, however, a received character must be
read from the SPI Data Register before the next character has been completely shifted in. Otherwise,
the first byte is lost.


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

(2) До прихода 2 недели назад некоего студиозуса для прохождения практики ассортимент всякой измерительно-аналитической техники был побольше. К сожалению сей талантливый индивид за неделю каким-то образом ухайдохал осциллограф цифровой обычный - одна штука, старенький осциллограф-примочка к РС Disco - одна штука и мультиметр - одна штука. Судя по выгоревшему в последнем предохранителю, не обошлось без ~220v.
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Nov 18 2016, 18:47
Сообщение #12


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

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



Вам бы почитать как Mega работает как слейв и Вы бы сразу нашли ошибку


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
aiwa
сообщение Nov 20 2016, 01:12
Сообщение #13


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(dW2005 @ Nov 18 2016, 14:33) *
Другой вопрос что если верить тому же даташиту, можно пихать данные в SPDR даже перед чтением очередного пришедшего байта, на практике этого как-то не видно.

Вообще-то из даташита это не следует: даташит не утверждает про независимость буфера для передачи и буфера-защелки приемника.
Если в прерывании слейв ничего не будет записывать в SPDR, то мастер при каждом последующем обмене будет получать свой предыдущий байт.
Что как бы намекает, что буфер для передачи и второй приемный буфер - один и тот же регистр.
Go to the top of the page
 
+Quote Post
ivn
сообщение Nov 21 2016, 08:52
Сообщение #14





Группа: Участник
Сообщений: 13
Регистрация: 18-04-05
Пользователь №: 4 250



По моему мнению, если с железом все ОК, то ошибка может быть только в отсутствии или недостаточной задержки между байтами при передачи Мастера
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th June 2025 - 04:28
Рейтинг@Mail.ru


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