打印
[N32G430]

N32G430与STM32F407 SPI通信问题

[复制链接]
757|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
DaveMa|  楼主 | 2024-1-5 10:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用STM32F407作为主机,N32G430作为从机,主机发送一个8位数据,从机通过SPI2接收并存到变量rec里。目前主机信号发送正常,从机程序每次都跑死在 while (SPI_I2S_Flag_Status_Get(SPI_SLAVE, SPI_I2S_FLAG_RNE) == RESET)这一步。查了用户手册说这个标志位会在接收数据后硬件清除,不知道怎么回事。贴出部分程序,求大神解答qwq。
    SPI_Initializes_Structure(&SPI_InitStructure);
    SPI_InitStructure.DataDirection = SPI_DIR_DOUBLELINE_FULLDUPLEX;
    SPI_InitStructure.SpiMode       = SPI_MODE_SLAVE;
    SPI_InitStructure.DataLen       = SPI_DATA_SIZE_8BITS;
    SPI_InitStructure.CLKPOL        = SPI_CLKPOL_LOW;
    SPI_InitStructure.CLKPHA        = SPI_CLKPHA_FIRST_EDGE;
    SPI_InitStructure.NSS           = SPI_NSS_SOFT;
    /* It is recommended that the SPI master mode of the C version chips should not exceed 18MHz */
    SPI_InitStructure.BaudRatePres  = SPI_BR_PRESCALER_8;
    SPI_InitStructure.FirstBit      = SPI_FB_MSB;
    SPI_InitStructure.CRCPoly       = 7;
    SPI_Initializes(SPI2, &SPI_InitStructure);
    SPI_Set_Nss_Level(SPI2, SPI_NSS_LOW);
    SPI_CRC_Enable(SPI_SLAVE);
    SPI_ON(SPI_SLAVE);
   while (1)
    {
        while (SPI_I2S_Flag_Status_Get(SPI_SLAVE, SPI_I2S_FLAG_RNE) == RESET)
        rec = SPI_I2S_Data_Get(SPI_SLAVE);
    }

使用特权

评论回复
沙发
laocuo1142| | 2024-1-8 16:40 | 只看该作者
SPI_I2S_Flag_Status_Get函数的返回值: 这个函数返回一个标志位的状态,但返回值可能不是你预期的那样。在N32G430的数据手册中,对于这个函数的返回值可能有更多的信息,你应该检查一下是否为以下两种情况:

如果标志位被设置,函数返回非零值。
如果标志位没有被设置,函数返回0。所以,你的while循环可能***不会结束,因为SPI_I2S_FLAG_RNE标志位可能从未被设置。

使用特权

评论回复
板凳
flycamelaaa| | 2024-1-8 16:41 | 只看该作者
如果SPI数据接收缓冲区在其他地方被清空,那么SPI_I2S_FLAG_RNE标志位可能***不会被设置。

使用特权

评论回复
地板
powerantone| | 2024-1-8 16:42 | 只看该作者
SPI初始化设置是否正确

使用特权

评论回复
5
stormwind123| | 2024-1-8 16:42 | 只看该作者
考虑使用SPI的中断来处理数据的接收。这可以避免你当前的无限循环,并且当数据可用时可以自动处理数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