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?
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
Und ja, um zu bestätigen, das sind das Datenblatt und das Referenzhandbuch, die ich benutze. – jrl8