Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: SPI у ATMEGA8515
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Grave711
Доброго времени суток.
Столкнулся с такой проблемой. SPI в режиме slave у ATMEGA8515 почему-то не хочет передавать данные, когда тактовые импульсы с мастера поступают непрерывно, без пауз между байтами.
Если отлаживаю программу на мастере пошагово, т.е. между байтами куча времени, все ок.
Частота SPI 125 кГц и ATMEGA на 8 Мгц все успевает.
Это особенность архитектуры или глюк?
defunct
Цитата(Grave711 @ Jan 13 2006, 14:28) *
Доброго времени суток.
Столкнулся с такой проблемой. SPI в режиме slave у ATMEGA8515 почему-то не хочет передавать данные, когда тактовые импульсы с мастера поступают непрерывно, без пауз между байтами.
Если отлаживаю программу на мастере пошагово, т.е. между байтами куча времени, все ок.
Частота SPI 125 кГц и ATMEGA на 8 Мгц все успевает.
Это особенность архитектуры или глюк?


Особенностью архитектуры это назвать нельзя. Смотрим даташит стр 129: "The SS pin is useful for packet/byte synchronization to keep the Slave bit counter synchronous with the master clock generator." Ключевое слово выделено.

Следовательно, раз никаких особенностей архитектуры нет, имеет место глюк. Природа глюка очень проста: ваша программа (на слейве) не успевает заправлять данными SPI порт. Устранение проблемы:

1. сокращайте время подготовки очередного байта на слейве.
2. делайте паузы между байтами на мастере
by-pass
Очень длительное время обработчка прерываний по приему. По хорошему, надо заранее готовить данные для ответа, а в прерывании только считывать из массива и увеличивать индекс. А вообще, вариантов куча.
IgorKossak
Судя по архитектуре этого интерфейса можно прийти к выводу, что он изначально разрабатывался для взаимодействия интеллектуального мастера (МК) с неинтеллектуальным слейвом (память, часы, ввод\вывод), у которого данные уже готовы сразу перед тем, как их нужно передавать.
Никаких средств квитирования заранее не предусмотрено и даже задержки не гарантируют надёжной передачи информации. В таком случае надо вводить дополнительные линии квитирования, что раздувает интерфейс, либо вводить неоправданно большие задержки, сводящие на нет казалось бы высокую скорость обмена.
В таких случаях (т. е. когда в сети все устройства интеллектуальные) более предпочтительно выглядят UART или I2C, которые несмотря на более низкий битрейт позволяют получить более высокий трафик за счёт оптимизации межбайтовых промежутков и, кроме того имеют меньшее количество линий связи.
Grave711
Огромное всем спасибо, что не прошли мимо и нашли время посоветовать!!!
Программа на атмеге успевает ложить в регистр SPDR данные за один период тактовой частоты SPI.
Зато нащупал в инете такой документ: AVR151. Setup And Use of the SPI. И там написано, что пока идут клоки с мастера по SCK, слейв в регистр на передачу ничего не может положить. По этой причине и не работало. Обидно. Пришлось прерыванием наверх дергать, чтобы ведущий считал данные.
Желаю никому больше не наступать на эти грабли :-)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.