реклама на сайте
подробности

 
 
2 страниц V  < 1 2  
Reply to this topicStart new topic
> Пример работы SPI в MSP430F149, совместно с PGA2310
rezident
сообщение Jan 22 2009, 22:30
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(_AlexMan_ @ Jan 23 2009, 02:25) *
Какими должны быть данные временные интервалы между фронтами CS и тактирующими импульсами?
Странные вопросы. В даташите же все написано! 90нс и 35нс соответственно.
Алгоритм записи 16 бит должен быть такой.
1. Устанавливаем активный уровень CS.
2. если буфер готов, то "пихаем" первый байт в буфер передатчика SPI.
3. ждем готовности буфера передатчика SPI
4. если буфер готов, то "пихаем" второй байт в буфер передатчика SPI и очищаем флаг готовности буфера приемника SPI
5. ждем установки флага готовности приемника SPI.
6. сбрасываем активный уровень CS
Если используются прерывания, то работаем по прерываниям от приемника SPI. После активации CS первый байт записываем в буфер передатчика SPI. Второй же байт записываем в буфер передатчика уже в прерывании от приемника SPI. После второго попадания в прерывание от приемника SPI сбрасываем активный уровень CS, но в передатчик ничего уже не пишем.
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 24 2009, 19:08
Сообщение #17


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(rezident @ Jan 23 2009, 00:30) *
Алгоритм записи 16 бит должен быть такой.
Несколько вопросов по вашему алгоритму:

1) Как буфер может быть не готов на шаге 2? Мы что, CS дергали во время передачи чего-то предыдущего? Тогда ведомый принял мусор. Мне кажется, эти два шага надо поменять местами. Хотя мусор из ведомого будет вытеснен следующими 16 битами, так что может и не страшно.

2) если на шаге 4 между пиханием байта и очисткой флага произойдет прерывание - данные успеют уйти, мы затрем нужный флаг и на шаге 5 повиснем навечно. Сдается, очистку флага и запихивание в буфер тоже надо поменять местами.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jan 24 2009, 20:19
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Jan 25 2009, 00:08) *
1) Как буфер может быть не готов на шаге 2?
CS дергается программно и я заранее не знаю, может он только что предыдущую запись окончил. А если вдруг тактирование SPI от часового кварца? smile.gif Конечно же тогда буфер будет не готов. В общем проверка вовсе не лишняя.
Цитата(Сергей Борщ @ Jan 25 2009, 00:08) *
2) если на шаге 4 между пиханием байта и очисткой флага произойдет прерывание - данные успеют уйти, мы затрем нужный флаг и на шаге 5 повиснем навечно. Сдается, очистку флага и запихивание в буфер тоже надо поменять местами.
Отнюдь! Это может случиться лишь в том случае, если частота тактирования модуля USART по крайней мере в 8 раз выше MCLK. Очистка флага занимает 5 тактов MCLK, а передача байта не менее 16 тактов, если модуль SPI тактируется такой же частотой (макс. частота тактирования в режиме SPI UCLK/2). Если же будет соотношение частот другое, то мы можем нарваться на тот факт, что мы очистим флаг готовности приемика, но он будет установлен после приема первого байта. А нас-то интересует флаг готовности именно после приема второго байта! Кстати, ты не забыл что в MSP430 SPI 8-ми битный, а не произвольной разрядности как в LPC2000? wink.gif
В общем я бы наверное предпочел использовать прерывания. Там все более определенно. Возникло прерывание от приемника - значит очередная транзакция завершена.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 25 2009, 09:48
Сообщение #19


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(rezident @ Jan 24 2009, 22:19) *
CS дергается программно и я заранее не знаю, может он только что предыдущую запись окончил. А если вдруг тактирование SPI от часового кварца? smile.gif Конечно же тогда буфер будет не готов. В общем проверка вовсе не лишняя.
Недопонял. Если буфер не готов - идет передача. А мы в это время дергаем CS. Ведомый начнет принимать мусор. Почему просто не ждать готовности до дерганья CS?
Цитата(rezident @ Jan 24 2009, 22:19) *
Отнюдь! Это может случиться лишь в том случае, если частота тактирования модуля USART по крайней мере в 8 раз выше MCLK. Очистка флага занимает 5 тактов MCLK, а передача байта не менее 16 тактов,
Между отгрузкой байта в буфер и очисткой флага может быть вызван обработчик прерывания, который может длиться гораздо дольше передачи байта. Выходит, чистить флаг надо перед каждой передачей, и ждать его после каждой передачи. Да, прелести двойного буферирования не используются, но альтернатива - только запрещать прерывания.
Цитата(rezident @ Jan 24 2009, 22:19) *
Если же будет соотношение частот другое, то мы можем нарваться на тот факт, что мы очистим флаг готовности приемика, но он будет установлен после приема первого байта. А нас-то интересует флаг готовности именно после приема второго байта!
О!
Цитата(rezident @ Jan 24 2009, 22:19) *
Кстати, ты не забыл что в MSP430 SPI 8-ми битный, а не произвольной разрядности как в LPC2000? wink.gif
Нет, не забыл. А вот с LPC - по принципу "пустил-забыл". Написал года два назад кусок, он работает и что там творится - уже не помню.
Цитата(rezident @ Jan 24 2009, 22:19) *
В общем я бы наверное предпочел использовать прерывания. Там все более определенно. Возникло прерывание от приемника - значит очередная транзакция завершена.
Тот же фиг - анализируется каждое срабатывание.


Есть альтернатива - если скорость передачи достаточно высока по сравнению с ядром, то флаг можно вообще не анализировать, а просто вставить нужное количество nop-ов после записи. На высоких скоростях это будет даже эффективнее, учитывая накладные на вход в прерывание и выход из него. При максимальной скорости SPI и ядра, учитывая еще время на подготовку очередных данных к отправке, там может получиться всего два-три nop-а. Я так делал на меге, 4 nop-а были выгоднее и по скорости и по размеру кода.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kurt
сообщение Jan 28 2009, 04:51
Сообщение #20


Участник
*

Группа: Свой
Сообщений: 63
Регистрация: 16-06-04
Из: Россия, Уфа
Пользователь №: 31



пример работы с SPI. тактирование от внешнего кварца без использования прерываний
http://kurt.embedders.org/wiki/sources:spi0
может быть, поможет.
Go to the top of the page
 
+Quote Post

2 страниц V  < 1 2
Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 30th July 2025 - 11:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01396 секунд с 7
ELECTRONIX ©2004-2016