#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?