2017-04-26 44 views
1

我得到了STM32 Nucleo-F410RB開發板,並且能夠使我的外部DAC與SPI1一起工作,無論是忙等待還是使用DMA。然後,我設計了我自己的定製PCB,並構建了它並能夠將其閃光。在設計階段,我使用SPI1切換到SPI5,因爲我需要SPI1引腳來實現其他功能。但是我無法讓SPI5在我的新設計中工作 - SCK和MOSI引腳上沒有信號。當我將代碼更改爲使用SPI1時,我在各個SPI1 SCK和MOSI引腳上看到信號。STM32F4 SPI1工作,SPI5不工作?

我回到了我的Nucleo板,並有同樣的問題 - SPI1工作正常,但SPI5根本不起作用。我正在使用帶有ARM GNU編譯器的Eclipse和最新版本的標準外設庫(不是HAL)。

SPI初始化函數:

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寫功能:

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


} 

此代碼不能正常工作,但是當我改變SPI1所有SPI5引用和使用PB3爲SCK和PB5的MOSI然後SPI正在工作。我檢查了SPI控制寄存器,他們看起來像是正確配置了SPI5,所以我開始接觸到我的機智。

爲什麼SPI1可以在我自己的設計和Nucleo電路板上正常工作,但SPI5在任一電路板上都無法工作?

回答

0

當您的所有參考都是針對SPI5外設的時,您的init_spi()函數中的SPI_I2S_DeInit(SPI1);是否正常?

如果我沒有錯,STM32的目標是一個STM32F410RBT6。我讓這裏的數據表和參考手冊未來用途:

STM32F410RBT6 Datasheet

STM32F410RBT6 Reference Manual

+0

是的,抱歉,這是一個錯字(現在糾正)。基本上,當所有參考SPI1和SPI1引腳設置完成時,SPI1按預期工作,但將所有對SPI5的引用和使用SPI5引腳(PB0用於SCK和PB8用於MOSI)都不起作用。 – jrl8

+0

是的,爲了確認,這些分別是我正在使用的數據表和參考手冊。 – jrl8

0

這是一個簡單的答案。 SPI5沒有映射到PB3及PB5 ...... 如果你看一下39頁上的數據表(數據表第5版)的,你可以看到:

  • 在PB3可以使用JTDO-SWO,I2C4_SDA, SPI1_SCK/I2S1_CK,USART1_RX,I2C2_SDA,事件輸出,但沒有SPI5

  • 在PB5,您可以使用LPTIM1_IN1,I2C1_SMBA,SPI1_MOSI/I2S1_SD,事件輸出,但沒有SPI5

如果你真的想用SPI5,您可以使用以下IO:

SPI5_MISO:PA12

SPI5_MOSI:PA10或PB8

SPI5_SCK:PB0

+0

謝謝你的回覆。是的,我知道引腳映射。 PB3和PB5適用於SPI1,在我的SPI5示例代碼中,我使用PB0和PB8設置SPI5(也嘗試了PA10,但沒有運氣)。 – jrl8

0

我做了同樣的錯誤。

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

對於STM32F410,GPIO_AF_SPI5必須是GPIO_AF6_SPI5。

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