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);
}