сконфигурил 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
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;
#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] }
}
...
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 - вроде как то что мне надо, но почему-то он роли не играет.