Я пытаюсь реализовать тайм-аут для некоторых аппаратных передач, чтобы добавить безопасность в большой проект. Я уже использовал тайм-аут с использованием select
для передачи UART, но я не знаю, как добавить тайм-аут в передаче SPI.Тайм-аут SPI в Linux и C
Это мое считывание код:
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. Можете ли вы дать мне какие-нибудь намеки?
Так что SPI не блокирует? – markmb
SPI не будет блокироваться бесконечно. Возможно, у вас может быть очень длинный обмен (или медленная скорость передачи), который заставил передачу взять больше времени, чем вы хотите подождать, но в качестве мастера SPI вы заранее знаете скорость передачи и длину данных; не было бы сюрпризов в отсрочке. Я использовал чип флэш-памяти SPI, который вы * могли * прочитать все с помощью одной команды SPI, но я никогда не видел протокол SPI, где длина чтения могла бы зависеть от самих данных. – Michael