2017-04-26 3 views
1

Ich bekam eine STM32 Nucleo-F410RB-Entwicklungskarte und konnte meinen externen DAC mit SPI1 arbeiten, sowohl mit busy-wait als auch mit DMA. Ich habe dann mein eigenes PCB entworfen, es gebaut und konnte es flashen. Während der Designphase habe ich von SPI1 auf SPI5 umgestellt, weil ich die SPI1 Pins für andere Funktionen brauchte. Aber ich konnte SPI5 nicht in meinem neuen Design arbeiten lassen - kein Signal an den Pins SCK und MOSI. Wenn ich meinen Code geändert habe, um SPI1 zu verwenden, sehe ich Signale auf den jeweiligen SPI1 SCK- und MOSI-Pins.STM32F4 SPI1 funktioniert, SPI5 funktioniert nicht?

Ich ging zurück zu meinem Nucleo Board und habe das gleiche Problem - SPI1 funktioniert gut, aber SPI5 funktioniert überhaupt nicht. Ich verwende Eclipse mit dem ARM GNU Compiler und der neuesten Version der Standard Peripheral Library (nicht HAL).

SPI init Funktion:

void init_spi(void) { 

//initialize MOSI and SCK pins 
//initialize SPI 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); 

GPIO_InitTypeDef gpio_init; 
gpio_init.GPIO_Pin = GPIO_Pin_0; //SCK 
gpio_init.GPIO_Speed = GPIO_Fast_Speed; 
gpio_init.GPIO_Mode = GPIO_Mode_AF; 
gpio_init.GPIO_OType = GPIO_OType_PP; 
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_Init(GPIOB, &gpio_init); 

gpio_init.GPIO_Pin = GPIO_Pin_8; //MOSI 
gpio_init.GPIO_Speed = GPIO_Fast_Speed; 
gpio_init.GPIO_Mode = GPIO_Mode_AF; 
gpio_init.GPIO_OType = GPIO_OType_PP; 
gpio_init.GPIO_PuPd = GPIO_PuPd_NOPULL; 
GPIO_Init(GPIOB, &gpio_init); 

GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_SPI5); 
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_SPI5); 

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 

//initialize DAC CS PIN 
gpio_init.GPIO_Pin = DAC_CS_PIN; 
gpio_init.GPIO_Speed = GPIO_Fast_Speed; 
gpio_init.GPIO_Mode = GPIO_Mode_OUT; 
gpio_init.GPIO_OType = GPIO_OType_PP; 
gpio_init.GPIO_PuPd = GPIO_PuPd_UP; 
GPIO_Init(GPIOA, &gpio_init); 


SPI_I2S_DeInit(SPI5); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI5, ENABLE); //enable SPI clock 

SPI_InitTypeDef spi_init; 
spi_init.SPI_Direction = SPI_Direction_1Line_Tx; 
spi_init.SPI_Mode = SPI_Mode_Master; 
spi_init.SPI_DataSize = SPI_DataSize_8b; //8b? Need to clock in 24 bits of data per DAC channel 
spi_init.SPI_CPOL = SPI_CPOL_Low; //5134 uses low to high and high to low clock transitions. ie. idle state is LOW 
spi_init.SPI_CPHA = SPI_CPHA_2Edge; //clock phase - data is clocked on falling edge of clock pulse 
spi_init.SPI_NSS = SPI_NSS_Soft; //DAC chip select is handled in software 
spi_init.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //APB2 clock/2, so 25 MHz SPI clock speed 
spi_init.SPI_FirstBit = SPI_FirstBit_MSB; //check datasheet 
spi_init.SPI_CRCPolynomial = 7; //what is this? 
SPI_Init(SPI5, &spi_init); 
SPI_Cmd(SPI5, ENABLE); 
} 

SPI Write-Funktion:

