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

 
 
> Проблемы с SPI
DareDevil
сообщение Jul 11 2011, 19:29
Сообщение #1





Группа: Новичок
Сообщений: 4
Регистрация: 11-07-11
Пользователь №: 66 175



Здравствуйте. Опыт работы с микроконтроллерами 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)) ;
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Jul 11 2011, 20:25
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(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);


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
DareDevil
сообщение Jul 12 2011, 05:23
Сообщение #3





Группа: Новичок
Сообщений: 4
Регистрация: 11-07-11
Пользователь №: 66 175





Цитата
Чтоб не путаться, напишите функцию приёма и передачи байта, типа такой:
Код
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?

Сообщение отредактировал DareDevil - Jul 12 2011, 05:24
Go to the top of the page
 
+Quote Post



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

 


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


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