完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
以前用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库的问题?哪位兄弟遇到过? |
|
相关推荐
10个回答
|
|
SPI是全双工的,当MOSI在发送数据的时候,MISO同时也在接收数据,如果说你要先发送4字节然后接收2字节,那么实际上发送了6字节,4字节你指定的数据和2字节FF,接收到的也是6个字节,要自己丢弃前面4个字节。一般来讲,接收的数据应该是FF,你收到的是0,我想问一下,你的MISO是上拉还是下拉或者是浮空?如果MISO是下拉那接收到0就对了,如果是浮空,那接收到0的可能性也很大。
|
|
|
|
刚才跟踪了一下,发现打了断点后能看到数据是正确的,但是不知道为什么就读不到。
|
|
|
|
一个字节一个字节读取数据试试看,不要两字节的读取数据。
|
|
|
|
|
|
|
|
没有找到问题之前只能先这样改代码:
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); |
|
|
|
以前遇到类似问题,是AD未完成就开始读取数据。可以尝试AD完全完成后再读取传输。
|
|
|
|
|
|
|
|
我是采用mbed,还没有测试hal工程,具体也无法细讨论。在用mbed的过程中,从来买有遇到过不顺心的事。我以后试试hal工程吧。Sorry
|
|
|
|
|
|
没辙了,把代码改成直接操作寄存器也不行,先不管了。
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 */ } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
使用stm32l451片子,对ad7606进行3通道100k采样值跳动问题?
884 浏览 1 评论
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1429 浏览 2 评论
1748 浏览 3 评论
1348 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1476 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-22 14:22 , Processed in 0.909510 second(s), Total 90, Slave 74 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号