void spi_write_dac(uint16_t value, uint8_t channel) { //currently just use busy/wait to transmit data to test DAC 

uint8_t dac_low = value & 0xFF; //take bottom 8 bits 
uint8_t dac_high = value >> 8; //take top 8 bits 
GPIO_ResetBits(GPIOA, DAC_CS_PIN); //CS low 
while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_TXE) == RESET);//wait for empty buffer 
SPI_I2S_SendData(SPI5, channel); //send control byte 
while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_BSY) == SET); //wait for byte to be sent 
SPI_I2S_SendData(SPI5, dac_high); //send first data byte 
while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_BSY) == SET); //wait for byte to be sent 
SPI_I2S_SendData(SPI5, dac_low); //send second data byte 
while (SPI_I2S_GetFlagStatus(SPI5, SPI_I2S_FLAG_BSY) == SET); //wait for byte to be sent 
GPIO_SetBits(GPIOA, DAC_CS_PIN); 


} 

Dieser Code nicht aber funktioniert, wenn ich ändern, um alle SPI5 Verweise auf SPI1 und dann für MOSI PB3 für SCK und PB5 verwenden SPI funktioniert. Ich habe die SPI-Kontrollregister überprüft und sie sehen aus, als ob sie für SPI5 korrekt konfiguriert sind, so dass ich anfange, an mein Ende zu kommen.

Warum funktioniert SPI1 sowohl auf meinem eigenen Design als auch auf dem Nucleo Board gut, aber SPI5 wird auf keinem der beiden Boards funktionieren?

Antwort

0

Ist die SPI_I2S_DeInit(SPI1); normal in Ihrer init_spi() Funktion, wenn alle Ihre Referenzen für SPI5 Peripheriegeräte sind?

Wenn ich nicht falsch liege, ist das Ziel STM32 ein STM32F410RBT6. Ich lasse hier das Datenblatt und Referenzhandbuch für zukünftige Zwecke:

STM32F410RBT6 Datasheet

STM32F410RBT6 Reference Manual

+0

ja, tut mir leid das war ein Tippfehler (jetzt korrigiert). Grundsätzlich, wenn alles auf SPI1 verweist und die SPI1-Pins eingerichtet sind, funktioniert SPI1 wie erwartet, ändert aber alle Verweise auf SPI5 und verwendet SPI5-Pins (PB0 für SCK und PB8 für MOSI) funktioniert nicht. – jrl8

+0

Und ja, um zu bestätigen, das sind das Datenblatt und das Referenzhandbuch, die ich benutze. – jrl8

0

Das ist leicht zu beantworten. SPI5 nicht abgebildet PB3 und PB5 ... Wenn Sie auf das Datenblatt auf Seite sehen 39 (Datenblatt rev 5), man konnte das sehen:

  • Auf PB3 Sie JTDO-SWO verwenden können, I2C4_SDA, SPI1_SCK/I2S1_CK, USART1_RX, I2C2_SDA, eventout, aber keine SPI5

  • auf PB5, können Sie LPTIM1_IN1, I2C1_SMBA, SPI1_MOSI/I2S1_SD, eventout verwenden, aber keine SPI5

Wenn Sie wirklich verwenden möchten SPI5, können Sie die folgenden IOs verwenden:

SPI5_MISO: PA12

SPI5_MOSI: PA10 oder PB8

SPI5_SCK: PB0

+0

Vielen Dank für Ihre Antwort. Ja, mir ist das Pin-Mapping bekannt. PB3 und PB5 funktionieren für SPI1 und in meinem SPI5-Beispielcode richte ich SPI5 mit PB0 und PB8 ein (versuchte auch PA10 ohne Glück). – jrl8

0

habe ich den gleichen Fehler.

GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_SPI5); 
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_SPI5); 

GPIO_AF_SPI5 müssen GPIO_AF6_SPI5 für STM32F410.

#define GPIO_AF6_SPI5   ((uint8_t)0x06) /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */ 
Verwandte Themen