|
Пример работы SPI в MSP430F149, совместно с PGA2310 |
|
|
|
Jan 13 2009, 21:38
|
Группа: Новичок
Сообщений: 7
Регистрация: 13-01-09
Пользователь №: 43 325

|
Помогите плиз, мучаюсь с микрухой PGA2310, управляется по SPI, так вот ни одна реализация для MSP430F149 не работает у меня, пришлите код рабочего примера с инициализацией и тупо передачей байтов по SPI. Пожайлуста очень надо!
|
|
|
|
|
 |
Ответов
|
Jan 22 2009, 21:25
|
Группа: Новичок
Сообщений: 7
Регистрация: 13-01-09
Пользователь №: 43 325

|
Нет уарт то точно тот, было бы обидно в этом ошибиться). Я посмотрел цифровым осциллографом вариант без обработки прерываний: данные передаються и тактирующие импульсы тоже имеются, проблема во времени установки и снятия сигнала CS. вот сейчас сигнал снимаеться раньше чем осуществляется передача второго байта коэфициэнтов. И выставляется намного раньше подачи первого тактирующего импульса. Какими должны быть данные временные интервалы между фронтами CS и тактирующими импульсами?
Сообщение отредактировал _AlexMan_ - Jan 22 2009, 21:40
|
|
|
|
|
Jan 22 2009, 22:30
|
Гуру
     
Группа: Свой
Сообщений: 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, но в передатчик ничего уже не пишем.
Эскизы прикрепленных изображений
|
|
|
|
|
Jan 24 2009, 19:08
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jan 24 2009, 20:19
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

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

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

|
Цитата(rezident @ Jan 24 2009, 22:19)  CS дергается программно и я заранее не знаю, может он только что предыдущую запись окончил. А если вдруг тактирование SPI от часового кварца?  Конечно же тогда буфер будет не готов. В общем проверка вовсе не лишняя. Недопонял. Если буфер не готов - идет передача. А мы в это время дергаем 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?  Нет, не забыл. А вот с 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)
|
|
|
|
Сообщений в этой теме
_AlexMan_ Пример работы SPI в MSP430F149 Jan 13 2009, 21:38 korobov_michael Инициализация
Код//структуры для SPI
struct __TX
... Jan 14 2009, 05:22 _AlexMan_ я немного видоизменил, практически ничего совсем, ... Jan 16 2009, 13:39 rezident Цитата(_AlexMan_ @ Jan 16 2009, 18:39) Мо... Jan 16 2009, 14:14 korobov_michael Цитата(_AlexMan_ @ Jan 16 2009, 15:39) я ... Jan 17 2009, 06:43 mikesm Можно вот так попробовать. Написать SPI вручную, н... Jan 16 2009, 14:40 _AlexMan_ Вот исходный текст
CODE#define bitset(var,bitno) ... Jan 16 2009, 21:44 rezident Цитата(_AlexMan_ @ Jan 17 2009, 02:44) вс... Jan 16 2009, 22:02 korobov_michael Цитата(_AlexMan_ @ Jan 16 2009, 23:44) #p... Jan 20 2009, 11:48 _AlexMan_ Исправил все замечания, за них спасибо. Все таки п... Jan 20 2009, 15:55 korobov_michael Цитата(_AlexMan_ @ Jan 20 2009, 17:55) Вс... Jan 20 2009, 19:01 _AlexMan_ аналоговый, но при развертки 1мкс должно же что то... Jan 21 2009, 08:15 rezident Цитата(_AlexMan_ @ Jan 21 2009, 13:15) А ... Jan 21 2009, 08:38 korobov_michael Так, на всякий случай. Посмотри, пожалуйста, с как... Jan 21 2009, 11:31 Kurt пример работы с SPI. тактирование от внешнего квар... Jan 28 2009, 04:51
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|