Тайм-аут SPI в Linux и C

Я пытаюсь реализовать тайм-аут для некоторых аппаратных передач, чтобы повысить безопасность большого проекта. Я уже реализовал тайм-аут, используя select для передачи UART, но я не знаю, как добавить тайм-аут в передачу SPI.

Это мой код чтения:

int spi_read(int fd, char command, char* buffer, int size, int timeout)
{
    struct spi_ioc_transfer xfer[2];
    int status;

    memset(buffer, 0, sizeof(buffer));
    memset(xfer, 0, sizeof(xfer));

    xfer[0].tx_buf = (unsigned int)(&command);
    xfer[0].len = 1;

    xfer[1].rx_buf = (unsigned int)buffer;
    xfer[1].len = size;

    status = ioctl(fd, SPI_IOC_MESSAGE(2), xfer);
    if(status < 0)
        return NOERROR;
    else
        return EHWFAULT1;
}

Он отправляет команду размером в байт и получает ответ определенного размера (в полудуплексном режиме). Как я могу реализовать тайм-аут в ответе? Можно ли это реализовать с помощью select? Должен ли я разделить обе транзакции и использовать select или лучше использовать сигнал тревоги?

Затем у меня тот же вопрос для полнодуплексного режима, который также реализован с использованием ioctl. Можете ли вы дать мне какие-либо намеки?


person markmb    schedule 11.12.2013    source источник


Ответы (1)


В аппаратном обеспечении мастер SPI не «ждет» ответа. По определению, ведущий SPI обеспечивает тактовые циклы, а ведомый должен отвечать. Концепция ожидания ответа не применяется к шине SPI. (Я предполагаю, что вы работаете с мастером SPI)

(Глубже в протоколе SPI может опрашивать аппаратное обеспечение, чтобы узнать, готово ли оно, но сама шина SPI каждый раз получает немедленный ответ).

Чтобы уточнить: SPI синхронизируется с тем, что находится на выводе SPI MISO. Какой бы уровень ни был на выводе MISO, это ответ, даже если ведомое устройство явно не управляет уровнем. Единственный способ обнаружить не отвечающее подчиненное устройство — это подтянуть/вытащить MISO способом, который нельзя интерпретировать как допустимое сообщение.

Типичный протокол SPI

person Michael    schedule 11.12.2013
comment
То есть SPI не блокирует? - person markmb; 11.12.2013
comment
SPI не будет блокироваться бесконечно. Вполне возможно, что у вас может быть очень долгий обмен (или низкая скорость передачи данных), из-за чего передача занимает больше времени, чем вы хотите ждать, но как мастер SPI вы должны заранее знать свою скорость передачи и длину данных; в задержке не было бы сюрпризов. Я использовал микросхему флэш-памяти SPI, которую вы могли прочитать целиком с помощью одной команды SPI, но я никогда не видел протокола SPI, в котором длина чтения могла бы зависеть от самих данных. - person Michael; 16.12.2013