Forum: Mikrocontroller und Digitale Elektronik MSP430F2013 SPI


von Max H. (hartl192)


Lesenswert?

Ich würde gerne ein nRF24L01 mir MSP430F2013 über SPI ansteuern, aber 
leider Funktioniert es nicht :-(
Ich habe den Code, bis auf den SPI Teil von meinem funktionierenden 
Programm für PIC24 übernommen. Leider habe ich noch kaum Erfahrung mit 
MSP430 und deshalb vllt. beim SPI Modul was falsch Initialisiert. Würde 
bitte jemand mal über meine SPI-Routinen drüber sehen:
1
#include "SPI.h"
2
#include <stdlib.h>
3
4
//------------------------------------------------------------------------------
5
void spiInit(void)
6
{
7
  // Configure SPI Pins
8
  P1DIR |= BIT6 | BIT5;   // MOSI (P1.6) and SCK (P1.5) output
9
  P1DIR &= ~BIT7;         // MISO (P1.7) input
10
11
  P1SEL |= BIT5 + BIT6 + BIT7;
12
13
  // USI SPI setup
14
  USICTL0 |= USISWRST;
15
  USICTL1 = USICKPH;                // USICKPH=1 means sampling is done on the
16
                                    // leading edge of the clock
17
18
  USICKCTL = USISSEL_2 | USIDIV_0;  // Clock source = SMCLK/1
19
  USICTL0 = USIPE7 |  // SDI/SDA port enable. Input in SPI mode
20
            USIPE6 |  // SDO/SCL port enable. Output in SPI mode
21
            USIPE5 |  // SCLK port enable. Output in SPI master mode.
22
            USIMST |  // Master mode
23
            USIOE;    // Data output enable
24
25
  USICTL0 &= ~USISWRST;
26
27
  USISR = 0x0000;
28
29
}
30
31
32
//------------------------------------------------------------------------------
33
uint8_t spiByte(uint8_t data)
34
{
35
  USISRL = data;
36
  USICNT = 8;            // Start SPI transfer
37
  while (!(USICTL1 & USIIFG));
38
  return USISRL;
39
}
40
41
42
//------------------------------------------------------------------------------
43
void *spiData(void *data, uint16_t size)
44
{
45
  if(data == NULL)   // Check for NULL pointer
46
    return NULL;
47
48
  uint8_t *data_ptr = data;
49
  while(size--)
50
  {
51
    *data_ptr = spiByte(*data_ptr) & 0xFF;
52
    data_ptr++;
53
  }
54
55
  return data;
56
}
57
58
59
//------------------------------------------------------------------------------
60
void spiWriteData(const void *data, uint16_t size)
61
{
62
  if(data == NULL)   // Check for NULL pointer
63
    return;
64
65
  const uint8_t *data_ptr = data;
66
  while(size--)
67
    spiByte(*data_ptr++);
68
}

Danke.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

TI veröffentlicht funktionierenden Beispielcode für die 
Peripheriemodule der verschiedenen MSP430-Varianten, so auch für Deinen 
'F2013. Deinen Code solltest Du mit diesem Beispielcode vergleichen.

http://www.ti.com/lit/zip/slac080

von Clemens L. (c_l)


Lesenswert?

Max H. schrieb:
> leider Funktioniert es nicht

Vielen Dank für die ausführliche Fehlerbeschreibung.

Daraus kann ich messerscharf schließen, dass du irgendwas falsch 
gemacht hast.

Du könntest uns wenigstens verraten, was du an den Pins gemessen hast.

> vllt. beim SPI Modul was falsch Initialisiert

Schau mal genau hin, wo USISWRST nicht mehr gesetzt ist. Das sollte aber 
keine großen Auswirkungen haben.

von Max H. (hartl192)


Lesenswert?

Rufus Τ. F. schrieb:
> TI veröffentlicht funktionierenden Beispielcode
> http://www.ti.com/lit/zip/slac080
Danke, ich habe den Fehler jetzt gefunden:
Am Ende der spiInit() muss noch ein
1
USICNT = 8;
stehen.

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.