Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Неустойчивая работа SPI (ATMega8)
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Интерфейсы
Didro
Добрый день,
отлаживаю связь между двумя ATMega8 через SPI (стенд на изображении в прицепе )
Наблюдаю следующую картину:

при тестировании идет в прерывании таймера посылка 2х байт:

Код
void SPI_MasterTransmit(unsigned char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
...

SPI_MasterTransmit(12);
SPI_MasterTransmit(13);


а в Slave прием:
Код
SIGNAL (SPI_STC_vect)
{
spi_input = SPDR;

SPDR = 111; //отсыл в ответ

Spiarr[Spiarc] = spi_input;// читаем принятое в массив
Spiarc = Spiarc + 1;// увеличиваем индекс массива приемника
if (Spiarc == 2) // когда = 2 то анализируем принятый "пакет"
{
Spiarc = 0;

if ((Spiarr[0] == 12)&&(Spiarr[1]==13))
    {
           PORTB ^= (1<<1);//  мигаем если пришло то что отправляли
    }
}

}


светодиод первое время мигает - т.е. принимает данные, но через минут 5 потоковой пересылки, с частотой отправки 1 кГц светодиод гаснет - т.е. данные приняты со сбоем или не приняты.

Ощущение такое что накапливается какаято ошибка в отправке.

Свойственно ли это spi ? Поддерживает ли он потоковую пердачу без ошибок ?
С чем это может быть связано ? Можно SPI вести проводами или это целиком наплатный интерфейс ?

В будущем нужно будет связывать ATMega8 с CAN-контроллером (для выхода на CAN-шину) - планировал разместить их на разных платах и кинуть шлейфом, можно ли так делать ?

Спасибо
rezident
SPI интерфейс синхронный и для длительной устойчивой работы он требует фреймовой синхронизации. Выделение фреймов чаще всего реализуют отдельным управляющим сигналом (CS, SS и т.п.), либо при помощи временных пауз. В последнем случае при детектировании временной паузы SPI-slave делает сброс/реинициализацию своего модуля SPI. SPI-мастер в паузе также сбрасывает свой SPI-модуль.
Дальность работы SPI ограничена качеством (волнового) согласования линий связи и его тактовой частотой. Чем больше расстояние, тем меньше максимальная тактовая частота. Если входы приемника и передатчика SPI имеют раздельные тактовые входы, то тактируя приемник возратным сигналом CLK, соотношение расстояние/частота можно повысить. К сожалению в МК такая конструкция не применяется и возможна лишь при использовании двух портов SPI из которых один работает как мастер только на передачу, а второй как слейв только на прием.
Для межплатных высокоскоростных соединений обычно используются дифференциальные/симметричные интерфейсы типа LVDS. Также для организации дифференциального интерфейса можно использовать распространенные драйверы RS422, RS485.
Для решения ваших проблем нужно как минимум ввести фреймовую синхронизацию.
rx3apf
Цитата(rezident @ Nov 10 2009, 23:48) *
Для решения ваших проблем нужно как минимум ввести фреймовую синхронизацию.

И необходимо обеспечить согласование хотя бы по линиям тактирования и стробирования фрейма. 100-омный резистор последовательно с передатчиком...
Злодей
Цитата(rx3apf @ Nov 11 2009, 01:14) *
И необходимо обеспечить согласование хотя бы по линиям тактирования и стробирования фрейма. 100-омный резистор последовательно с передатчиком...

Видел платку 90х90мм, 100-омные резисторы стояли на всех цифровых дорожках. Тогда проглатил "это от наводок", или какое-то такое объяснение, типа 100-ом резистор ни когда не лишний на цифровых линиях. И вот снова он. Можно, пожалуйста, подробнее про этот резистор.

Извините, пожалуйста, за предыующий топик, я правда так думал.
rezident
Цитата(Злодей @ Nov 12 2009, 04:58) *
Можно, пожалуйста, подробнее про этот резистор.
Обсуждалось уже. Например, там.
Злодей
Ага, значит здесь он нужен для "согласования импеданса". Здоровский у Вас там пост, спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.