Serg
28.05.2017
06:33:22
Можно вводить задержки на стороне STM32 между отправкой/приемом байтов. Но это снижает скорость обмена.
Уже думаю над асинхронным протоколом, чтобы на каждый отправленный байт STM32 ждал подтверждения приема этого байта в виде ответного байта со стороны STM8S
Ivan Nets
28.05.2017
06:36:21
DarkNet - блог о темной стороне интеренета. @darknets
ОлегЪ
28.05.2017
06:51:24
Google
ОлегЪ
28.05.2017
06:53:37
LexsZero
28.05.2017
06:56:03
ОлегЪ
28.05.2017
06:59:59
Он ужасен, медленный ппц
Serg
28.05.2017
07:00:20
ОлегЪ
28.05.2017
07:00:48
Во всяком случае дисплей 20*4 пересовать на 100кГц занимает больше секунды
Serg
28.05.2017
07:01:48
дисплей да, у меня со слейвами обмен запрос/ответ, максимум 128 байт что запрос что ответ
ОлегЪ
28.05.2017
07:02:36
Serg
28.05.2017
07:03:33
но гарантированно примет, а сейчас мастер отправил и ждет от слейва ответа. А слейв может не успеть принять и ничего не ответит
LexsZero
28.05.2017
07:03:39
https://stackoverflow.com/questions/24862372/i2c-slave-clock-stretching
ОлегЪ
28.05.2017
07:04:40
Serg
28.05.2017
07:05:25
хорошо - гарантированно успеет принять в буфер в программе
Google
LexsZero
28.05.2017
07:05:31
в стмовском и2ц это реализовано прижиманием scl пока не отработает прерывание
Serg
28.05.2017
07:05:36
а не в буфер самого SPI
ОлегЪ
28.05.2017
07:05:52
сделай паузы между отправками, на частоту передачи это не повлияет (клок), но даст времени для обработки
Serg
28.05.2017
07:06:19
какие паузы? один слейв быстрее, другой медленнее
LexsZero
28.05.2017
07:06:27
ОлегЪ
28.05.2017
07:06:28
Serg
28.05.2017
07:06:39
подстраивать паузы под самый медленный?
LexsZero
28.05.2017
07:07:05
Serg
28.05.2017
07:07:11
STM8S003 - нет
LexsZero
28.05.2017
07:07:20
если общаешься с обоими сразу - то под самый медленный, да
в линуксе например частота клока для каждого слейва отдельно задается
ОлегЪ
28.05.2017
07:08:07
Вижу два решения, или паузы, или камень быстрей. Третьего решения совсем не вижу
Serg
28.05.2017
07:08:15
ну как вариант можно заложить значение паузы в настройки обмена с конкретным слейвом
но как-то ненадежно выглядит
мастер отправил байт к примеру 0x47 и до отправки следующегшо байта ждет от слейва 0x47
ОлегЪ
28.05.2017
07:09:33
Даже если взять в пример пеку, вроде мощный проц, но я умудрялся челу подвесить пк просто отправляя данные по уарт на 115200 без пауз
LexsZero
28.05.2017
07:09:54
Serg
28.05.2017
07:10:09
ну а паузы тоже уменьшат
LexsZero
28.05.2017
07:10:24
Google
ОлегЪ
28.05.2017
07:10:39
LexsZero
28.05.2017
07:11:04
там и асинхронность, и подтверждения.
Serg
28.05.2017
07:11:15
слейв примет байт и отправил такой же в качестве подтверждения
ОлегЪ
28.05.2017
07:12:08
LexsZero
28.05.2017
07:12:42
Serg
28.05.2017
07:13:33
уже сделано под SPI, I2C придется программный лепить
ОлегЪ
28.05.2017
07:13:52
Что за данные, требующие большой скорости?
LexsZero
28.05.2017
07:16:47
Serg
28.05.2017
07:16:52
много слейвов и нужно их как можно чаще оправшивать
ОлегЪ
28.05.2017
07:17:37
Serg
28.05.2017
07:17:42
есть
SPI же заложен
ОлегЪ
28.05.2017
07:18:30
У каждого слэйва свой cs подведен?
Serg
28.05.2017
07:18:46
да
LexsZero
28.05.2017
07:19:01
можно его для подтверждения и юзать. мастер конфигурит свои выходы как опенколлектор, а слейвы для подтверждения его перетягивают.
но это тоже пиздец наркомания.
Serg
28.05.2017
07:19:54
так это же нарушит работу SPI, CS там же что-то аппаратно включает
LexsZero
28.05.2017
07:20:24
нет
то есть, не обязательно
Google
LexsZero
28.05.2017
07:20:43
можно смуксить его как гпио и дергать руками как угодно
Serg
28.05.2017
07:21:07
там а зачем он тогда вообще нужен?
для SPI
ОлегЪ
28.05.2017
07:21:22
Я бы сначала отправил команду на подготовку данных всем слейвам по кругу, потом опятт по байту для чтения, чтоб самый медленый за это время успел. Если не заработает, то или клок уменьшатт или паузы ставить
LexsZero
28.05.2017
07:21:38
чтоб слейв понимал что та болтовня что щас идет на MOSI/SCK - это для него
Serg
28.05.2017
07:21:41
тоже вариант
пока заложу в настройки каждого слейва клок и значения пауз
LexsZero
28.05.2017
07:22:57
это "понимание" можно сделать как хардварно (замуксив ногу на контроллер SPI), либо софтварно (замуксив как гпио, и например включая спи в хендлере прерывания его дрыганья)
Serg
28.05.2017
07:23:05
но паузы работают только при стабильной загрузке слейва, чуть слейв чем то больше занят - и пойдут ошибки опроса
"замуксив ногу на контроллер SPI"
расшифруй
ОлегЪ
28.05.2017
07:23:52
LexsZero
28.05.2017
07:24:56
Serg
28.05.2017
07:25:28
Т.е. начинаем работу как обычно, мастер прижимает слейв к земле, отправляет первый байт и переводит cs в режим входа с подтяжкой к земле и ждет пока слейв вход не дернет в высокий уровень
LexsZero
28.05.2017
07:26:32
Serg
28.05.2017
07:27:19
А вот в момент когда слейв дернет в высокий уровень, SPI самого слейва не посчитает что работа закончена и что-то там выключит?
ОлегЪ
28.05.2017
07:28:03
LexsZero
28.05.2017
07:28:27
а тебе точно-точно надо подтверждать прям каждый байт? потому что у меня когда-то стмка (32f1) без особых проблем принимала посылки в десяток-сотню байт на 10мгц и не давилась.
777Andrej
28.05.2017
07:29:13
без стикеров, непрошенной рекламы и игр в русский форум
оформляйте вопрос в одно сообщение
вопросы со словом «кто» игнорируются
don't ask for ask
интересно. сколько ещё будете обсуждать одно и тоже?
Serg
28.05.2017
07:29:54
32f1 на какой частоте работала?
Google
Serg
28.05.2017
07:30:45
у STM8S - 16 МГц
LexsZero
28.05.2017
07:31:09
24мгц
в даташите stm32f1 написано что частота клока в слейв моде может быть до 12мгц
то есть если слать сплошным потоком - это ~600нс на байт
interrupt latency у cortex-m3 - 12 циклов на входе, 12 на выходе, это ~1мкс. то есть на максимальной скорости оно работать на прерываниях не должно и не будет, но с дма тупо сложить в память можно успеть.
а лучше конечно уменьшить частоту на порядок.
Serg
28.05.2017
07:45:24
LexsZero
28.05.2017
07:46:39
сделать *buf++ = SPI_DR не успевает? что-то я с трудом верю.
Danil
28.05.2017
07:48:55
написал уже давно про твои грабли с опросом слейвов по SPI
Serg
28.05.2017
07:53:33
Данил, спасибо за развернутый ответ. Но ты пишешь в общем, а дъявол в деталях.
Danil
28.05.2017
07:53:41
всё едят этот кактус, только каждый по своему
вариант #1 - нужен ещё 1 провод от слейва до мастера по которому будешь сигналить, что ответ готов
Serg
28.05.2017
07:54:35
"Стандартное решение #1: дополнительный провод от слейва к мастеру для сигнала готовности данных. "
СS в этом качестве можно использовать или собьет механизм работы SPI слейва?
777Andrej
28.05.2017
07:55:13
Danil
28.05.2017
07:55:30
вариант #2 - отправил пакет на слейв и ждёшь гарантированное время, за которое самый тупой слейв все обработает и подготовит ответ. после этого сливаешь пакет со слейва в мастер
вариант #3 постоянно анализировать что выдает слейв в момент передачи байта - если там не сигнал "все готово" то опрашиваем дальше. Но это будет работать только если сделаешь некий командный протокол поверх SPI
Serg
28.05.2017
07:57:24
слейв принимает мусор если быстро сыпется от мастера
в итоге слейв не видит запроса
Danil
28.05.2017
07:58:29
Короче, я всё. Я пытался объяснить уже по всякому, но ты не въезжаешь в SPI пока
В анаохию, рравда
Serg
28.05.2017
07:59:25
ты не отвечаешь на конкретные вопросы, а излагаешь теорию
LexsZero
28.05.2017
08:00:47
Serg
28.05.2017
08:01:20
не смотрел
LexsZero
28.05.2017
08:03:14
какая вообще частота, интервалы между байтами и объемы данных? может ты хочешь невозможного, или можно вообще не гнаться за скоростью.