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

 
 
 
Reply to this topicStart new topic
> Сигнал выборки в режиме SPI для 2012
KA_ru
сообщение Mar 28 2010, 09:50
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Подскажите как организовать правильно сигнал выборки для ведомого в 2012.
Делаю так засылаю "0" на ножку выборки. Потом засылаю байт в SPI. Поднимаю ножку выборки в "1".
После проверку скопом получаю что сигнал выборки и байт данных не совпадают по времени.
Байт по SPI прошел потом только прошла выборка.
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Mar 28 2010, 10:35
Сообщение #2


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Перд поднятием сигнала выборки надо дождаться завершения передачи, это можно сделать, анализируя TXIFG, либо UCBUSY.
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Mar 28 2010, 12:33
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Странно что эти биты не прописаны в Хедерах.
Да и самих регистров USCI_A тоже нет.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 28 2010, 19:30
Сообщение #4


Гуру
******

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



Цитата(KA_ru @ Mar 28 2010, 18:33) *
Да и самих регистров USCI_A тоже нет.
В MSP430F2012 нет модуля USCI. Там имеется только модуль USI. Отличия их в том, что USCI поддерживает как синхронные (SPI, I2C) так и асинхронные (UART, IRDA) интерфейсы, аналогично модулю USART в предыдущих сериях MSP430 (1xx, 3xx, 4xx) . В то время как модуль USI поддерживает только синхронные - SPI и I2C. Так что jorikdima просто ошибся. Перед тем, как снимать активный уровень CS нужно дождаться установки флага USIIFG в регистре USICTL1, который будет сигнализировать о том, что транзакция/обмен байтом/словом данных завершился. Ну либо считывать значение счетчика бит USICNT, дожидаясь, пока он не обнулится. Хочу напомнить, что SPI это интерфейс для обмена данными. Для того чтобы что-то получить, нужно что-то передать (фиктивная передача при приеме).
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Mar 28 2010, 20:37
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Цитата(rezident @ Mar 28 2010, 22:30) *


Спасибо пока остановился на проверке счетчика.
Помогло но не полностью. Проблема в том что проверку можно сделать после передачи.
А как ее сделать красиво до не понятно. Данные уходят быстрее чем я выборкой счёлкаю.
Пока остановился на таком решении опустил выборку, подождал, проверил, поднял.
Но цикл ожидание после выборки мне не нравиться.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 28 2010, 21:36
Сообщение #6


Гуру
******

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



Альтернативный опросу способ - работать по прерыванию от USI. Только вот непонятно вы по 1 байту/слову передаете или у вас некоторый фрейм (кадр) данных? Есть 1 байт/слово, то почему опрос смущает? Вы же сами пишете, что передача быстрее, чем цикл опроса происходит. Прерывание возможно будет излишним в таком случае, т.к. на обработку прерывания накладные расходы 9+ циклов MCLK.
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Mar 29 2010, 08:17
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Передаю только один байт.

Как оказалось все просто.
Но почему то сразу не получилось. smile.gif smile.gif smile.gif
Вот таким вот кодом времянка получилась ничего.
Только один всплыл баг. Первая посылка имеет 8 синхро, а вот вторая и последующие 12.


вот кусок кода.
Код
   USICTL0 |= USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE; // Port, SPI master
  //USICTL1 |= USIIE;                  // Counter interrupt, flag remains set
  USICTL1 |= USICKPH;
  USICKCTL = USIDIV_2 + USISSEL_2;    // /4 SMCLK
  USICKCTL &= ~USICKPL;
  USICTL0 &= ~USISWRST;                // USI released for operation

   USISRL = buf[count];
  P1OUT &= ~0x02;                   // Enable LTC6912
  USICNT = 0x08;
  while (USICNT);
  //_NOP();
  P1OUT |= 0x02;                    // Desable LTC6912


Сообщение отредактировал KA_ru - Mar 29 2010, 15:12
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Apr 1 2010, 10:08
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Вот это можно занести и в FAQ.
Проверять счетчик USICNT нельзя. Каждая проверка добавляет два синхро импульса.
Проверять нужно только USIIFG.
Код
while (!(USICTL1 & USIIFG))
Go to the top of the page
 
+Quote Post
rezident
сообщение Apr 1 2010, 11:34
Сообщение #9


Гуру
******

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



Цитата(KA_ru @ Apr 1 2010, 16:08) *
Проверять счетчик USICNT нельзя. Каждая проверка добавляет два синхро импульса.
А баг под номером USI5 описанный в Errata разве не этот случай?
Go to the top of the page
 
+Quote Post
KA_ru
сообщение Apr 2 2010, 12:24
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 424
Регистрация: 4-10-04
Из: Berlin
Пользователь №: 775



Цитата(rezident @ Apr 1 2010, 15:34) *
А баг под номером USI5 описанный в Errata разве не этот случай?


Нет не тот!!!
Этот баг добавляет один лишний синхро сигнал при первой посылке.
Если воспользоваться советом TI и заслать в счетчик n-1 данные портятся, смещаются.
Go to the top of the page
 
+Quote Post

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

 


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


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