Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
DareDevil
Здравствуйте. Опыт работы с микроконтроллерами MSP430 невелик, посему ищу вашей помощи. Микроконтроллер MSP430F149. Суть задачи в том, чтобы через SPI передать несколько команд (код 24 бита размером), а с гироскопа считать ответ (16-битный). Вроде все настройки SPI прописал, но все равно не работает. Коллега посоветовал ввести 2 переменные ("Beck" и "Ham"), а 24 бита засылать побайтно по очереди. Тем не менее, в ответ с гироскопа я получаю какое-то непотребство. Заранее спасибо. Вот часть кода:


IFG2 &= ~URXIFG1;
while (!(IFG2 & UTXIFG1));

P5OUT &= ~0x20; //CS_LOW
U1TXBUF = 0x94;
U1TXBUF = 0x00;
Beck = U1RXBUF; // переменная номер один
U1TXBUF = 0x00;
while (!(IFG2 & URXIFG1));
Ham = U1RXBUF; // переменная номер два
delay(5000);
U1TXBUF = 0x94;
U1TXBUF = 0x00;
Beck = U1RXBUF;
U1TXBUF = 0x00;
while (!(IFG2 & URXIFG1));
Ham = U1RXBUF;

while (!(U1TCTL&TXEPT)); //CS_HIGH
P5OUT |= 0x20;
delay(5000);
Beck = U1RXBUF;
delay (1500);


P5OUT &= ~0x20; //CS_LOW
U1TXBUF = 0x40;
U1TXBUF = 0x00;
Beck = U1RXBUF;
U1TXBUF = 0x00;
while (!(IFG2 & URXIFG1));
Ham = U1RXBUF;
delay(5000);
while (!(U1TCTL&TXEPT)); //CS_HIGH
P5OUT |= 0x20;

delay (1500);
while ( !( IFG2 & URXIFG1 )) ; // Waiting for URXIFG0
while (!(U1TCTL&TXEPT)) ;
AHTOXA
Цитата(DareDevil @ Jul 12 2011, 01:29) *
U1TXBUF = 0x94;
U1TXBUF = 0x00;


Так нельзя. Отправили байт в U1TXBUF - ждите пока закончится передача этого байта:
Код
while (!(U1TCTL&TXEPT));


Чтоб не путаться, напишите функцию приёма и передачи байта, типа такой:
Код
uint8_t spi_rw(uint8_t out)
{
    U1TXBUF = out;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}


и пользуйтесь ей и для чтения и для записи:
Код
  spi_rw(0x94);
  Beck = spi_rw(0x00);
DareDevil


Цитата
Чтоб не путаться, напишите функцию приёма и передачи байта, типа такой:
Код
uint8_t spi_rw(uint8_t out)
{
    U1TXBUF = out;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}


а как мне прописать посылку именно 3х байтов?

Код
uint8_t spi_rw(uint8_t out)
{
    U1TXBUF = 0x94;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}

uint16_t spi_rw(uint16_t out)
{
    U1TXBUF = 0x00;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}

uint24_t spi_rw(uint24_t out)
{
    U1TXBUF = 0x00;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}


так?

И мне честно говоря не очень ясно насчет функций uint8_t spi_rw и spi_rwю Они прописаны в стандартных библиотеках MSP430?
AHTOXA
Цитата(DareDevil @ Jul 12 2011, 11:23) *
а как мне прописать посылку именно 3х байтов?

Код
spi_rw(1);
spi_rw(2);
spi_rw(3);

Цитата(DareDevil @ Jul 12 2011, 11:23) *
И мне честно говоря не очень ясно насчет функций uint8_t spi_rw и spi_rwю Они прописаны в стандартных библиотеках MSP430?

Нет, это будет ваша, пользовательская функция. Подпрограмма.
ЗЫ. Советую вам почитать какую-нибудь книжку по Си, иначе будет очень трудно. Такие вещи по форумам не учат.
DareDevil
Последовал вашему совету, использовал следующие коды для записи и чтения:

void SPI_Write (unsigned char Code)
{
while (halSPITXREADY ==0);
U1TXBUF = Code;
while (!halSPITXDONE) ;

} //SPI_Transfer (unsigned char Data)

и

unsigned char SPI_Read (void)
{
IFG2 &= ~URXIFG1;
while (halSPITXREADY ==0);
U1TXBUF = 0x00;
while ( !( IFG2 & URXIFG1 )) ;
return( U1RXBUF );
}


Совсем пропал какой-либо отклик от гироскопа в Lab View
AHTOXA
Вроде бы я советовал немножко другое, не? sm.gif

Давайте ещё раз, медленно и по порядку. Добавьте в свой проект перед функцией main() (выше её) вот такую функцию:
Код
unsigned char spi_rw(unsigned char out)
{
    U1TXBUF = out;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}

Эта функция отправляет байт-параметр в SPI и возвращает то, что принято при передаче этого байта.
То есть, чтобы отправить байт 0x94 в SPI, вы пишете в своей программе
spi_rw(0x94);
Чтобы отправить байт 0 в SPI, вы пишете в своей программе
spi_rw(0);
А чтобы прочитать ответ из SPI в переменную Beck, пишете
Beck = spi_rw(0);
Теперь осталось написать правильную последовательность записей/чтений байтов по документации на гироскоп.
rezident
Цитата(AHTOXA @ Jul 13 2011, 11:16) *
Давайте ещё раз, медленно и по порядку. Добавьте в свой проект перед функцией main() (выше её) вот такую функцию:
Код
unsigned char spi_rw(unsigned char out)
{
    U1TXBUF = out;
    while (!(U1TCTL&TXEPT));
    return U1RXBUF;
}

Я бы все же перед записью в U1TXBUF вставил проверку его готовности (бита UTXIFG1). И окончание передачи проверял бы по факту приема в буфер SPI (проверка URXIFG1). Потому как бит TXEPT устанавливается в момент установки на выход сдвигового регистра передатчика последнего бита. Но в этот момент транзакция вовсе не завершена еще.
DareDevil
AHTOXA и rezident, спасибо за советы, сегодня попробую использовать
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.