Hallo Ich muss mit dem Nucleo STM32 Board die MAX7219 LED-Matrix über SPI zum Laufen bringen, aber ich sitze seit Stunden drann und komm einfach nicht drauf, was ich falsch mache. Laut Logic Analyser sende ich nichts, aber warum? Das einzige was ich weiß is, dass ich im Debugmodus ständig in die Interruptroutine reinspringe. Bitte um Hilfe!!! Gruß Kris Mein Code: #include "stm32f30x_conf.h" #include "stm32f30x_spi.h" #include "stm32f30x_misc.h" //Hilfsflag für die SPI char spi_ready = 0; //Eine Funktion zum Senden von Daten void spi_send(uint16_t data) { while(!spi_ready); spi_ready = 0; GPIOA->ODR &=~ GPIO_Pin_4; SPI_I2S_SendData16(SPI1,data); } //Main int main(void) { //Clock für Port A aktivieren RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); //Clock für SPI aktivieren RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); //GPIO Konfig. GPIO_InitTypeDef SPI_PINS; SPI_PINS.GPIO_Mode = GPIO_Mode_AF; SPI_PINS.GPIO_OType = GPIO_OType_OD; //PA5 ist CLK, PA7 ist MOSI SPI_PINS.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7; SPI_PINS.GPIO_PuPd = GPIO_PuPd_NOPULL; SPI_PINS.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &SPI_PINS); //Chipselect einstellung , CS auf Pin PA4 SPI_PINS.GPIO_Mode = GPIO_Mode_OUT; SPI_PINS.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOA, &SPI_PINS); //Alternative Funktion füt GPIOA einstellen GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_4); GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_5); GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_7); //SPI Konfig. SPI_InitTypeDef spi; NVIC_InitTypeDef NVIC_InitStructure; SPI_StructInit(&spi); spi.SPI_CPHA = SPI_CPHA_1Edge; spi.SPI_CPOL = SPI_CPOL_Low; spi.SPI_DataSize = SPI_DataSize_16b; spi.SPI_Direction = SPI_Direction_2Lines_FullDuplex; spi.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256; spi.SPI_FirstBit = SPI_FirstBit_MSB; spi.SPI_Mode = SPI_Mode_Master; spi.SPI_NSS = SPI_NSS_Soft; SPI_Init(SPI1, &spi); SPI_NSSInternalSoftwareConfig(SPI1,SPI_NSSInternalSoft_Set); SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_TXE, ENABLE); //SPI Interrupt KOnfiguration NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_Init(&NVIC_InitStructure); SPI_Cmd(SPI1,ENABLE); spi_send(0x0C00); // Shutdown-Mode deaktivieren spi_send(0x0900); // keine Decodierung spi_send(0x0F00); // normaler Display-Mode spi_send(0x0B00); // Scan-Limit auf 7 setzen GPIOA->ODR |= GPIO_Pin_4; //Endlosschleife while(1) { spi_send(0x0FFF); } } //SPI Interrut Handler void SPI1_IRQHandler() { GPIOA->ODR |= GPIO_Pin_4; spi_ready=1; SPI_I2S_ClearFlag(SPI1, SPI_I2S_FLAG_TXE); }
:
Verschoben durch Moderator
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.