初识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条回答
xiaqing10
1楼-- · 2019-10-17 00:48
回复【5楼】bluesky_kun:
---------------------------------楼主能帮我解释下、
while((SPI1->SR&1<<1)==0)//等待发送区空
     {
         retry++;
         if(retry>200)return 0;
     }
我不知道while这样写是什么意思呀? 谢谢了
正点原子
2楼-- · 2019-10-17 02:18
 精彩回答 2  元偷偷看……
黄毛
3楼-- · 2019-10-17 02:34
回复【3楼】wolfdong7:
---------------------------------
受教了
jikaishihuaidan
4楼-- · 2019-10-17 06:55
回复【2楼】正点原子:
---------------------------------
原子哥,我把例程的spi读写函数拆成了2个
u8 SPI2_Write(u8 data)
{
 u8 retry=0;
 while((SPI2->SR&0X02)==0) //等待数据发送完
 {
  retry++;
  if(retry>=0XFE)return 0;
 }
 SPI2->DR=data;   //data是要发送的数据
 return 0;
}
u8 SPI2_Read(void)
{
 u8 retry=0;
 while((SPI2->SR&0X01)==0) //等待数据接收完
 {
  retry++;
  if(retry>=0XFE)return 0;
 }
 return SPI2->DR;    //data是接收到的数据
}
这样就不行了,是不是和3楼的朋友说的那样:spi的时序就是在sck的控制下,两个双向移位寄存器进行数据交换。所以它是一边发送一边接收的,必须发送一个数据才能接收一个
所以spi的读写不能分开,必须在一个函数里?
正点原子
5楼-- · 2019-10-17 08:16
回复【11楼】jikaishihuaidan:
---------------------------------
SPI,必须要由主机产生时钟,才行.
所以,你的接收函数,主机都没有数据发送,也就是不会产生时钟,自然就收不到数据了.
jikaishihuaidan
6楼-- · 2019-10-17 10:46
回复【12楼】正点原子:
---------------------------------
抱歉原子哥,忘了回复。
恩,主设备的读数据实际上是从设备的发送数据,对吗?

一周热门 更多>