单片机反汇编 2023-02-16 09:24 采纳率: 11.1%
浏览 44

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最近接收的数据
}

  • 写回答

2条回答 默认 最新

  • 量化研究所 2023-02-16 09:30
    关注

    您的代码中,函数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函数。

    望采纳。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月16日

悬赏问题

  • ¥15 微信会员卡接入微信支付商户号收款
  • ¥15 如何获取烟草零售终端数据
  • ¥15 数学建模招标中位数问题
  • ¥15 phython路径名过长报错 不知道什么问题
  • ¥15 深度学习中模型转换该怎么实现
  • ¥15 HLs设计手写数字识别程序编译通不过
  • ¥15 Stata外部命令安装问题求帮助!
  • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
  • ¥15 TYPCE母转母,插入认方向
  • ¥15 如何用python向钉钉机器人发送可以放大的图片?