MSP430F21x2: USCI SPI Clk Problem

Gast #1219864
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:
1
//******************************************************************************
2
#include "msp430x21x2.h"
3

4
int commUCA(int);
5

6
unsigned char MST_Data, SLV_Data;
7

8
void main(void)
9
{
10
  volatile unsigned int i;
11

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

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

33
  MST_Data = 0x55;                          // Initialize data values
34
  SLV_Data = 0x00;
35

36
  for(;;){
37
  commUCA(MST_Data);                     // Transmit first character
38
  
39
  }
40
}
41

42
int commUCA(int TX_Data){
43

44
  UCA0TXBUF = TX_Data;
45
  
46
  __low_power_mode_0();
47
  
48
  return UCA0RXBUF;
49
  
50
}
51

52
// ISR for Received interrupt
53
#pragma vector=USCIAB0RX_VECTOR
54
__interrupt void USCIA0RX_ISR(void)
55
{
56
  volatile unsigned int i;
57
  int dummy = 0;
58
  while (!(IFG2 & UCA0TXIFG));              // USCI_A0 TX buffer ready?
59
  
60
  dummy = UCA0RXBUF;
61

62
  for (i = 3000; i; i--);                     // Add time between transmissions
63
  dummy++;
64
  __low_power_mode_off_on_exit();
65
  
66
}
Angehängte Dateien:
Persönliche Seite
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.