您好!
我在通过 SPI 读取和写入的寄存器时遇到问题。
我按照文档中的建议写入 SPI Protokoll、但重要的是、我读取从 ADC 获得相同的答案。 (请参阅以下图片)
SPI-Master 是 RP2040。
除此之外、如果我将 CS 线路设置为 GND、我将获得答案、请参阅、如果我将 CS 线路连接到控制器并在通信前后进行切换、我始终从 ADC 获得0。
有什么想法会出什么问题?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好!
我在通过 SPI 读取和写入的寄存器时遇到问题。
我按照文档中的建议写入 SPI Protokoll、但重要的是、我读取从 ADC 获得相同的答案。 (请参阅以下图片)
SPI-Master 是 RP2040。
除此之外、如果我将 CS 线路设置为 GND、我将获得答案、请参阅、如果我将 CS 线路连接到控制器并在通信前后进行切换、我始终从 ADC 获得0。
有什么想法会出什么问题?
尊敬的 Dale:
原理图中的3、3V 和 GND 均已连接。 PICO 和 ADC 具有相同的电源。
目前未连接模拟通道。
如果我尝试读取寄存器0x4、下面的表格显示了最后一次传输的情况、则会出现一张新图片。 都相同。
最后是用于发送 reg_read 的代码的快照。 该函数每1ms 调用一次
iTest = wSPI_ReadRegADC(GAIN1_ADDRESS); WORD wSPI_ReadRegADC(BYTE address) { BYTE bRecvData[3] = {0}; BYTE bData[3] = {0}; WORD iShift = 0; WORD iCmd = OPCODE_RREG | (((WORD)address) << 7); iShift = (iCmd >> 8); bData[0] = TCAST(BYTE, iShift); bData[1] = TCAST(BYTE, iCmd); gpio_put(SPI0_CS0_PIN, false); spi_write_blocking(spi0, bData, 3); if (spi_is_readable(spi0)) { spi_read_blocking(spi0, 0, bRecvData, 3); } gpio_put(SPI0_CS0_PIN, true); return *bRecvData; }
尊敬的 Peter:
我希望您已经将 ADC 上的引脚19和2短接在一起、正如您提到的" GND 均已连接"。 但是、我在 RP2040板和 M04 ADC 之间没有看到接地连接、他们是否有接地连接? 您是否有 M04 ADC 的物理电路板?
此外、您继续向 ADC 发送0xA20000命令、从而无法从 ADC 中看到返回的寄存器数据。 正确的过程是在第一个帧中发送0xA20000命令、然后在 第二个帧中发送0x000000、正如我向您显示的时序那样。
此致、
戴尔
尊敬的 Dale:
我想我已经解决了这个问题。 这是不止一个问题。
首先、接线正确无误、如数据表所示。
1. 如果我通过 RP2040切换 CS 引脚、ADC 无法识别。 ->临时解决方案,将 CS 永久连接到 GND。 可能是 RP2040的问题。
2.我的 SPI-Stream 是 zu short、我只发送4Byte。 但在本例中、ADC 始终需要完整数据流的长度5 * 24位。 (1个响应帧和4个通道帧。 数据表中也提到了、但我漏掉了那个部分。
3.时间不是最好的。 就像您在帖子中所说的那样。 由于 CS 引脚列表始终位于 GND,因此我必须缩短数据流之间的差距,从而获得错误的答案。 我在 SPI 帧之间做了长时间的休息、现在看起来它可以正常工作。
谢谢 Dale 的提示,让我在正确的方向. :-)
但有人对第1点有想法吗?