Перейти к содержанию
    

Эмуляция SPI при помощи SPORT (Blackfin)

Здравствуйте.

Возникла такая проблема: в системе имеется SPI-устройство (CAN-контроллер MCP2515), подключенное к SPORT1 процессора BF532. Байты по SPI должны передаваться от BF к MCP группами: активизировали сигнал выбора - передали несколько байтов - сняли сигнал выбора. Сигнал выбора для MCP формируется при помощи выхода TFS, настроенного таким образом, что между байтами он не переходит в неактивное состояние, а остается активным до окончания передачи последнего байта.

Для одной группы байтов всё работает чудесно. Если же передаётся подряд без паузы несколько групп, то TFS, естественно, между группами в неактивное состояние не переходит, что неправильно с точки зрения MCP.

Чтобы обеспечить разделение групп байтов сигналом TFS, видится такой способ: перед началом передачи очередной группы дождаться окончания передачи предыдущей. Но вот как это сделать - не соображу. Собственно, вопрос вот в чём: как определить момент окончания передачи последнего байта через SPORT? Бит TXHRE тут не помогает.

Другой вопрос: возможно, есть иной способ выделения группы передаваемых байтов сигналом TFS?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы обеспечить разделение групп байтов сигналом TFS, видится такой способ: перед началом передачи очередной группы дождаться окончания передачи предыдущей. Но вот как это сделать - не соображу. Собственно, вопрос вот в чём: как определить момент окончания передачи последнего байта через SPORT? Бит TXHRE тут не помогает.

Другой вопрос: возможно, есть иной способ выделения группы передаваемых байтов сигналом TFS?

А если передавать группы с помощью DMA? Т.е. зарядили группу - записали в буфер, запустили DMA, по окончании пересылки DMA контроллер сгенерирует прерывание, после чего можно следующую группу заряжать.

 

Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало.

А зачем надо было ждать окончания по таймеру? По окончании приема прерывание возникает, по которому и забирать принятое слово. Что не так?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А если передавать группы с помощью DMA? Т.е. зарядили группу - записали в буфер, запустили DMA, по окончании пересылки DMA контроллер сгенерирует прерывание, после чего можно следующую группу заряжать.

К сожалению, это не работает. DMA формирует прерывание по отправке последнего байта в FIFO SPORT, т.е. за несколько байтов до конца.

Я нашёл такое решение проблемы - может, пригодится кому...

Одновременно с передачей запускаю приём такого же количества байтов, который идёт синхронно с передачей. Принимается, конечно, всякая ерунда, но это не важно. Передача и приём идут через DMA, но прерывание по окончанию обмена формирует именно принимающий канал DMA. Это гарантирует возникновение запроса прерывания после записи последнего принятого байта в память, что несколько позже, чем окончание передачи последнего байта.

Как я потом сообразил, что-то похожее AD в некоторых случаях рекомендуют использовать при работе с "нормальным" SPI.

Благодарю всех, принявших участие в обсуждении моего вопроса.

 

Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало.

Я пару раз использовал SPORT вместо SPI - понравилось :)

Во-первых, 2 канала DMA - на прием и передачу. Во-вторых, мне показалось, что контроллер SPORT более тонко настраивается. И в-третьих, это отдельный контроллер :), т.е. для совершения обмена с каким-либо устройством не нужно ждать окончания обмена с другим. Из недостатков - только отсутствие нескольких сигналов выбора, так что к SPORT удобно цеплять одно устройство.

Тактовые импульсы, как мне показалось, действительно лучше не выключать: на их повторное включение тратится время.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К сожалению, это не работает. DMA формирует прерывание по отправке последнего байта в FIFO SPORT, т.е. за несколько байтов до конца.

Понятно.

 

Я нашёл такое решение проблемы - может, пригодится кому...

Одновременно с передачей запускаю приём такого же количества байтов, который идёт синхронно с передачей. Принимается, конечно, всякая ерунда, но это не важно. Передача и приём идут через DMA, но прерывание по окончанию обмена формирует именно принимающий канал DMA. Это гарантирует возникновение запроса прерывания после записи последнего принятого байта в память, что несколько позже, чем окончание передачи последнего байта.

Можно еще попробовать завести сигнал фреймовой синхры на внешнее прерывание, при условии, что фремовый сигнал работает в режиме чипселекта (т.е. активен в течение всей последовательности). По окончании этого сигнала передача завершена. Правда, тут надо аппаратную доработку + 1 нога из флагов ввода-вывода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Можно еще попробовать завести сигнал фреймовой синхры на внешнее прерывание, при условии, что фремовый сигнал работает в режиме чипселекта (т.е. активен в течение всей последовательности). По окончании этого сигнала передача завершена. Правда, тут надо аппаратную доработку + 1 нога из флагов ввода-вывода.

Да, это, пожалуй, будет более надёжное решение в тех случаях, когда приемник фиксирует бит по переднему фронту синхроимпульса, а передатчик снимает TFS по заднему (что, по-моему, логично). При использовании моего метода на малых скоростях обмена следующая посылка может начаться, когда TFS ещё активен, а последний байт уже принят. Правда, досконально я в этих тонкостях не разбирался, на частоте 10МГц всё работает неплохо и группы байтов разделяются TFS-ом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может, паранойя, но у меня измерения очень точные. Чтобы не создал помеху во время преобразования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...