~%?…;# *’☆&℃$︿★? 2023-12-29 11:22 采纳率: 0%
浏览 118

stm32作为SPI从设备遇到的接受数据问题

最近公司项目需要做双STM32F4的SPI通讯,结果遇到了问题
主设备有信号发出来,但是从设备接收不到,进不了中断函数,我把SPI_I2S_ReceiveData(SPI1);单独拿出来也没有收到数据,看了一天半了,还没找到问题,希望各位朋友能提供帮助。我能确定的是我的主设备有信号发出,最后有示波器的图。
以下是从设备SPI配置代码

void SPI1_init(void)
{
    SPI_InitTypeDef SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    /* 开启SPI1时钟 */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
    /* 开启GPIOA时钟 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    
    
    /* 引脚复用 */
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_SPI1);
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_SPI1);
    
    /* PA4:SS1 */
    /* PA5:SCK */
    /* PA6:MISO */
    /* PA7:MOSI */
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    
//    SPI1_CSS_ENABLE;
    
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Slave;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Hard;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 10;
    
    SPI_Init(SPI1, &SPI_InitStructure);
    SPI_Cmd(SPI1, ENABLE);
    SPI_TIModeCmd(SPI1, ENABLE);
    
    NVIC_InitStructure.NVIC_IRQChannel = SPI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
    
    /* 使能中断函数 */
    SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);
    
}

void SPI1_IRQHandler(void)
{
    if(SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_IT_RXNE) == SET)
    {
        rec = SPI_I2S_ReceiveData(SPI1);
        SPI_I2S_ClearITPendingBit(SPI1, SPI_I2S_IT_RXNE);
    }
    
}

中断进不去,rec = SPI_I2S_ReceiveData(SPI1);单独放在主程序里也没有收到东西,不知道是不是中断时钟没开还是什么,我看有些博主分享的代码,从机用硬件模式,片选是低电平……查了半天没什么结果,还请各位朋友不吝赐教,感谢各位朋友

img

  • 写回答

3条回答 默认 最新

  • 爱编程的鱼 2023-12-29 12:33
    关注

    根据你提供的代码,有几个可能导致从设备无法接收数据的问题:

    1. 中断优先级设置:在中断初始化中,你设置了中断优先级为2(NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;)。请确保主设备的中断优先级没有高于从设备的中断优先级,否则可能会导致从设备的中断被主设备的中断抢占。

    2. 片选信号:你的代码中没有包含片选信号的配置和控制。在SPI通信中,从设备需要根据主设备的片选信号来判断是否接收数据。请确保片选信号正确配置,并在接收数据时使能从设备的SPI片选。

    3. 硬件连接问题:请确保硬件连接正确,包括SPI引脚的连接和片选信号的连接。确保从设备的MISO引脚正确连接到主设备的MOSI引脚,以确保数据能够正确传输。

    4. 时钟配置:请确保SPI时钟配置正确。检查主设备和从设备的时钟配置是否一致,包括时钟极性(CPOL)和时钟相位(CPHA)的设置。

    5. 中断使能:在你的代码中,你使用了SPI_I2S_ITConfig(SPI1, SPI_I2S_IT_RXNE, ENABLE);来使能接收中断。请确保在使用中断之前,你已经使能了SPI的相关中断,如接收缓冲区非空中断(RXNE)。

    如果你仍然无法解决问题,建议逐步调试代码,可以先尝试在主程序中发送数据给从设备,然后通过示波器检查主设备的信号是否正确。如果主设备的信号正确,但从设备无法接收到数据,则可能是从设备的配置或硬件问题。

    另外,你也可以查阅STM32F4的参考手册和相关文档,以获取更详细的配置和使用说明。

    希望这些信息对你有所帮助!

    评论

报告相同问题?

问题事件

  • 修改了问题 12月29日
  • 创建了问题 12月29日