15-SPI_LoLevel-Library (STM32F4)

-diese Library dient zum benutzen der SPI-Schnittstelle im Master-Mode

-die SPI-Pins die benutzt werden sollen, müssen im C-File eingetragen werden
(im H-File kann der Clock-Vorteiler gewählt werden)

-die Library kann als LoLevel-Funktion nur die Schnittstelle (in einem der 4 SPI-Modes) initialisieren und ein Byte per SPI senden/empfangen. Das setzen der ChipSelect-Leitung muss von der Übergeordneten Funktion gemacht werden (siehe z.B. MAX5250-Lib)

-es gibt 3 identische Librarys, getrennt für SPI1, SPI2 und SPI3

-im Beispiel wurde SPI2 benutzt mit dieser Pinbelegung :

1
2
3
SCK an PB13
MOSI an PB15
MISO an PB14

Voraussetzungen :

1
2
Benutzte Module der CooCox-IDE : GPIO, SPI
Benutzte Librarys : keine

Enumerationen (für SPI1) :

1
2
3
4
5
6
typedef enum {
  SPI_MODE_0 = 0,  // CPOL=0, CPHA=0
  SPI_MODE_1,      // CPOL=0, CPHA=1
  SPI_MODE_2,      // CPOL=1, CPHA=0
  SPI_MODE_3       // CPOL=1, CPHA=1 
}SPI1_Mode_t;

Funktionen (für SPI1) :

1
2
ErrorStatus UB_SPI1_Init(SPI1_Mode_t mode); // zum initialisieren der SPI-Schnittstelle
uint8_t UB_SPI1_SendByte(uint8_t wert);     // zum senden/empfangen eines Bytes

Beispiel :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//--------------------------------------------------------------
// File     : main.c
// Datum    : 04.03.2013
// Version  : 1.0
// Autor    : UB
// EMail    : mc-4u(@)t-online.de
// Web      : www.mikrocontroller-4u.de
// CPU      : STM32F4
// IDE      : CooCox CoIDE 1.7.0
// Module   : CMSIS_BOOT, M4_CMSIS_CORE
// Funktion : Demo der SPI-LoLevel-Library
// Hinweis  : Diese zwei Files muessen auf 8MHz stehen
//              "cmsis_boot/stm32f4xx.h"
//              "cmsis_boot/system_stm32f4xx.c"
//--------------------------------------------------------------
 
#include "main.h"
#include "stm32_ub_spi2.h"
 
//--------------------------------------------------------------
// ein Byte per SPI senden und empfangen
//--------------------------------------------------------------
uint8_t spi_send(uint8_t wert)
{
  uint8_t ret_wert;
 
  // hier Code einfügen und
  // ChipSelect-Pin auf LO legen
 
  // byte senden und empfangen
  ret_wert=UB_SPI2_SendByte(wert);
 
  // hier Code einfügen und
  // ChipSelect-Pin auf HI legen
 
  return(ret_wert);
}
 
//--------------------------------------------------------------
int main(void)
{
  uint8_t wert;
 
  SystemInit(); // Quarz Einstellungen aktivieren
 
  // SPI2 im Mode0 initialisieren
  UB_SPI2_Init(SPI_MODE_0);
 
  // den Wert 0x45 per SPI senden
  // und ein Byte empfangen
  wert=spi_send(0x45);
 
  while(1)
  {
 
  }
}

Hier die Library zum Download :

ub_stm32f4_spi_v100

Hier der komplette CooCox-Projektordner zum Download :

Demo_15_SPI_LoLevel

