www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430F21x2: USCI SPI Clk Problem


Autor: N.Z. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich bin bei der Verarbeitung von meine SPI Kommunikation mit mein F2132 
(wird nicht erkannt von mein IAR 4.11B !!!)
ich hab ein Problem, der ich nicht lösen kann: Der Clock ist völlig 
random!

Als Anhang hab ich ein Screenshot von mein PC Oszilloskop gefügt. Man 
sieht dass die länge ist nicht regulär... was hab ich wohl falsch 
eingestellt?

Hier mein Code:

//******************************************************************************
#include "msp430x21x2.h"

int commUCA(int);

unsigned char MST_Data, SLV_Data;

void main(void)
{
  volatile unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
  BCSCTL3 = LFXT1S_2;            // Select ACLK from VLO (no crystal)
  BCSCTL1 = CALBC1_8MHZ;          // Calibrated range for DCO
  DCOCTL = CALDCO_8MHZ;            // Calibrated tap and modulation
  P1OUT = 0x00;                             // reset outputs
  P1DIR = 0x00;                             // Inputs
  P2OUT = BIT5 | BIT7;            // set to 1 EN & EN2
  P2DIR = BIT5 | BIT7;            // Set dir out (EN & EN2)
  P3OUT = 0x00;                             // Set slave reset
  P3DIR |= 0x00;                            //
  P3SEL |= 0x31;                            // P3.0,4,5 USCI_A0 option select
  UCA0CTL0 |= UCCKPL + UCMSB + UCMST + UCSYNC;  // 3-pin, 8-bit SPI master
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK
  UCA0BR0 |= 0x02;                          // /2(always write something!)
  UCA0BR1 = 0;                              //
  UCA0MCTL = 0;                             // No modulation
  UCA0CTL1 &= ~UCSWRST;                     // **Initialize USCI state machine**
  IE2 |= UCA0RXIE;                          // Enable USCI0 RX interrupt

  for (i = 50; i > 0; i--);                 // Wait for slave to initialize

  MST_Data = 0x55;                          // Initialize data values
  SLV_Data = 0x00;

  for(;;){
  commUCA(MST_Data);                     // Transmit first character
  
  }
}

int commUCA(int TX_Data){

  UCA0TXBUF = TX_Data;
  
  __low_power_mode_0();
  
  return UCA0RXBUF;
  
}

// ISR for Received interrupt
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCIA0RX_ISR(void)
{
  volatile unsigned int i;
  int dummy = 0;
  while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?
  
  dummy = UCA0RXBUF;

  for (i = 3000; i; i--);                     // Add time between transmissions
  dummy++;
  __low_power_mode_off_on_exit();
  
}                                           


Autor: Peter Diener (pdiener) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Damit du das Signal messen kannst, musst du eine viel höhere 
Samplingrate als 250kS/sec. einstellen an deinem Oszilloskop. Die SPI 
Datenrate ist viel zu hoch als dass du sie mit dieser Auflösung messen 
könntest.

  UCA0BR0 |= 0x02;                          // /2(always write 
something!)
  UCA0BR1 = 0;

Hier teilst du den Takt durch 2 und verwendest das als SPI-Takt. 
Versorgt wird das gemäß

  BCSCTL3 = LFXT1S_2;            // Select ACLK from VLO (no crystal)
  UCA0CTL1 |= UCSSEL_2;                     // SMCLK

vom SMCLK.

SMCLK wird versorgt von dem DCO ohne Vorteilung der Frequenz. Der DCO 
läuft nach deiner Einstellung mit 8MHz. (BCSCTL2 = default)

Damit ergibt sich eine Datenrate von 4MBit/sec. auf dem SPI.

Bei einer Abtastung mit 250kS/sec. tritt starkes Aliasing auf und die 
Messergebnisse entsprechen daher nicht der Realität. Für eine 
vernünftige Darstellung musst du mindestens eine Samplingrate von 
40MS/sec am Oszilloskop einstellen.

Grüße,

Peter

Autor: N.Z. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter,
ich hab die Taktfrequenz runter genommen, sodass ich mit mein 
Oszilloskop alles beobachten kann.
Es klappt wunderbar.

Ich hatte schon etwas mit 4MHZ erwartet, aber ich konnte nichts sehen, 
darum habe ich mit der Auflösung gespielt. Und habe diese schreckliche 
Kurven gefunden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.