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

 
 
 
Reply to this topicStart new topic
> Помогите разобраться с SPI, SPI в микроконтроллере MSP430 F2013
Pit96
сообщение Jun 24 2009, 15:43
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 24-06-09
Пользователь №: 50 613



Всем доброе время суток. Столкнулся с проблемой следующего плана. Мне необходимо используя микроконтроллер MSP430 F2013 послать по SPI на устройство данные следующего вида, в последовательности:
Адрес регистра, старший бит, младший.
При этом второе устройство использует 4-х выводной SPI.
Что я делаю:
CODE

#include <msp430x20x3.h>

void SPI_Transfer (unsigned char addr, unsigned char msb, unsigned char lsb);

initcontroller()
{
WDTCTL = WDTPW + WDTHOLD;

P1DIR = 0x01; //
P1OUT = 0x01; //vkl. svetodiod na P1.0


USICTL0 = USIPE7 | USIPE6 | USIPE5 | USIMST | USIOE; // SPI Master
USICTL1 = USIIE;
USICKCTL = USIDIV_4 + USISSEL_2; // 16SMCLK
USICTL0 &= ~USISWRST; // Release USI from reset
_BIS_SR(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}

void main()
{


initcontroller();
P1OUT=~0x01; // vukl. svetodiod na P1.0
delay(250);
P1DIR = 0x02;
P1OUT = 0x02;// vkl. svetodiod na P1.1
// Svetodiod na P1.1 ne zagoraeca. Vidimo v svyazi s tem, chto ne prohodit inicializaciya SPI

SPI_Transfer(0x30,0x98,0x00);
P1OUT ^= 0x02;
}
// esli vse yspeshno, to svetodio nachnet migat'

void SPI_Transfer (unsigned char addr, unsigned char msb, unsigned char lsb)
{



P1OUT =~ 0x10;
delay(1);
P1OUT = 0x10; // Podat' na ss 1
delay(10);

USISRL = addr; // Write variable value to Shift Register
USICNT = 8;
__low_power_mode_0();


USISRL = msb; // Write variable value to Shift Register
USICNT = 8;
__low_power_mode_0();



USISRL = lsb; // Write variable value to Shift Register
USICNT = 8;
__low_power_mode_0();
}



Почему-то не проходит инициализация SPI. Не загорается светодиод на Р1.1. Далее прога соответственно не идёт. Подскажите пожалуйста, что здесь не правильно.
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 24 2009, 17:30
Сообщение #2


Гуру
******

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



Даже не разбираясь в ошибках инициализации периферии, могу указать на принципиальную ошибку в алгоритме. Если вы собираетесь использовать режимы LPM, то потрудитесь задействовать какое-либо прерывание, чтобы выводить CPU из выбранных вами режимов энергосбережения. Ваша программа "засыпает" в конце функции initcontroller() и ничего не передает, несмотря на то, что вы разрешили глобальные прерывания и прерывания от модуля USI. Обработчика прерывания (функции обработчика прерывания) от передатчика и/или приемника USI-то нету. laughing.gif
Go to the top of the page
 
+Quote Post
Pit96
сообщение Jun 24 2009, 18:51
Сообщение #3





Группа: Новичок
Сообщений: 2
Регистрация: 24-06-09
Пользователь №: 50 613



Правильно ли я понимаю, что не хватает строчек:
Код
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)

Мне не категорично, есть ли спящий режим или нет. Мне важна сама передача по SPI адреса, старшего бита, младшего бита.
Go to the top of the page
 
+Quote Post
=DS=
сообщение Jun 24 2009, 20:19
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 54
Регистрация: 25-09-07
Пользователь №: 30 836



Цитата(Pit96 @ Jun 24 2009, 22:51) *
Мне не категорично, есть ли спящий режим или нет. Мне важна сама передача по SPI адреса, старшего бита, младшего бита.

А вот процессору это "категорично". Он у вас засыпает в конце initcontroller()

ЗЫ: Увидел что вам это уже обьяснили.
тогда так:
закомментируйте строки
_BIS_SR(LPM0_bits + GIE);
__low_power_mode_0();

Если ничего не напутано с инициализцией портов и USART , должно пройти

Сообщение отредактировал =DS= - Jun 24 2009, 20:51
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:28
Рейтинг@Mail.ru


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