Ioctl "не может отправить spi сообщение: неверный аргумент" Beaglebone Black - PullRequest
1 голос
/ 03 июня 2019

Я пытаюсь отправить 16-битные сообщения от моего черного beaglebone на spidev1.0 (устройство 1 шины 1) на микросхему TLV5618AC

Линия выбора микросхемы должнапереходите от высокого к низкому уровню, прежде чем регистры сдвига начнут собирать биты с падающего фронта часов

Я выполнил модифицированную версию spidev_test.c (оригинал работал нормально).Так как мне нужна строка выбора микросхемы для перехода от высокого к низкому между сообщениями - строка ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr); не будет работать, потому что она передает данные в виде одного сообщения.Даже если я помещу ioctl () в цикл for, он не будет работать, потому что это первое и последнее сообщение.

Следующий код работает

static void transfer(int fd)
{
    int ret;
  unsigned short buffer[1];
  int zero = 0;

    FILE *iFile = fopen("firsttest.bin", "r");
  if (iFile == NULL)
    {
        printf("Cannot open file \n");
        exit(0);
    }

  struct spi_ioc_transfer tr = {
      .tx_buf = (unsigned long)zero,
      .rx_buf = (unsigned long)zero,
      .len = 2,
      .delay_usecs = delay,
      .speed_hz = speed,
      .bits_per_word = bits,
    };


  while(!feof(iFile)){
      fread(buffer,2,1,iFile);
      unsigned short *tx = buffer;
      unsigned short rx[1] = {0, };
      tr.tx_buf = (unsigned long)tx;
      tr.rx_buf = (unsigned long)rx;
      int size = ARRAY_SIZE(tx);


        ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
        if (ret < 1)
            pabort("can't send spi message");

        for (ret = 0; ret < 1; ret++) {
            printf("0x%04x\n", tx[ret]);

        }

  }
}

Этот второй блок кода не

  {
    int ret;
    unsigned short buffer[1];
    int zero = 0;

    FILE *iFile = fopen("firsttest.bin", "r");
    if (iFile == NULL)
      {
          printf("Cannot open file \n");
          exit(0);
      }

    struct spi_ioc_transfer tr[100];
        unsigned short *p = (unsigned short*) calloc(100, sizeof(unsigned short));
        unsigned short *p2 = (unsigned short*) calloc(100, sizeof(unsigned short));


  while(!feof(iFile)){
    unsigned short *tx = p2;
    unsigned short *rx=p;
    for(int j = 0; j< 100; j++){
      fread(buffer,2,1,iFile);
      tx = (unsigned short*) &buffer+j;
      tr[j].tx_buf = (unsigned long)tx;
      tr[j].rx_buf = 0;
      tr[j].len = 2;/* Total length of message in bytes*/
      tr[j].delay_usecs = delay;
      tr[j].speed_hz = speed;
      tr[j].bits_per_word = bits;
      tr[j].cs_change = 1;

    }


      ret = ioctl(fd, SPI_IOC_MESSAGE(100), &tr);
      if (ret < 1)
        pabort("can't send spi message");
    for(int v = 0; v<100; v++){
      printf("0x%04x\n", rx);
    }
  }
    free(p);
}

Второй блоккода выдает эту ошибку

"не может отправить spi-сообщение: Неверный аргумент"

Поскольку это недопустимый аргумент, я попытался передать '& tr', а также 'tr' в noпомогло.Любой вклад будет оценен.

РЕДАКТИРОВАТЬ: Таким образом, я решил использовать первый код, который работал.Я думаю, что нет причин отправлять крупные переводы.Моя система достаточно быстра, чтобы напряжения были достаточно быстрыми, чтобы эффективно работать в режиме реального времени !!Спасибо за помощь.(Я также много очищал свой код, чтобы его было легче читать!)

1 Ответ

1 голос
/ 04 июня 2019

Просматривая это, я понимаю, что вы, возможно, неправильно определяете свой tr [j] .rx_buf, и это может привести к неверному аргументу. Должно быть выделенное хранилище, которое я предполагаю * p, но вы не связываете это с аргументом tr.

...