Но ведь регистры связанные, при отправке проталкиевается байт и на прием. И если другая сторона ничего не отправила - при приеме будет сначала мусор Если я правильно понимаю Наладил обмен на поллинге между STM32 и STM8S, работает. Но все равно стабильность зависит от медленного устройства, если пригрузить STM8S, уже не успевает обрабатывать. Можно вводить задержки на стороне STM32 между отправкой/приемом байтов. Но это снижает скорость обмена. Уже думаю над асинхронным протоколом, чтобы на каждый отправленный байт STM32 ждал подтверждения приема этого байта в виде ответного байта со стороны STM8S
Комментарии: 39
Anonim
Как правило слейв без определенной команды отправляет или статус или 0xFF Их можно просио игнорировать Так сам спи не медленный, просто не успевает обработаться. Если ввести подтверджение, то только хуже станет
Serg
да, скорость снизится, но гарантированно будет успевать принимать при любой загруженности STM8S
Anonim
Во всяком случае дисплей 20*4 пересовать на 100кГц занимает больше секунды
Anonim
Не в этом дело. У тебя данные и так принимаются в регистр скорей всего. Просто камень не успевает их дальше забрать и обработать между приемами. Если ввести подтверждение, то это еще больше отнимет процерного времени
Serg
но гарантированно примет, а сейчас мастер отправил и ждет от слейва ответа. А слейв может не успеть принять и ничего не ответит
Anonim
Не путай прием с обработкой
Serg
хорошо - гарантированно успеет принять в буфер в программе
Lexszero
в стмовском и2ц это реализовано прижиманием scl пока не отработает прерывание
Serg
а не в буфер самого SPI
Anonim
сделай паузы между отправками, на частоту передачи это не повлияет (клок), но даст времени для обработки
Serg
какие паузы? один слейв быстрее, другой медленнее
Lexszero
дма нету чтоб не возиться с прерываниями?
Anonim
а времени для рабоиы с данными всеравно не останется. Кста, у стм8 есть дма?
Serg
подстраивать паузы под самый медленный?
Lexszero
под тот с которым щас общаешься
Serg
STM8S003 - нет
Lexszero
если общаешься с обоими сразу - то под самый медленный, да в линуксе например частота клока для каждого слейва отдельно задается
Anonim
Вижу два решения, или паузы, или камень быстрей. Третьего решения совсем не вижу
Serg
ну как вариант можно заложить значение паузы в настройки обмена с конкретным слейвом но как-то ненадежно выглядит а вариант с подтверждением приема каждого байта? мастер отправил байт к примеру 0x47 и до отправки следующегшо байта ждет от слейва 0x47
Anonim
Даже если взять в пример пеку, вроде мощный проц, но я умудрялся челу подвесить пк просто отправляя данные по уарт на 115200 без пауз
Lexszero
я умудрялся повесить пеку уровнив пассатижи на клавиатуру
Lexszero
в два раза уменьшает пропускную способность
Serg
ну а паузы тоже уменьшат
Anonim
Слей же не умеет сам говорить, а если ты начнешь клок дергать, то это передача будет
Lexszero
может лучше i2c? там клок стретчинг искаропки есть.
Serg
дисплей да, у меня со слейвами обмен запрос/ответ, максимум 128 байт что запрос что ответ что за клок стретчинг?
Lexszero
слейв может дать понять мастеру что он не успевает пережевывать то что тот шлет https://stackoverflow.com/questions/24862372/i2c-slave-clock-stretching
Danil
Danil: стандартные страдания получение данных по запросу через SPI детектед. Стандартное решение #1: дополнительный провод от слейва к мастеру для сигнала готовности данных. Стандартное решение #2: опрос слейва после таймааута гарантированной готовности данных. Стандартное решение #3: Поллинг слейва на предмет готовности данных. Стандартный вариант #4: Использование другого интерфейса - I2C, UART etc. написал уже давно про твои грабли с опросом слейвов по SPI
Serg
Данил, спасибо за развернутый ответ. Но ты пишешь в общем, а дъявол в деталях.
Danil
всё едят этот кактус, только каждый по своему вариант #1 - нужен ещё 1 провод от слейва до мастера по которому будешь сигналить, что ответ готов
Serg
"Стандартное решение #1: дополнительный провод от слейва к мастеру для сигнала готовности данных. " СS в этом качестве можно использовать или собьет механизм работы SPI слейва?
Anonim
Может в ардуину? Ибо до тебя ещё недели две доходить будет !?
Danil
вариант #2 - отправил пакет на слейв и ждёшь гарантированное время, за которое самый тупой слейв все обработает и подготовит ответ. после этого сливаешь пакет со слейва в мастер вариант #3 постоянно анализировать что выдает слейв в момент передачи байта - если там не сигнал "все готово" то опрашиваем дальше. Но это будет работать только если сделаешь некий командный протокол поверх SPI
Serg
слейв принимает мусор если быстро сыпется от мастера в итоге слейв не видит запроса
Danil
Короче, я всё. Я пытался объяснить уже по всякому, но ты не въезжаешь в SPI пока В анаохию, рравда
Serg
ты не отвечаешь на конкретные вопросы, а излагаешь теорию
Lexszero
какая вообще частота, интервалы между байтами и объемы данных? может ты хочешь невозможного, или можно вообще не гнаться за скоростью. +
Lexszero
ээ так может у тебя приходит мусор? осцилом смотрел?
Serg
не смотрел