Трассировка SPI Linux — Нет сообщения о передаче

#c #linux-kernel #linux-device-driver #embedded-linux #spi

Вопрос:

Я пытаюсь передавать сообщения с помощью подсистемы SPI. IC, MCP3004, которым я хочу управлять, отлично работает на Raspberry PI с помощью библиотеки WiringPi. Но когда я непосредственно использую подсистему на плате Nvidia Jetson NX, ничего не работает. Поэтому я посмотрел на трассировку ядра подсистемы SPI как на RPi, так и на Jetson и заметил разницу, которую я не могу объяснить.

Это трассировка, поступающая из RPi с помощью WiringPi:

 ThreadContainer-1855  [003] ....  1420.527218: spi_master_busy: spi0
 ThreadContainer-1855  [003] ....  1420.527219: spi_message_start: spi0.0 96885e98
 ThreadContainer-1855  [003] ....  1420.527223: spi_transfer_start: spi0.0 a0bd8840 len=3
 ThreadContainer-1855  [003] ....  1420.527269: spi_transfer_stop: spi0.0 a0bd8840 len=3
 ThreadContainer-1855  [003] ....  1420.527275: spi_message_done: spi0.0 96885e98 len=3/3
 ThreadContainer-1855  [003] d...  1420.527313: spi_message_submit: spi0.0 96885e98
 ThreadContainer-1855  [003] ....  1420.527316: spi_master_busy: spi0
 

И это след, поступающий из моего кода непосредственно с помощью spidev:

 ThreadContainer-14341 [005] ....  1987.023261: spi_master_busy: spi0
 ThreadContainer-14341 [005] ....  1987.023262: spi_message_start: spi0.0 ffffffc17e16bd48
 ThreadContainer-14341 [005] ....  1987.023430: spi_message_done: spi0.0 ffffffc17e16bd48 len=3/3
 ThreadContainer-14341 [005] d..1  1987.023438: spi_message_submit: spi0.0 ffffffc17e16bd48
 ThreadContainer-14341 [005] ....  1987.023440: spi_message_start: spi0.0 ffffffc17e16bd48
 ThreadContainer-14341 [005] ....  1987.023561: spi_message_done: spi0.0 ffffffc17e16bd48 len=3/3
            spi0-1487  [003] ....  1987.023570: spi_master_idle: spi0
 

Оба содержат начало сообщения, но в моем коде, похоже, нет spi_transfer события.

Код, вызывающий подсистему, выглядит следующим образом:

 int spi_transfer(spi_t *spi, const uint8_t *txbuf, uint8_t *rxbuf, size_t len) {
    struct spi_ioc_transfer spi_xfer;

    /* Prepare SPI transfer structure */
    memset(amp;spi_xfer, 0, sizeof(struct spi_ioc_transfer));
    spi_xfer.tx_buf = (uintptr_t)txbuf;
    spi_xfer.rx_buf = (uintptr_t)rxbuf;
    spi_xfer.len = len;
    spi_xfer.delay_usecs = 0;
    spi_xfer.speed_hz = 1000000;
    spi_xfer.bits_per_word = 8;

    /* Transfer */
    if (ioctl(spi->fd, SPI_IOC_MESSAGE(1), amp;spi_xfer) < 1)
        return _spi_error(spi, SPI_ERROR_TRANSFER, errno, "SPI transfer");

    return 0;
}
 

Что кажется очень похожим на код, содержащийся в WiringPi.

Мне кажется, что передача просто не происходит, хотя с электрической стороны все, кажется, подключено правильно.

Может быть, кто-нибудь с более глубоким пониманием системы SPI, чем я, имеет какое-либо представление о том, что происходит, что просто нет передачи сообщений.

Спасибо

Комментарии:

1. Работает ли ваш прямой код spidev (без WiringPi) на RPi?