Почему функция spi.recieve () всегда возвращает ноль в SPI mbed? - PullRequest
0 голосов
/ 19 мая 2019

Я хочу установить соединение SPI между двумя платами mbed, и я обнаружил, что функция 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);
  }
}

1 Ответ

0 голосов
/ 20 мая 2019

Почему вы не следуете ссылочному коду?https://os.mbed.com/docs/mbed-os/v5.9/reference/spislave.html

С SPI вы должны понимать, что RX и TX происходят одновременно и что операция займет некоторое время.

.reply() устанавливает, что отправлять,.receive() проверяет, было ли что-то получено (что, вероятно, не будет немедленно), и .read() получает данные от контроллера SPI.

...