完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我有STM32L052K8T6(主机),我试图通过SPI与AD7124-4 ADC(从机)通信。我的问题是STM在从tx缓冲区传输所有数据(在外部示波器上检查)后立即停止在SCLK上传输时钟脉冲,并忽略等待应答直到超时到期的请求。当没有时钟同步时,Slave没有机会回答。 我的代码: void initSPI (void) 我在调用这个函数:
即使我有一个很长的超时,它也会被忽略。 HAL_SPI_TransmitReceive()返回HAL_OK。 我的初始化有问题吗? |
|
相关推荐
5个回答
|
|
SCLK在设备不发送时停止是标准的,因为SCLK通常会强制双向通信。在这种情况下,ADC实际上一次只能在一个方向上进行通信,无论是设备接收到命令还是发送数据,并且它们表现得很差。
您需要在命令后发送一些空数据以强制时钟处于活动状态。看起来数据表建议发送0,但不清楚设备是否注意数据。 如果ADC希望在命令字节和数据之间有特定的时间,则可能需要手动控制CS线,以便在延迟时保持低电平。 |
|
|
|
我发现将SPI描述为循环移位寄存器很有用,其中主机和从机只是整个移位寄存器的两个连接部分。
|
|
|
|
是的,循环移位寄存器是一个完美的描述
|
|
|
|
我认为你误解了功能的HAL_SPI_TransmitReceive功能。它不首先发送tx缓冲区然后接收到rx缓冲区。它同时做到了。毕竟SPI是全双工协议。它可以同时传输(从MOSI)和接收(MISO)。
要在单个函数调用中实现所需,您应该使用大小的缓冲区2。喜欢这个: HAL_SPI_TransmitReceive(&hspi1, &tx, &rx, 2, 10000); TX缓冲区的第二个字节(tx [1])或在RX缓冲区的第一个字节(rx [0])中读取的内容无关紧要。只需确保将正确的数据输入tx [0]并从rx [1]获取接收的数据并忽略其余数据。 PS:我没有检查你提到的从设备的数据表。一些设备在第一个时钟周期开始发送数据。确保正确理解协议。 |
|
|
|
多谢你们。
我将你的答案与工作解决方案结合起来。因为ADC(从机)等待命令并且它在之后应答,我不得不强制SCLK保持“滴答作响”。在这种情况下,通信不是同时双向工作。在有效命令之后我发送0xFF字符(slave忽略它)以使MOSI保持逻辑高电平并且时钟工作。我发送尽可能多的0xFF字符作为答案而且它有效。不是最好的解决方案,而是工作方案。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1129 浏览 0 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1075 浏览 2 评论
2175 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1269 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1693 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 01:04 , Processed in 0.530818 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号