diese Library dient zum benutzen der SPI-Schnittstelle im Master-Mode
(im Half-Duplex Betrieb)
in diesem Mode wird nur eine Datenleitung benötig (DIO) statt MOSI und MISO
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 8 SPI-Modes) initialisieren und ein Byte per SPI senden/empfangen. Das setzen der ChipSelect-Leitung muss von der Übergeordneten Funktion gemacht werden
es gibt 3 identische Librarys, getrennt für SPI1, SPI2 und SPI3
im Beispiel wurde SPI2 benutzt mit dieser Pinbelegung :
1 2 | SCK an PB13 DIO an PB15 |
Voraussetzungen :
1 2 | Benutzte Module der CooCox-IDE : GPIO, SPI Benutzte Librarys : keine |
Enumerationen (für SPI1) :
1 2 3 4 5 6 7 8 9 10 | typedef enum { SPI_MODE_0_MSB = 0, // CPOL=0, CPHA=0 (MSB-First) SPI_MODE_1_MSB, // CPOL=0, CPHA=1 (MSB-First) SPI_MODE_2_MSB, // CPOL=1, CPHA=0 (MSB-First) SPI_MODE_3_MSB, // CPOL=1, CPHA=1 (MSB-First) SPI_MODE_0_LSB, // CPOL=0, CPHA=0 (LSB-First) SPI_MODE_1_LSB, // CPOL=0, CPHA=1 (LSB-First) SPI_MODE_2_LSB, // CPOL=1, CPHA=0 (LSB-First) SPI_MODE_3_LSB // CPOL=1, CPHA=1 (LSB-First) }SPI1_Mode_t; |
:
1 2 3 4 5 6 | typedef enum { SPI_FIRST_BYTE = 0, // erstes Byte (von mehreren) SPI_LAST_BYTE, // letztes Byte (von mehreren) SPI_OTHER_BYTE, // nicht erstes und nicht letztes Byte SPI_SINGLE_BYTE // ein einzelnes Byte }SPI1_Byte_t; |
Funktionen (für SPI1) :
1 2 3 | ErrorStatus UB_SPI1_HD_Init(SPI1_Mode_t mode); // zum initialisieren der SPI-Schnittstelle void UB_SPI1_HD_SendByte(uint8_t wert); // zum senden eines Bytes uint8_t UB_SPI1_HD_ReceiveByte(SPI1_Byte_t byte_nr); // zum 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 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | //-------------------------------------------------------------- // File : main.c // Datum : 15.10.2013 // Version : 1.0 // Autor : UB // EMail : mc-4u(@)t-online.de // Web : www.mikrocontroller-4u.de // CPU : STM32F4 // IDE : CooCox CoIDE 1.7.4 // GCC : 4.7 2012q4 // Module : CMSIS_BOOT, M4_CMSIS_CORE // Funktion : Demo der SPI-LoLevel-Library (Half-Duplex) // Hinweis : Diese zwei Files muessen auf 8MHz stehen // "cmsis_boot/stm32f4xx.h" // "cmsis_boot/system_stm32f4xx.c" //-------------------------------------------------------------- #include "main.h" #include "stm32_ub_spi2_hd.h" //-------------------------------------------------------------- // ein Byte per SPI (Half-Duplex) senden //-------------------------------------------------------------- void spi_send(uint8_t wert) { // hier Code einfügen und // ChipSelect-Pin auf LO legen // byte senden UB_SPI2_HD_SendByte(wert); // hier Code einfügen und // ChipSelect-Pin auf HI legen } //-------------------------------------------------------------- // ein Byte per SPI (Half-Duplex) empfangen //-------------------------------------------------------------- uint8_t spi_receive(void) { uint8_t ret_wert; // hier Code einfügen und // ChipSelect-Pin auf LO legen // ein einzelnes byte empfangen ret_wert=UB_SPI2_HD_ReceiveByte(SPI_SINGLE_BYTE); // hier Code einfügen und // ChipSelect-Pin auf HI legen return(ret_wert); } int main(void) { uint8_t wert; SystemInit(); // Quarz Einstellungen aktivieren // SPI2 (Half-Duplex) initialisieren // im Mode0 mit MSB-First UB_SPI2_HD_Init(SPI_MODE_0_MSB); // den Wert 0x45 per SPI (Half-Duplex) senden spi_send(0x45); // einen Wert per SPI (Half-Duplex) empfangen wert=spi_receive(); while(1) { } } |
Hier die Library zum Download :
Hier der komplette CooCox-Projektordner zum Download :