-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 :
Hier der komplette CooCox-Projektordner zum Download :
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!
Danke für das Lob…sag bescheid falls es Probleme gibt (und auch wenn es funktioniert
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
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.
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.
Es muss aber trotzdem mit A 5,6,7 Funktionieren. SPI können X Devices hängen. Brauchen nur alle einen eigenen CS Pin
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^^
Hast du den CS Pin des ungenutzten SPI Mitbenutzer auf High gelegt?
Ansonsten kann es nicht Funktionieren.
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.
ist der Clock an ? und Mode_OUT statt AF
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
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?
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.
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.
because i dont have such a module
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?
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