Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Pit96
Всем доброе время суток. Столкнулся с проблемой следующего плана. Мне необходимо используя микроконтроллер 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. Далее прога соответственно не идёт. Подскажите пожалуйста, что здесь не правильно.
rezident
Даже не разбираясь в ошибках инициализации периферии, могу указать на принципиальную ошибку в алгоритме. Если вы собираетесь использовать режимы LPM, то потрудитесь задействовать какое-либо прерывание, чтобы выводить CPU из выбранных вами режимов энергосбережения. Ваша программа "засыпает" в конце функции initcontroller() и ничего не передает, несмотря на то, что вы разрешили глобальные прерывания и прерывания от модуля USI. Обработчика прерывания (функции обработчика прерывания) от передатчика и/или приемника USI-то нету. laughing.gif
Pit96
Правильно ли я понимаю, что не хватает строчек:
Код
#pragma vector=USI_VECTOR
__interrupt void universal_serial_interface(void)

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

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

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

Если ничего не напутано с инициализцией портов и USART , должно пройти
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.