Моё устройство работает по запросу (мое устройство слейв). Т.е. от стороннего устройства приходит запрос от 3 до 5(8) байт, я же в ответ должен передать 3801 байт (данные АЦП).
Но отвечаю я не на поступивший в данный момент запрос, а на предыдущий. Сделано с целью чтоб небыло задержек между запросом и ответом. Так как формирование 3801 байт займет неопределенное количество времени.
Принцип работы моего устройства таков:
1) пришел запрос (все 3-5 байт)
1.1 мастер держит некоторое время SSEL в неактивном уровне
2) отправляю сформированный буфер из 3801 байта
3) проверяю равен ли crc8 нулю, предыдущего запроса
4) равен нулю, тогда: по первому биту запроса я определяю (swith(comanda[0])) "чего хочет" мастер и перехожу на нужный обработчик команды. Остальные байты являются параметрами. Там же формирую ответный буфер.
5) если не равен нулю crc8 : заполняю буфер нулями
6) считаю(проверка наверху) crc8 последнего запроса
На рисунке представленна осцилограмма, как должно быть. Верхний - клок. Желтый запрос от мастера. Синий - мой ответ 38001 байт. Серый (который уровнем 1.6 вольт (хотя равен естесно 3.3 - это из памяти)) - SSEL. Получается полудуплекс. Вот как "нормально принять" данные с SPI? - стоит сейчас задача.
Вот примерно так.
Скорость SPI может быть не выше 2 МГц, сейчас 800кило. Период опроса не менее 100 мс.
Что-то нужно еще? добавлю
Сейчас есть возможность загнать чипселект мастера на ЕИНТ0.
Эскизы прикрепленных изображений