Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Слишком низкие уровни SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
player999
Здравствуйте, товарищи! Помогите мне и моей молодой команде разобраться с SPI. Мы, вроде, не лвмеры, но столкнулись с неразрешимой проблемой.
Дано:
  • MSP430FG4618/F2013 Experimenter Board(в документации на плату присутствует схема электрическая принципиальная);
  • Необходимость передать данные по SPI с MSP430F2013(master, USI) в MSP430FG4618(slave, USCI);

Суть проблемы:
При замере осциллографом уровней на выходе MasterOut(F2013), они оказываються слишком низкими (1 В), при этом уровни сигнала CLK достаточно высоки (3В). В режиме холостого хода(с разомкнутыми перемычками, которые связывают интерфейсы USI и USCI двух контроллеров ) на выходе микросхемы F2013 уровни нормальные(тоже приблизительно 3В). Почитав доки, товарищ узнал, что для этих микросхем -- уровень переключения с 0 в 1 -- 1,5 В. Т.е. уровень слишком низкий. Прерывания по приему генерируються. В буффере 0.

Хоть мне кажеться, что, возможно, проблема не в коде, но все же:
Программа для F2013
Код
#include <msp430x20x3.h>
#include "intrinsics.h"

// Prototypes
void init_spi(void);
void init_clocking(void);
void send_data(char data);
//EOF Prototypes

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;
      init_spi();
         init_clocking(void);
      __enable_interrupt();
      int i;
        while(1){
          send_data(0xAA);
          for(i=0;i<10000;i++);
        }
}


void init_spi(void){
  USICTL0 = USIPE7 +  USIPE6 + USIPE5 + USIMST + USIOE + USISWRST; // Port, SPI master
// USICTL1 |= USIIE;                     // Counter interrupt, flag remains set
  USICKCTL = USIDIV_7 + USISSEL_2;      // /128 SMCLK
  USICTL0 &= ~USISWRST;
}

void init_clocking(void){
    /* Use the VLOCLK oscillator. This is important. If we leave the unused 32kHz
    oscillator running, its pins will not be free for sensing. */
    BCSCTL3 = LFXT1S_2;
    BCSCTL1 = CALBC1_16MHZ;               /* Set the DCO speed */
    DCOCTL = CALDCO_16MHZ;
    /* We must turn off the low frequency crystal oscillator, as we are using its pins as I/O pins */
    _BIS_SR(OSCOFF);
    return;
}

void send_data(char data){
    USISRL = data;
    USICNT = 8;
    while(!(USICTL1 & USIIFG));  
    return;
}


Программа для FG4618
Код
#include "msp430xG46x.h"
#include "intrinsics.h"

#define ARROWS LCDM11
#define UP 0x10
#define DOWN 0x40

void init_LCD(void);
void init_SPI(void);
__interrupt void SPI_int(void);

char SPI_ARROW;

int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
  SCFQCTL = SCFQ_4M;
  SCFI0 = 0x08;
  FLL_CTL1 |= SELS;
  
  
  init_LCD();
  init_SPI();
  ARROWS = DOWN; //Test
  __enable_interrupt();
  while(1);
}

void init_LCD(void){//Сюда можно не смотреть, это вывод на LCD
  /*Enable peripherial port functionality*/
  P5SEL = BIT2 + BIT3 + BIT4;
  P5DIR = BIT2 + BIT3 + BIT4;

  LCDACTL |= LCDFREQ1;

  LCDACTL |= LCDFREQ0;
  /*4x MUX*/
  LCDACTL|=LCDMX1;
  LCDACTL|=LCDMX0;
  /*LCD segments enabled*/
  LCDACTL|=LCDSON;
  /*Turn LCD on*/
  LCDACTL|=LCDON;
  /*Enable arrows*/
  LCDAPCTL1 = 0x00;
  LCDAPCTL0 = LCDS20;
  /*Charge pump voltage select*/
  LCDAVCTL1 = VLCD0; //2.6V
  LCDAVCTL0 = LCDCPEN;
  LCDM12 = 0x00;
  return;
}

void init_SPI(void){
  //slave SPI
  P3SEL = 0x0E;      // P3.3,2,1 option select
  UCB0CTL1 = UCSWRST;                       // **Put state machine in reset**
  UCB0CTL0 = UCSYNC+UCMSB;          // 3-pin, 8-bit SPI master
  UCB0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCB0RXIE;                          // Enable USCI_B0 RX interrupt
}

#pragma vector = USCIAB0RX_VECTOR
__interrupt void SPI_int(void){
  SPI_ARROW = UCB0RXBUF;
  ARROWS = 0;
  if(SPI_ARROW == 0x00)
    ARROWS = UP;
  else
    ARROWS = DOWN;
  //Clear interrupt flag
  //IFG2&=~UCB0RXIFG;
  return;
}


Буду рад помощи
rezident
Кроме собственно функционала пинов
Код
P3SEL = BIT1| BIT2 | BIT3; //P3.1 - P3.3 - 3-wire SPI, MASTER mode

нужно еще и направление для этого функционала пинов задать: для режима мастер SOMI - вход, SIMO и CLK выходы.
Код
P3DIR = BIT1 | BIT3; //P3.1, P3.3 - output, P3.2 - input

В коде для F2013 вообще нет инициализации функций пинов.
player999
Цитата(rezident @ Apr 1 2011, 10:03) *
Кроме собственно функционала пинов
Код
P3SEL = BIT1| BIT2 | BIT3; //P3.1 - P3.3 - 3-wire SPI, MASTER mode

нужно еще и направление для этого функционала пинов задать: для режима мастер SOMI - вход, SIMO и CLK выходы.
Код
P3DIR = BIT1 | BIT3; //P3.1, P3.3 - output, P3.2 - input

В коде для F2013 вообще нет инициализации функций пинов.


Направление? Где такое написано? Мы как бэ читаем доки sm.gif Есть же интерфейсы и с двугаправленными пинами, I2C например, там что направления постоянно меняют?

По поводу F2013. Там этого делать не нужно по причине USICTL0 = USIPE7 + USIPE6 + USIPE5 + USIMST + USIOE + USISWRS. Тем более передача ведется, я вижу на осциллографе.

Парни из форумов TI предполагают что мы попутали Master и Slave пины. В самом деле там хитрожопая конфигурация джамперов работает только если F2013 -slave, а FG4618 - master и этого нигде не написано! В этом есть рациональное зерно, проверю ближайшими днями.
rezident
Да, признаю. Я перепутал необходимость задания направления. Это необходимо для других многофункциональных пинов (например, при использовании функций таймера). В случае использования USI или USCI этого не требуется.
Насчет пинов входа/выхода SPI. Для модулей USI и USCI имеется отличие. В модуле USI пины SDI и SDO однозначно вход и выход. А в модуле USCI пины UCxSOMI и UCxSIMO могут быть и входами и выходами в зависимости от режима (master/slave) .
player999
Поменял местами пины, все работает sm.gif Загадка еще та, пришлось специальную перемычку на плате делать)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.