初识SPI,遇到问题,发帖请教。(已解决)

2019-10-16 02:21发布

u8 SPIx_ReadWriteByte(u8 TxData)
{
    u8 retry=0;
    while((SPI1->SR&1<<1)==0)//等待发送区空
    {
        retry++;
        if(retry>200)return 0;
    }
    SPI1->DR=TxData; //发送一个byte
    retry=0;
    while((SPI1->SR&1<<0)==0) //等待接收完一个byte
    {
        retry++;
        if(retry>200)return 0;
    }
r    eturn SPI1->DR; //返回收到的数据
}
今天学习到SPI实验了,看到SPI读写函数有点不解,为什么读和写能写在一个函数中啊?
当我读数据的时候要先发送一个数据么?
当我写完数据还要读一个数据么?

请大家指点下。谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
33条回答
蓝色天使211
1楼-- · 2019-10-18 21:06
刚在学spi这章,查了网现在对0xff有点眉目了,因为前面发送读命令,所以0xff不会被写进去,而读出来的数据放在读的DR里面,这时写的DR里面放的是0xff。
  SPI2_ReadWriteByte(W25X_ReadData);  //发送读取命令
Elmo
2楼-- · 2019-10-19 01:49
回复【12楼】正点原子:
---------------------------------
原子哥,这个CLK是在发送数据的时候自动产生方波的吧?我现在碰到的问题是,主机根本发不出去数据;
    while (SPI_I2S_GetFlagStatus(SPIX, SPI_I2S_FLAG_TXE) == RESET);   程序卡死在了这,那么CLK还能产生码???

我在网上搜了好多网有的问题,但是卡在这个地方,没有人给出合理的解答。。。。
交流zzk
3楼-- · 2019-10-19 06:13
回复【28楼】交流zzk:
---------------------------------
我们例程不就有SPI发送嘛
正点原子
4楼-- · 2019-10-19 09:08
 精彩回答 2  元偷偷看……
交流zzk
5楼-- · 2019-10-19 14:56
回复【30楼】交流zzk:
---------------------------------
不知层主解决没有,我也同样有这个疑问,在读取Device ID时,应该在第四个发送指令之后才应该有一个回复啊,所以应该陷入死循环啊、、、
scv
6楼-- · 2019-10-19 20:48
如果我只用到SCK、以及MISO两根线,配置为双线双工,MOSI悬空不接。那样的话,我还是用
u8 SPI2_ReadWriteByte(u8 TxData) 
{
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET); 
  SPI_SendData8(SPI2,TxData);  
  while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET);   
  return SPI_ReceiveData8(SPI2);        

这个函数,我可以理解为,在MISO上给从机发送了一个指令,从机接收了这个指令后,反馈回来数据???恳请原子哥解答。回复【29楼】正点原子:
---------------------------------

一周热门 更多>