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

 
 
> USART-SPI, MSP430F149
qwqw
сообщение Mar 26 2007, 20:26
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



странная вещь:
сконфигурил USART, как SPI мастер, 3-wire:
Код
    // USART(SPI) settings:
    U0CTL = SWRST;
    U0BR0 = 0x08; //0x02 выбор рабочей частоты SPI ,младший байт
    U0BR1 = 0x00; // ... старший байт
    U0TCTL = SSEL0+STC+CKPH+TXEPT; //ACLK, Receive_disabled(3-wire)
    ME1 = USPIE0; // SPI
    U0CTL += CHAR+SYNC+MM; // 8-bit, Master
    U0CTL -= SWRST; // !!! снимаем reset
    IE1 = UTXIE0; // Transmitter INT enable, receiver INT - disabled

хочу еще #CS сигнал рисовать с дополнительной I/O ноги
вот обработчик прер-я:
Код
// USART(SPI) action:
#pragma vector = USART0TX_VECTOR
__interrupt  void USART0_TX_Interrupt (void)
{    
  if (SPI_pocket_CT>0) { // если есть задание
                                    U0TXBUF = SPI_Data[SPI_pocket_CT];
                                    SPI_pocket_CT--;
                                   }
  else
       SPI_nCS = 1;


а вот собственно момент начала пакета в main'e:
Код
...
if (SPI_pocket_CT==0) // если SPI незанят
                                      {
                                        if (SPI_action) // по таймеру
                                                           {
                                                             SPI_action = 0; // очищаем флаг, событие обработано
                                                             SPI_Data[1] = 0x01;
                                                             // ...
                                                             SPI_Data[10] = 0x0A;
                                                             // начало задания SPI
                                                             SPI_nCS = 0;
                                                             SPI_pocket_CT = 9; // кол-во байт для передачи-1
                                                             U0TXBUF = 0x00; //SPI_Data[0]                                                        }
                                      }  
...


Смотрю SPI на осциллографе: при некоторых значениях U0BR0 (скорости передачи) мой CS в конце пакета поднимается когда UCLK еще долбит, тоесть передатчик генерит прерывание, что он готов принимать новое задание, когда последовательная транзакция еще не кончилась.
Вроде логично (нет простоев и все такое), но мне-то нужно отловить именно момент реального окончания передачи.
ЗЫ: в регистре U0TCTL бит TXEPT - вроде как то что мне надо, но почему-то он роли не играет.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 6)
АДИКМ
сообщение Mar 26 2007, 22:03
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



как раз таки TXEPT и играет роль.
если он установлен, то данные ушли и можете пихать следующие.

а насчет того, что у вас поднимается CS - то что данные попали в сдвиговый регистр, еще вовсе не означает что они уже переданы.


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 26 2007, 23:07
Сообщение #3


Гуру
******

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



Работая с SPI, управление CSом нужно привязать к приемнику, а не к передатчику. Потому что режим SPI подразумевает обмен данными с одновременной передачей и приемом их. Вот когда после запихивания в буфер передатчика появилось прерывание от приемника (или флаг URXIFGx установился), тогда передатчик точно уже закончил передачу и CS можно деактивировать.
Go to the top of the page
 
+Quote Post
qwqw
сообщение Mar 27 2007, 12:06
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



2АДИКМ:
по идее да, но я наверное что-то не так понял, не вижу разницы.
2rezident
у меня нет цели сделать сколько-нибудь поленоценный SPI, на приемной стороне мое же устройство на FPGA. Двунаправленная передача мне не нужна, а делать ее толлько из-за этого не стоит.
Go to the top of the page
 
+Quote Post
rezident
сообщение Mar 27 2007, 12:44
Сообщение #5


Гуру
******

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



Цитата(qwqw @ Mar 27 2007, 15:06) *
у меня нет цели сделать сколько-нибудь поленоценный SPI, на приемной стороне мое же устройство на FPGA. Двунаправленная передача мне не нужна, а делать ее толлько из-за этого не стоит.

А я и не призывал вас делать еще и приемную часть. Я лишь указал на возможность использования прерывания от приемника SPI в качестве маркера окончания передачи.
Go to the top of the page
 
+Quote Post
АДИКМ
сообщение Mar 27 2007, 13:17
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 630
Регистрация: 2-08-05
Пользователь №: 7 294



смотрите, вот пример. Взято из рабочей библиотеке работы с M25P80
правда на ассемблере.

wait_tx - это просто макрос

wait_tx macro
bit.b #TXEPT,&U0TCTL ; проверка
jnc $-4 ; ждем
endm


если же Вы вместо моего макроса напишите вот так -
wait_tx
bit.b #UTXIFG0,&IFG1 ;
jz wait_tx ;

то заметите глюки в работе.
Потому что бит UTXIFG0 показывает, что буфер готов к приему следующего байта, а вовсе не завершение процесса передачи данных.
а вот TXEPT показывает что и БУФЕР и СДВИГОВЫЙ регистр пуст.





WRDI
cs_low ;
mov.b #wrsr, &Txbuf ; передаем команду
wait_tx ; ждем
mov.b R15, &Txbuf ; передаем данные
wait_tx ; ждем
cs_high ;
ret ;


--------------------
летаю на пепелаце...
Go to the top of the page
 
+Quote Post
qwqw
сообщение Mar 27 2007, 15:03
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 192
Регистрация: 23-11-05
Из: г. Москва
Пользователь №: 11 307



спасибо за пример,
разобрался, заработало.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 09:44
Рейтинг@Mail.ru


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