【问题标题】:Why spi.recieve() function always return zero in SPI of mbed?为什么 spi.recieve() 函数总是在 mbed 的 SPI 中返回零?
【发布时间】:2019-10-06 01:17:01
【问题描述】:

我想在两个mbed板之间建立一个SPI连接,我发现用于检测来自主控的数据传输的spi.recieve()函数总是返回零,无法建立连接。

我尝试在我的代码中删除“if”,它可以工作,但我仍然不明白为什么函数返回零。

这里有一些代码:

while (1)
  {
    transmit_value = 100 * voltage;
    spislave.reply(transmit_value);
    if (spislave.receive())
    {
      receive_value = spislave.read();
    }

这是我完成的代码:

#include <mbed.h>
Serial pc(USBTX, USBRX);
SPISlave spislave(p5, p6, p7, p8);
AnalogIn voltage(p20);
PwmOut led(p21);
BusOut display(p9, p10, p11, p12, p13, p14, p15, p16);
DigitalOut GroundLeft(p27);
DigitalOut GroundRight(p28);
int main()
{
  char transmit_value = 50;
  char receive_value = 60;
  spislave.format(8,0);
  spislave.frequency(1000000);
  while (1)
  {
    transmit_value = 100 * voltage;
    spislave.reply(transmit_value);
    if (!spislave.receive())
    {
      receive_value = spislave.read();
    }
    led.write(receive_value / 100.0);
    int leftnum = receive_value / 10;
    int rightnum = receive_value % 10;
    pc.printf("%d\n", receive_value);
    GroundLeft = 0;
    GroundRight = 1;
    switch (leftnum)
    {
    case 0:
      display = 0x3F;
      break;
    case 1:
      display = 0x06;
      break;
    case 2:
      display = 0x5B;
      break;
    case 3:
      display = 0x4F;
      break;
    case 4:
      display = 0x66;
      break;
    case 5:
      display = 0x6D;
      break;
    case 6:
      display = 0x7D;
      break;
    case 7:
      display = 0x07;
      break;
    case 8:
      display = 0x7F;
      break;
    case 9:
      display = 0x6F;
      break;
    }
    wait(0.01);
    GroundLeft = 1;
    GroundRight = 0;
    switch (rightnum)
    {
    case 0:
      display = 0x3F;
      break;
    case 1:
      display = 0x06;
      break;
    case 2:
      display = 0x5B;
      break;
    case 3:
      display = 0x4F;
      break;
    case 4:
      display = 0x66;
      break;
    case 5:
      display = 0x6D;
      break;
    case 6:
      display = 0x7D;
      break;
    case 7:
      display = 0x07;
      break;
    case 8:
      display = 0x7F;
      break;
    case 9:
      display = 0x6F;
      break;
    }
    wait(0.01);
  }
}

【问题讨论】:

    标签: c++ spi mbed


    【解决方案1】:

    您为什么不遵循参考代码? https://os.mbed.com/docs/mbed-os/v5.9/reference/spislave.html

    对于 SPI,您必须了解 RX 和 TX 同时发生,并且操作需要一些时间。

    .reply() 设置要发送的内容,.receive() 检查是否已收到某些内容(可能不会立即收到),.read() 从 SPI 控制器获取数据。

    【讨论】:

    • 我的代码是从那个例子修改的,除了'.receive()'函数之外一切都是正确的。当我从主人那里收到东西时,'.receive()' 仍然返回零,我想知道为什么。
    • 从工作示例开始,不断调整您的代码直到它中断 - 您会发现问题。
    • 您更新的代码与我描述的问题相同。你在reply 之后立即调用receive,所以对我来说失败是有道理的。在 mbed 示例中,当 receive 失败时,循环将继续并重试,直到成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-21
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多