打印

stm32 SPI2 发送数据后没接收到数据 RXNE置1?

[复制链接]
6354|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qianwantao|  楼主 | 2013-1-30 22:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32 的SPI2是能后,当发送一个数据后,没有接受到数据RXNE标志置1,因为采用万利实验板,没有接spi线,肯定是没有接收导数据的,主要设置如下:

           GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13|GPIO_Pin_15; //SPI2_SCK/SPI2_MOSI
          GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
          GPIO_Init(GPIOB, &GPIO_InitStructure);

          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;          //SPI2_MISO
          GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
          GPIO_Init(GPIOB, &GPIO_InitStructure);

                 SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
         SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
         SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
         SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
         SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;
           SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
         SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64;
         SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_LSB;
         SPI_InitStructure.SPI_CRCPolynomial = 7;
         SPI_Init(SPI2, &SPI_InitStructure);

设置好后,  SPI_Cmd(SPI2, ENABLE);
                  GPIO_SetBits(GPIOC, GPIO_Pin_7); //点亮led1
                  SPI_I2S_SendData(SPI2, 49);
  
                  while(SPI_I2S_GetFlagStatus( SPI2, SPI_I2S_FLAG_RXNE)==RESET);  //
          SPI_RX=SPI_I2S_ReceiveData(SPI2);
          GPIO_SetBits(GPIOC, GPIO_Pin_5);//点亮led3

          while(SPI_I2S_GetFlagStatus( SPI2, SPI_I2S_FLAG_TXE)==RESET);
          SPI_I2S_SendData(SPI2, 50);
问题就在 有了SPI_I2S_SendData(SPI2, 49);这一句发送后,RXNE就会置位,while(SPI_I2S_GetFlagStatus( SPI2, SPI_I2S_FLAG_RXNE)==RESET); 这句就会执行过去,
如果没有发送语句RXNE是复位的,我用中断方式结果还是一样的,只要有发送语句就会进RXNE的中断,不知道什么原因?

沙发
airwill| | 2013-2-1 11:05 | 只看该作者
因为 SPI 是同步总线,  发送和接收是同步进行的. 发送完成的同时, 接收也完成了, 跟你接不接线毫无关系

使用特权

评论回复
板凳
最底层的BUG| | 2013-2-1 11:22 | 只看该作者
不过接受时从机总要接受到由主机发送过来的命令才知道要发什么!!!

使用特权

评论回复
地板
jlass| | 2013-2-1 11:36 | 只看该作者
本帖最后由 jlass 于 2013-2-1 11:38 编辑

估计你的spi线是收发同步处理的,发送一个数的同时会接收一个数,只不过是个无效的数据而已。你以前可能接触过异步处理的,思想转换不过来。

使用特权

评论回复
5
qianwantao|  楼主 | 2013-2-18 20:00 | 只看该作者
明白了,spi同步通信

使用特权

评论回复
6
ouyang6800| | 2013-2-19 13:45 | 只看该作者
那如果是我要做异步处理是不是要得自己模拟SPI呢

使用特权

评论回复
7
ouyang6800| | 2013-2-19 13:55 | 只看该作者
最底层的BUG 发表于 2013-2-1 11:22
不过接受时从机总要接受到由主机发送过来的命令才知道要发什么!!!

但是如果是同步我主机的命名还没有到达从机 从机知道发给我什么呢 所以同步能作用在哪些地方呢?

使用特权

评论回复
8
zhaoyu2005| | 2013-2-19 17:22 | 只看该作者
标准SPI就是收发同时进行的,对于你的操作,发送命令时丢弃收到的数据,然后再发送不相干的数据接收数据同时接收数据即可。
比如需要发送一个查询命令,那就先发送查询命令,等待从机数据正常建立了,然后继续发送无关数据,其实这时发送的数据从机不响应,只对时钟感兴趣,相当于发出时钟,从机按顺序返回数据,这时的数据就需要接收了。
其实LZ找个时序图看下明白了,比如AT25XXX的datasheet里就有

使用特权

评论回复
9
ouyang6800| | 2013-2-20 15:40 | 只看该作者
楼上讲解的很明白 学习!

使用特权

评论回复
10
最底层的BUG| | 2013-2-21 11:16 | 只看该作者
ouyang6800 发表于 2013-2-19 13:55
但是如果是同步我主机的命名还没有到达从机 从机知道发给我什么呢 所以同步能作用在哪些地方呢? ...

发第一个指令;发第二个指令,同时接收到第一个指令返回的数据;发第三个指令,同时接收第二个指令返回的数据……就这样,返回的数据总是延迟一个数据周期。

使用特权

评论回复
11
ouyangchun| | 2015-4-21 15:03 | 只看该作者
10楼说的很对啊,学习中!

使用特权

评论回复
12
zh113214| | 2015-4-21 20:32 | 只看该作者
看看,目前还没用到这块

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

10

帖子

0

粉丝