2013-12-11 5 views
3

Я пытаюсь реализовать тайм-аут для некоторых аппаратных передач, чтобы добавить безопасность в большой проект. Я уже использовал тайм-аут с использованием 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. Можете ли вы дать мне какие-нибудь намеки?

ответ

4

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

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

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

Typical SPI protocol

+0

Так что SPI не блокирует? – markmb

+1

SPI не будет блокироваться бесконечно. Возможно, у вас может быть очень длинный обмен (или медленная скорость передачи), который заставил передачу взять больше времени, чем вы хотите подождать, но в качестве мастера SPI вы заранее знаете скорость передачи и длину данных; не было бы сюрпризов в отсрочке. Я использовал чип флэш-памяти SPI, который вы * могли * прочитать все с помощью одной команды SPI, но я никогда не видел протокол SPI, где длина чтения могла бы зависеть от самих данных. – Michael

Смежные вопросы