你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

问个关于STM32L4 SPI读数据,前3个字节永远是0

[复制链接]
maisheng 提问时间:2017-2-20 14:47 /
以前用NXP的LPC系列,最近第一次用STM32就面对HAL库,操作一个SPI接口的A/D芯片和SPI Flash,用了HAL_SPI_Receive和HAL_SPI_TransmitReceive。之前先操作SPI的A/D芯片,奇怪的是每次读取数据前3个字节都是0,然后才能读到正确数据。 今天用HAL_SPI_Receive读SPI Flash的ID,读出来两个字节是0,后来觉得奇怪就多读了3个字节,发现正确的ID是3个0后的第4和5字节。
请问是不是HAL库的问题?哪位兄弟遇到过?
收藏 1 评论14 发布时间:2017-2-20 14:47

举报

14个回答
zoomdy 回答时间:2017-2-21 12:57:45
SPI是全双工的,当MOSI在发送数据的时候,MISO同时也在接收数据,如果说你要先发送4字节然后接收2字节,那么实际上发送了6字节,4字节你指定的数据和2字节FF,接收到的也是6个字节,要自己丢弃前面4个字节。一般来讲,接收的数据应该是FF,你收到的是0,我想问一下,你的MISO是上拉还是下拉或者是浮空?如果MISO是下拉那接收到0就对了,如果是浮空,那接收到0的可能性也很大。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

maisheng 回答时间:2017-2-20 16:07:25
刚才跟踪了一下,发现打了断点后能看到数据是正确的,但是不知道为什么就读不到。 spierr.jpg
jtc_88 回答时间:2017-2-20 16:24:24
一个字节一个字节读取数据试试看,不要两字节的读取数据。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

maisheng 回答时间:2017-2-20 21:08:17
jtc_88 发表于 2017-2-20 16:24
一个字节一个字节读取数据试试看,不要两字节的读取数据。

不管用 还是那样
maisheng 回答时间:2017-2-20 21:12:25
没有找到问题之前只能先这样改代码:
        HAL_SPI_Transmit(&hspi3, cmd, 4, W25Qx_TIMEOUT_VALUE);       
        HAL_SPI_Receive(&hspi3, odd, 3, W25Qx_TIMEOUT_VALUE);//先读不知道哪里来的3个0
        HAL_SPI_Receive(&hspi3,ID, 2, W25Qx_TIMEOUT_VALUE);
zhjb1 回答时间:2017-2-20 21:23:56
以前遇到类似问题,是AD未完成就开始读取数据。可以尝试AD完全完成后再读取传输。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

maisheng 回答时间:2017-2-20 22:44:34
zhjb1 发表于 2017-2-20 21:23
以前遇到类似问题,是AD未完成就开始读取数据。可以尝试AD完全完成后再读取传输。 ...

读SPI Flash的ID也是这样,必须先读3个空数据
zhjb1 回答时间:2017-2-21 06:46:46
我是采用mbed,还没有测试hal工程,具体也无法细讨论。在用mbed的过程中,从来买有遇到过不顺心的事。我以后试试hal工程吧。Sorry
maisheng 回答时间:2017-2-21 08:58:49
zhjb1 发表于 2017-2-21 06:46
我是采用mbed,还没有测试hal工程,具体也无法细讨论。在用mbed的过程中,从来买有遇到过不顺心的事。我以 ...

好的 谢谢版主
maisheng 回答时间:2017-2-21 11:04:51
没辙了,把代码改成直接操作寄存器也不行,先不管了。
unsigned char spi_send (unsigned short outb) {
   /* Write and Read a byte on SPI interface. */

  SPI3->DR = outb;
  while (!(SPI3->SR & 0x02));                 /* Wait for transfer to finish */
//        while (!(SPI3->SR & 0x01));
  return (SPI3->DR);                      /* Return received value */

}
maisheng 回答时间:2017-2-22 10:29:26
zoomdy 发表于 2017-2-21 12:57
SPI是全双工的,当MOSI在发送数据的时候,MISO同时也在接收数据,如果说你要先发送4字节然后接收2字节,那 ...

非常感谢。我的MISO是悬空的。根据阁下的意见找到解决办法了。把所有HAL_SPI_Transmit()都换成HAL_SPI_TransmitReceive()就好了。应该是SPI的read fifo中的数据没有读取导致。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

zbber 回答时间:2017-2-22 15:31:26
没有找到问题之前只能先这样改代码:
maisheng 回答时间:2017-2-25 13:58:01
zbber 发表于 2017-2-22 15:31
没有找到问题之前只能先这样改代码:

已经解决了。看你楼上回复。
奇缘时间 回答时间:2017-9-17 00:31:27
你好,最近使用HAL库 SPI通信时也出现了错误,请问你的问题解决了嘛?
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版