Gast
#2120563
Hey, ich baue gerade eine Ansteuerung für zwei LCDs aus, die über SPI angesprochen werden. Irgendwie wollte das aber nicht so richtig funktionieren, weshalb ich erstmal eine SPI Dummyschaltung aufgebaut habe zum Testen. Ich benutze das STM32Discovery Board und habe SPI1 und SPI2 direkt miteinander verbunden. Jetzt schicke ich aus beiden SPI Daten raus und schaue nach, ob die auch angekommen sind. Eigentlich ganz simpel, dazu gibt es schließlich auch ein Beispielprogramm in der Firmware Lib. Leider ist es dann doch nicht so einfach, es will bei mir schlichtweg nicht klappen. Beide SPI senden die Daten raus, aber empfangen wird iwie gar nichts. Zig Codevariationen später habe ich mal das Beispiel aus der FW Lib draufgespielt, das läuft natürlich... Kann mir bitte jemand sagen, wo der Fehler liegt? Im Prinzip ist alles genau gleich wie in dem Beispielprogramm, nur das Resultat leider nicht :( Programmablauf: Clock wird auf 24MHz gestellt, alle möglichen IOs initalisiert, dann wird meine SPI_Test() aufgerufen: void SPI_Test(void) { /* 1. SPI1 als Master, SPI2 als Slave initialisieren * 2. Daten von SPI1 zu SPI2 schicken */ /* Schritt 1 */ SPI_InitTypeDef SPIInit1; GPIO_InitTypeDef GPIOInit1; RCC_APB2PeriphClockCmd(LCD_SPI_CLK_GPIO_CLK | LCD_SPI_MISO_GPIO_CLK | LCD_SPI_MOSI_GPIO_CLK | RCC_APB2Periph_AFIO, ENABLE); RCC_APB2PeriphClockCmd(LCD_SPI_CLK, ENABLE); GPIOInit1.GPIO_Pin = LCD_SPI_CLK_PIN; GPIOInit1.GPIO_Speed = GPIO_Speed_50MHz; GPIOInit1.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI2_CLK_GPIO_PORT, &GPIOInit1); GPIOInit1.GPIO_Pin = LCD_SPI_MISO_PIN; GPIOInit1.GPIO_Mode = GPIO_Mode_IN_FLOATING; //GPIOInit1.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI2_MISO_GPIO_PORT, &GPIOInit1); GPIOInit1.GPIO_Pin = LCD_SPI_MOSI_PIN; GPIOInit1.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIOInit1); SPI_I2S_DeInit(SPI1); SPIInit1.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPIInit1.SPI_Mode = SPI_Mode_Master; SPIInit1.SPI_DataSize = SPI_DataSize_16b; SPIInit1.SPI_CPOL = SPI_CPOL_Low; SPIInit1.SPI_CPHA = SPI_CPHA_2Edge; SPIInit1.SPI_NSS = SPI_NSS_Soft; SPIInit1.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; /* gegebenenfalls anpassen an 72MHz Connectivity Line */ SPIInit1.SPI_FirstBit = SPI_FirstBit_LSB; SPIInit1.SPI_CRCPolynomial = 7; SPI_Init(LCD_SPI, &SPIInit1); /* SPI1 starten */ SPI_Cmd(LCD_SPI, ENABLE); SPI_InitTypeDef SPIInit2; GPIO_InitTypeDef GPIOInit2; RCC_APB2PeriphClockCmd(LCD_SPI2_CLK_GPIO_CLK | LCD_SPI2_MISO_GPIO_CLK | LCD_SPI2_MOSI_GPIO_CLK, ENABLE); RCC_APB1PeriphClockCmd(LCD_SPI2_CLK, ENABLE); GPIOInit2.GPIO_Pin = LCD_SPI2_CLK_PIN; GPIOInit2.GPIO_Speed = GPIO_Speed_50MHz; GPIOInit2.GPIO_Mode = GPIO_Mode_IN_FLOATING; //GPIOInit2.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI2_CLK_GPIO_PORT, &GPIOInit2); GPIOInit2.GPIO_Pin = LCD_SPI2_MISO_PIN; GPIOInit2.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI2_MISO_GPIO_PORT, &GPIOInit2); GPIOInit2.GPIO_Pin = LCD_SPI2_MOSI_PIN; GPIOInit2.GPIO_Mode = GPIO_Mode_IN_FLOATING; //GPIOInit2.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(LCD_SPI2_MOSI_GPIO_PORT, &GPIOInit2); SPI_I2S_DeInit(SPI2); SPIInit2.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPIInit2.SPI_Mode = SPI_Mode_Slave; SPIInit2.SPI_DataSize = SPI_DataSize_16b; SPIInit2.SPI_CPOL = SPI_CPOL_Low; SPIInit2.SPI_CPHA = SPI_CPHA_2Edge; SPIInit2.SPI_NSS = SPI_NSS_Soft; SPIInit2.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; /* gegebenenfalls anpassen an 72MHz Connectivity Line */ SPIInit2.SPI_FirstBit = SPI_FirstBit_LSB; SPIInit2.SPI_CRCPolynomial = 7; SPI_Init(LCD_SPI2, &SPIInit2); /* SPI2 starten */ SPI_Cmd(LCD_SPI2, ENABLE); /* Schritt 2*/ uint16_t test=0; uint16_t test2=0; /* SPI senden 0x1111 */ SPI_I2S_SendData(SPI1, 0x1111); SPI_I2S_SendData(SPI2, 0x1111); while(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) != RESET) { } while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_BSY) != RESET) { } /* Beide LED aus, wenn Daten empfangen */ test = SPI_I2S_ReceiveData(SPI1); if(test==0) { LED_On(LED1); } else { LED_Off(LED1); } test2 = SPI_I2S_ReceiveData(SPI2); if(test2==0) { LED_On(LED2); } else { LED_Off(LED2); } } Code läuft bis zum Ende durch, nur die LEDs bleiben aus. Findet jemand den Fehler? Achso, die ganzen Defines LCD_SPI_PIN_abc sollten stimmen. DEr Übersichtlichkeit halber hier: #define LCD_SPI2 SPI2 #define LCD_SPI2_CLK RCC_APB1Periph_SPI2 #define LCD_SPI2_CLK_PIN GPIO_Pin_13 #define LCD_SPI2_CLK_GPIO_PORT GPIOB #define LCD_SPI2_CLK_GPIO_CLK RCC_APB2Periph_GPIOB #define LCD_SPI2_MISO_PIN GPIO_Pin_14 #define LCD_SPI2_MISO_GPIO_PORT GPIOB #define LCD_SPI2_MISO_GPIO_CLK RCC_APB2Periph_GPIOB #define LCD_SPI2_MOSI_PIN GPIO_Pin_15 #define LCD_SPI2_MOSI_GPIO_PORT GPIOB #define LCD_SPI2_MOSI_GPIO_CLK RCC_APB2Periph_GPIOB #define LCD_SPI SPI1 #define LCD_SPI_CLK RCC_APB2Periph_SPI1 #define LCD_SPI_CLK_PIN GPIO_Pin_5 #define LCD_SPI_CLK_GPIO_PORT GPIOA #define LCD_SPI_CLK_GPIO_CLK RCC_APB2Periph_GPIOA #define LCD_SPI_MISO_PIN GPIO_Pin_6 #define LCD_SPI_MISO_GPIO_PORT GPIOA #define LCD_SPI_MISO_GPIO_CLK RCC_APB2Periph_GPIOA #define LCD_SPI_MOSI_PIN GPIO_Pin_7 #define LCD_SPI_MOSI_GPIO_PORT GPIOA #define LCD_SPI_MOSI_GPIO_CLK RCC_APB2Periph_GPIOA Danke schonmal!