首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F4 SPI1工作,SPI5不工作?

STM32F4 SPI1工作,SPI5不工作?
EN

Stack Overflow用户
提问于 2017-04-26 11:12:47
回答 3查看 1.4K关注 0票数 1

我得到了一个DMA F410RB开发板,并且能够让我的外部STM32与SPI1一起工作,包括忙等待和DMA.然后,我设计了自己的定制PCB,构建了它,并能够刷新它。在设计阶段,我从使用SPI1切换到SPI5,因为我需要SPI1引脚来实现其他功能。但是我无法让SPI5在我的新设计中工作--在SCK和MOSI引脚上没有信号。当我更改代码以使用SPI1时,我在各自的MOSI和SPI1引脚上看到了信号。

我回到我的Nucleo主板上,发现了同样的问题-- SPI1运行良好,但SPI5根本不能工作。我使用的是Eclipse和ARM GNU编译器以及最新版本的标准外围库(不是HAL)。

SPI init函数:

代码语言:javascript
复制
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写入函数:

代码语言:javascript
复制
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);


} 

此代码不起作用,但当我将所有SPI5引用更改为SPI1,并对SCK使用PB3,对MOSI使用PB5时,SPI就可以工作了。我已经检查了SPI控制寄存器,它们看起来像是为SPI5正确配置的,所以我开始发挥我的智慧了。

为什么SPI1在我自己的设计和Nucleo板上都可以正常工作,但SPI5在这两个板上都不能工作?

EN

回答 3

Stack Overflow用户

发布于 2017-04-27 06:18:04

这是一个简单的答案。SPI5未映射到PB3和PB5...如果您查看第39页的数据表(datasheet rev 5),您可以看到:

  • On PB3您可以使用JTDO-SWO,I2C4_SDA,SPI1_SCK/I2S1_CK,USART1_RX,I2C2_SDA,EVENTOUT,但不能使用SPI5
  • On PB5,您可以使用LPTIM1_IN1,I2C1_SMBA,SPI1_MOSI/I2S1_SD,EVENTOUT,但不能使用SPI5

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

SPI5_MISO: PA12

SPI5_MOSI: PA10或PB8

SPI5_SCK: PB0

票数 1
EN

Stack Overflow用户

发布于 2018-03-03 18:07:03

我也犯了同样的错误。

代码语言:javascript
复制
GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_SPI5);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_SPI5);

对于STM32F410,GPIO_AF_SPI5必须为GPIO_AF6_SPI5。

代码语言:javascript
复制
#define GPIO_AF6_SPI5         ((uint8_t)0x06)  /* SPI5 Alternate Function mapping (Only for STM32F410xx/STM32F411xE Devices) */
票数 1
EN

Stack Overflow用户

发布于 2017-04-26 19:15:24

当你所有的引用都针对SPI5外设时,你的init_spi()函数中的SPI_I2S_DeInit(SPI1);是否正常?

如果我没记错的话,目标STM32是一个STM32F410RBT6.我在这里列出了数据表和参考手册,以供将来使用:

STM32F410RBT6 Datasheet

STM32F410RBT6 Reference Manual

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43624348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档