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函数。
望采纳。