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

问个关于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 评论15 发布时间:2017-2-20 14:47

举报

15个回答
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通信时也出现了错误,请问你的问题解决了嘛?
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版