关于STM32的SPI问题,哪位大神能给予指导,小妹非常感谢! 5
我想要实现的:STM32的SPI1作为主机,向我的另一个SPI从机设备写数据(发送数据)和读数据(接收数据)。问题是针对读写函数的,函数如下:u8SPI1_ReadWri...
我想要实现的:STM32的SPI1作为主机,向我的另一个SPI从机设备写数据(发送数据)和读数据(接收数据)。
问题是针对读写函数的,函数如下:
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查发送缓存空标志位 {
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI2, TxData); //通过主机的MOSI口发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //如果TxData为0xFF,那么这句的判断是针对TxData的0xFF数据收到没收到,还是针对从机那边发来的数据?
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
问题:
1、while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //如果TxData为0xFF,那么这句的判断是针对TxData的0xFF数据收到没收到,还是针对从机那边发来的数据?
2、调用这句SPI_I2S_SendData(SPI2, TxData); 后程序会执行SPI_DR=TxData;发现SPI_DR 的数据为0,这个又是为什么?
等待高人的解答中。。。。。 展开
问题是针对读写函数的,函数如下:
u8 SPI1_ReadWriteByte(u8 TxData)
{
u8 retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET) //检查发送缓存空标志位 {
retry++;
if(retry>200)return 0;
}
SPI_I2S_SendData(SPI2, TxData); //通过主机的MOSI口发送一个数据
retry=0;
while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //如果TxData为0xFF,那么这句的判断是针对TxData的0xFF数据收到没收到,还是针对从机那边发来的数据?
{
retry++;
if(retry>200)return 0;
}
return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx最近接收的数据
}
问题:
1、while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET) //如果TxData为0xFF,那么这句的判断是针对TxData的0xFF数据收到没收到,还是针对从机那边发来的数据?
2、调用这句SPI_I2S_SendData(SPI2, TxData); 后程序会执行SPI_DR=TxData;发现SPI_DR 的数据为0,这个又是为什么?
等待高人的解答中。。。。。 展开
展开全部
SPI边发边收,就算没有从机也会收到数据,这个数据与发送期间接收脚的电平有关。所以收到0xFF不能判定是从机发的。
第二个问题不懂。。。是不是TxData本来就是0?
追问
如果发送的数据为0xff,执行SPI_I2S_SendData(SPI2, TxData); 后,数据寄存器里的值为何一直为0,还有对于SPI_I2S_ReceiveData(SPI1);接收的又是哪里数据?
追答
不知道你的问题解决没,上班刚看到。。。
我这边试了一下,单步调试时数据寄存器一 直不变,全速时有变化,也不知道为什么~~
通讯结果是对的。
SPI_I2S_ReceiveData(SPI1)也是接收SPI_DR的数据。SPI_DR对应两个缓冲区,一收一发,名字相同但相互独立。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询