Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: USART-SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
qwqw
странная вещь:
сконфигурил 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 - вроде как то что мне надо, но почему-то он роли не играет.
АДИКМ
как раз таки TXEPT и играет роль.
если он установлен, то данные ушли и можете пихать следующие.

а насчет того, что у вас поднимается CS - то что данные попали в сдвиговый регистр, еще вовсе не означает что они уже переданы.
rezident
Работая с SPI, управление CSом нужно привязать к приемнику, а не к передатчику. Потому что режим SPI подразумевает обмен данными с одновременной передачей и приемом их. Вот когда после запихивания в буфер передатчика появилось прерывание от приемника (или флаг URXIFGx установился), тогда передатчик точно уже закончил передачу и CS можно деактивировать.
qwqw
2АДИКМ:
по идее да, но я наверное что-то не так понял, не вижу разницы.
2rezident
у меня нет цели сделать сколько-нибудь поленоценный SPI, на приемной стороне мое же устройство на FPGA. Двунаправленная передача мне не нужна, а делать ее толлько из-за этого не стоит.
rezident
Цитата(qwqw @ Mar 27 2007, 15:06) *
у меня нет цели сделать сколько-нибудь поленоценный SPI, на приемной стороне мое же устройство на FPGA. Двунаправленная передача мне не нужна, а делать ее толлько из-за этого не стоит.

А я и не призывал вас делать еще и приемную часть. Я лишь указал на возможность использования прерывания от приемника SPI в качестве маркера окончания передачи.
АДИКМ
смотрите, вот пример. Взято из рабочей библиотеке работы с 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 ;
qwqw
спасибо за пример,
разобрался, заработало.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.