DPL 0 31 марта, 2007 Опубликовано 31 марта, 2007 · Жалоба Здравствуйте. Возникла такая проблема: в системе имеется SPI-устройство (CAN-контроллер MCP2515), подключенное к SPORT1 процессора BF532. Байты по SPI должны передаваться от BF к MCP группами: активизировали сигнал выбора - передали несколько байтов - сняли сигнал выбора. Сигнал выбора для MCP формируется при помощи выхода TFS, настроенного таким образом, что между байтами он не переходит в неактивное состояние, а остается активным до окончания передачи последнего байта. Для одной группы байтов всё работает чудесно. Если же передаётся подряд без паузы несколько групп, то TFS, естественно, между группами в неактивное состояние не переходит, что неправильно с точки зрения MCP. Чтобы обеспечить разделение групп байтов сигналом TFS, видится такой способ: перед началом передачи очередной группы дождаться окончания передачи предыдущей. Но вот как это сделать - не соображу. Собственно, вопрос вот в чём: как определить момент окончания передачи последнего байта через SPORT? Бит TXHRE тут не помогает. Другой вопрос: возможно, есть иной способ выделения группы передаваемых байтов сигналом TFS? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
K A A 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Чтобы обеспечить разделение групп байтов сигналом TFS, видится такой способ: перед началом передачи очередной группы дождаться окончания передачи предыдущей. Но вот как это сделать - не соображу. Собственно, вопрос вот в чём: как определить момент окончания передачи последнего байта через SPORT? Бит TXHRE тут не помогает. Другой вопрос: возможно, есть иной способ выделения группы передаваемых байтов сигналом TFS? А если передавать группы с помощью DMA? Т.е. зарядили группу - записали в буфер, запустили DMA, по окончании пересылки DMA контроллер сгенерирует прерывание, после чего можно следующую группу заряжать. Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало. А зачем надо было ждать окончания по таймеру? По окончании приема прерывание возникает, по которому и забирать принятое слово. Что не так? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
K A A 0 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Чтобы остановить тактовый сигнал Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 3 апреля, 2007 Опубликовано 3 апреля, 2007 · Жалоба Чтобы остановить тактовый сигнал А зачем его останавливать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DPL 0 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба А если передавать группы с помощью DMA? Т.е. зарядили группу - записали в буфер, запустили DMA, по окончании пересылки DMA контроллер сгенерирует прерывание, после чего можно следующую группу заряжать. К сожалению, это не работает. DMA формирует прерывание по отправке последнего байта в FIFO SPORT, т.е. за несколько байтов до конца. Я нашёл такое решение проблемы - может, пригодится кому... Одновременно с передачей запускаю приём такого же количества байтов, который идёт синхронно с передачей. Принимается, конечно, всякая ерунда, но это не важно. Передача и приём идут через DMA, но прерывание по окончанию обмена формирует именно принимающий канал DMA. Это гарантирует возникновение запроса прерывания после записи последнего принятого байта в память, что несколько позже, чем окончание передачи последнего байта. Как я потом сообразил, что-то похожее AD в некоторых случаях рекомендуют использовать при работе с "нормальным" SPI. Благодарю всех, принявших участие в обсуждении моего вопроса. Я тоже недавно пытался определять момент окончания пересылки данных через SPORT и ничего лучшего не придумал, как тупо ждать по таймеру. Черт дернут прицепить сигма-дельта АЦП с SPI-интерфейсом к SPORTу. Потратил кучу времени, пока все заработало. Я пару раз использовал SPORT вместо SPI - понравилось :) Во-первых, 2 канала DMA - на прием и передачу. Во-вторых, мне показалось, что контроллер SPORT более тонко настраивается. И в-третьих, это отдельный контроллер :), т.е. для совершения обмена с каким-либо устройством не нужно ждать окончания обмена с другим. Из недостатков - только отсутствие нескольких сигналов выбора, так что к SPORT удобно цеплять одно устройство. Тактовые импульсы, как мне показалось, действительно лучше не выключать: на их повторное включение тратится время. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dxp 34 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба К сожалению, это не работает. DMA формирует прерывание по отправке последнего байта в FIFO SPORT, т.е. за несколько байтов до конца. Понятно. Я нашёл такое решение проблемы - может, пригодится кому... Одновременно с передачей запускаю приём такого же количества байтов, который идёт синхронно с передачей. Принимается, конечно, всякая ерунда, но это не важно. Передача и приём идут через DMA, но прерывание по окончанию обмена формирует именно принимающий канал DMA. Это гарантирует возникновение запроса прерывания после записи последнего принятого байта в память, что несколько позже, чем окончание передачи последнего байта. Можно еще попробовать завести сигнал фреймовой синхры на внешнее прерывание, при условии, что фремовый сигнал работает в режиме чипселекта (т.е. активен в течение всей последовательности). По окончании этого сигнала передача завершена. Правда, тут надо аппаратную доработку + 1 нога из флагов ввода-вывода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
DPL 0 4 апреля, 2007 Опубликовано 4 апреля, 2007 · Жалоба Можно еще попробовать завести сигнал фреймовой синхры на внешнее прерывание, при условии, что фремовый сигнал работает в режиме чипселекта (т.е. активен в течение всей последовательности). По окончании этого сигнала передача завершена. Правда, тут надо аппаратную доработку + 1 нога из флагов ввода-вывода. Да, это, пожалуй, будет более надёжное решение в тех случаях, когда приемник фиксирует бит по переднему фронту синхроимпульса, а передатчик снимает TFS по заднему (что, по-моему, логично). При использовании моего метода на малых скоростях обмена следующая посылка может начаться, когда TFS ещё активен, а последний байт уже принят. Правда, досконально я в этих тонкостях не разбирался, на частоте 10МГц всё работает неплохо и группы байтов разделяются TFS-ом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
K A A 0 5 апреля, 2007 Опубликовано 5 апреля, 2007 · Жалоба Может, паранойя, но у меня измерения очень точные. Чтобы не создал помеху во время преобразования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться