STM32 SPI 从机问题

STM32 SPI 当作从机

STM32 SPI接收主机发来的数据,通过SPI。

程序就是一直等主机发来数据,第一个字节是命令,01做开IO ,02关IO ,其它命令可能是主机有数据要写入
或者主机有要读出数据

现在代码老是错误 ,接收一个字节还好,接收俩个字节 或三个字节就不行了

u8 SPI_Write_Read_604(u8 TxData)
{
    u8 temp1;
    u16 retry=0;
    if((RAM_2C & BITS(7))==0)            // =0 说明关闭SPI
    {
        return 0x1c;
    }
    
    
//    SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_TXE);
//    SPI_I2S_ClearFlag(SPI1,SPI_I2S_FLAG_RXNE);                     
    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET) //检查指定的SPI标志位设置与否:发送缓存空标志位
    {
        retry++;
        //if(retry>2000)return 0;
        if(retry>2000)break;
    }              
    SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个数据
    retry=0;

    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET)//检查指定的SPI标志位设置与否:接受缓存非空标志位
    {
        //retry++;
        //if(retry>200)return 0;
    }                      
    
    return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}

您的代码中,函数SPI_Write_Read_604只接收一个字节的数据。要接收多个字节,可以增加一个循环,多次调用SPI_I2S_ReceiveData函数。在主机发送的数据中,第一个字节是命令,可以根据命令类型进行相应的处理。下面可以参考一下:

void SPI_Slave_Receive_Data(void)
{
    uint8_t cmd, data;
    while (1)
    {
        // 接收命令字节
        cmd = SPI_I2S_ReceiveData(SPI1);
        
        // 根据命令类型处理数据
        switch (cmd)
        {
        case 0x01: // 开IO
            // 执行开IO的操作
            break;
        case 0x02: // 关IO
            // 执行关IO的操作
            break;
        case 0x03: // 读数据
            // 从主机读取一个字节的数据
            data = SPI_I2S_ReceiveData(SPI1);
            // 处理数据
            break;
        case 0x04: // 写数据
            // 从主机读取一个字节的数据
            data = SPI_I2S_ReceiveData(SPI1);
            // 执行写数据的操作
            break;
        default:
            break;
        }
    }
}


在上述示例代码中,使用switch语句根据不同的命令类型进行不同的处理。如果命令是读数据或写数据,需要接收一个字节的数据。如果需要接收多个字节,可以在循环中多次调用SPI_I2S_ReceiveData函数。

望采纳。