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


von N.Z. (Gast)


Angehängte Dateien:

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:
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
}

von Peter D. (pdiener) Benutzerseite


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

von N.Z. (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.