16 Antworten auf 15-SPI_LoLevel-Library (STM32F4)

  1. Tobias sagt:

    Hallo,

    ich wollte nur Danke sagen- Deine Beispiele sind super! Sie ermöglichen für mbed/Arduino Umsteiger einen leichte(ren)n Einstieg.

    Ich versuche mich mal mit nRF24-Sensor und SPI display… mal gespannt ob es klappt!

    • admin_ub sagt:

      Danke für das Lob…sag bescheid falls es Probleme gibt (und auch wenn es funktioniert :-)

  2. Cortex-Einsteiger sagt:

    Im C-File in der Lib für SPI1 ist ein Fehler bei der Pinzuweisung. Es muss so heißen:

    {GPIOA,GPIO_Pin_5,RCC_AHB1Periph_GPIOA,GPIO_PinSource5}, // SCK an PA5
    {GPIOA,GPIO_Pin_7,RCC_AHB1Periph_GPIOA,GPIO_PinSource7}, // MOSI an PB5
    {GPIOA,GPIO_Pin_6,RCC_AHB1Periph_GPIOA,GPIO_PinSource6}, // MISO an PB4

    • admin_ub sagt:

      das ist kein Fehler, die SPI-Signale können an verschiedene Pins “geroutet” werden…in meinem Beispiel hab ich “PA5, PB5 PB4″ benutzt…du hast “PA5, PA7, PA6″ benutzt …das geht genauso.

      • Cortex-Einsteiger sagt:

        ach Mensch, du hast recht, sorry.
        Nach langer Suche habe ich meinen Fehler gefunden, und aus dem Grund hast du bestimmt auch die anderen Pins verwendet.
        Damit sonst keiner mehr gefrustet sich wundert wieso es nicht funktioniert: Die Pins von PortA 5,6,7 werden bei dem Discovery Board schon verwendet. Man sollte somit unbedingt bei eigener externer Beschaltung aufpassen. Mit den anderen Pins funktioniert es wunderbar.

        • Joerg B. sagt:

          Es muss aber trotzdem mit A 5,6,7 Funktionieren. SPI können X Devices hängen. Brauchen nur alle einen eigenen CS Pin

          • Cortex-Einsteiger sagt:

            Da stimme ich dir im allgemeinen zu, allerdings habe ich hier vor mir den Gegenbeweis, auch wenn ich es mir nicht erklären kann.
            Senden funktioniert, Daten empfangen auch, aber die empfangenen Daten sind kaputt.

            Zum Glück hat man genug andere Peripherie zur Auswahl^^

  3. Joerg B. sagt:

    Hast du den CS Pin des ungenutzten SPI Mitbenutzer auf High gelegt?
    Ansonsten kann es nicht Funktionieren.

  4. gripper sagt:

    Wäre für Hilfe mit dem Chipselect dankbar. Will ihn an Pin PD2 legen, mit folgendem Code.

    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    Mit dem folgenden Code soll er auf high gesetzt werde

    GPIO_SetBits(GPIOD, GPIO_Pin_2);

    und der folgende Code um ihn auf Low zu setzen:

    GPIO_ResetBits(GPIOD, GPIO_Pin_2);

    Aber an PD2 tut sich irgendwie nichts. Ich seh an nem Oszilloskopmit digitalen Eingängen nichts. Die Chipselect Leitung ist dauerhaft Low.

    • admin_ub sagt:

      ist der Clock an ? und Mode_OUT statt AF

      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;

  5. gripper sagt:

    Vielen Dank!
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
    brachte Abhilfe.

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
    hat aber keine Auswirkung. Das ist ja nicht der generelle Clock des SPI Bu, oder?

    • admin_ub sagt:

      nein, das ist der Clock für GPIO-Port-D aber wenn es auch ohne funktioniert, wird dieser schon an einer anderen Stelle im Programm aktiviert.

  6. mahmud ibrahim sagt:

    First of all, thanks for you nice tutorial. keep up the good work.
    Why don’t you make a library for nrf24L01 RF module with STM32??? May be you can create a RF mesh network like RF24 Mesh Network of Arduino.

    • admin_ub sagt:

      because i dont have such a module :-)

      • mahmud ibrahim sagt:

        I apologize,if i hurt you. I didn’t mean too. your libraries for STM32F4 is excellent. I really really appreciate it. Thank you so much for your effort and time for making it so useful.
        I would like to know that, Do you have any plan for creating a library for NRF24L01 and GPS module?

        • admin_ub sagt:

          no problem. its just so that i cant make software without hardware.
          so i need to buy some nrf24 boards but thats not a great deal.
          my focus is at the moment on the osci project…if you want
          to speedup a nrf24 lib perhaps you can donate the hardware costs :-)


Wie hat Dir dieser Artikel gefallen?

1 Stern2 Sterne3 Sterne4 Sterne5 Sterne (Noch keine Bewertungen)
Loading...

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert