Raspberry Pi spidev.h Связь SPI

Я пытаюсь установить spi-связь от RPi (Master) к EtherCAT Device (Slave).

Передача данных получила схему.

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

Это моя созданная попытка. С помощью cs_change я могу указать своему spi-сообщению отменить выбор Chip Select до начала следующей передачи.

char transfer(UINT8 data, char last)
{
char last_transfer = last;
int ret;
uint8_t tx[] = { data };
uint8_t rx[ARRAY_SIZE(tx)] = { };

struct spi_ioc_transfer tr = {
        .tx_buf = (unsigned long)tx,
        .rx_buf = (unsigned long)rx,
        .len = ARRAY_SIZE(tx),
        .delay_usecs = delay,
        .speed_hz = speed,
        .bits_per_word = bits,
        .cs_change = 0,
    };

if (last_transfer)
    tr.cs_change = 1;

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

return rx[tr.len-1];
} 

Первая проблема: я думаю, что уже слишком поздно снимать флажок Chip Select при новой передаче. Итак, мой первый вопрос: есть ли другой способ контролировать мой сигнал Chip Select, может быть, еще одна библиотека, которую я могу использовать ?!

Вторая проблема: я хочу читать из spi без записи, как я могу это понять (с помощью простого чтения (fd ...)?!)

Надеюсь, вы меня поддержите :)


person Blackkeeper    schedule 19.12.2013    source источник


Ответы (2)


Вы имеете в виду приложение spidev_test.c. Похоже, что реализация работает, так как ведомое устройство SPI будет отключено после вашей последней передачи. Он остается выбранным до момента последней передачи в сообщении. Каждое устройство SPI не выбирается, когда оно не используется активно, что позволяет другим драйверам взаимодействовать с другими устройствами, поскольку, возможно, ваша шина SPI используется совместно с другими подчиненными устройствами SPI. Более того, вы собираетесь использовать полнодуплексный режим. Очевидно, что стандартная операция read () является только полудуплексной. Таким образом, всякий раз, когда ваше ведомое устройство SPI хочет отправить данные контроллеру SPI (главному), оно должно иметь некоторый механизм прерывания, чтобы ваш драйвер / приложение могло установить для контроллера SPI значение «SPI_IOC_RD_MODE» и могло сделать «SPI_IOC_MESSAGE», предоставляя только rx_buf ИЛИ вы можете использовать только простую операцию read (), так как передача будет half_duplex после установки контроллера SPI в режим чтения. -Sumeet

person Sumeet_Jain    schedule 25.12.2013

Вы можете использовать режим SPI_NO_CS и переключать контакты CS как GPIO с помощью библиотеки wiringPi ... (из http://wiringpi.com/ < / а>)

person Gert van den Berg    schedule 31.12.2013