SPI на Arduino с HID-ридером
Я строю проект, который использует HID OEM75 в качестве точки доступа для механизма блокировки. Мы осуществляем контроль через Arduino Duemilanove (ATmega328). Мы работаем с SPI для обеспечения безопасности и (очевидно) поддержки. (Я понимаю, что любой RFID-чип имеет довольно слабую защиту.)
В настоящее время я борюсь с получением байтов через SPI от устройства чтения карт.
Считыватель карт находится в автономном режиме чтения, то есть он читает карту, отправляет сигнал на Arduino (через линию представления карты, отдельно от SPI), которая говорит Arduino поднять линию Slave Select высоко, чтобы активировать цикл передачи из кард-ридер. Здесь я сталкиваюсь с проблемами, я не могу понять, как заставить Arduino просто читать байты, поступающие из устройства чтения карт, не посылая никаких командных байтов в устройство чтения карт?
Структура команды по умолчанию, SPI.transfer(0x00), отправляет байт (в данном случае фиктивный байт 0x00), а затем принимает байт от источника, но поскольку наш источник работает автономно, он не примет фиктивный байт (и это на самом деле испортит его работу).
Проще говоря: как мы можем принять строку байтов из подчиненного источника, не отправляя байты из мастер-источника, используя библиотеку SPI Arduino?
2 ответа
Если я не ошибаюсь, использование шины SPI в качестве мастера похоже на смещение фиктивного байта на подчиненное устройство при чтении входящего байта в обратном порядке.
- USB HID Host драйвер для Windows от встроенного24
Ну, это немного поздно, но эй, это поможет кому-то там.
Прежде всего:
который говорит Arduino потянуть линию Slave Select высоко, чтобы активировать цикл передачи от кард-ридера.
Это SPI, вы нажимаете Slave Select на низкий уровень, чтобы активировать slave, а не на высокий. Вы ставите это высоко, чтобы сказать ему заткнуться, пока другие разговаривают.
Я не могу понять, как я могу заставить Arduino просто читать байты, поступающие из устройства чтения карт, не посылая никаких командных байтов в устройство чтения карт?
Это потому что ты не В SPI ведущее устройство (которое установлено в arduino и предполагается, что библиотека SPI.h) инициирует связь. Он отправляет данные по линии MOSI, а ведомый отвечает по линии MISO. Если вам нечего сказать подчиненному, просто отправьте 0xFF или любые пустые байты, а затем проверьте, что поступило в MISO. На Arduino, я считаю, что хранится в регистре данных SPDR, SPI. Или используйте то, что дает вам spi-библиотека.
но поскольку наш источник работает автономно, он не примет фиктивный байт (и это фактически испортит его работу).
Если дело в том, что вы действительно не можете отправить данные на ведомое устройство SPI, не повредив его, то на самом деле он не реализует SPI, и библиотека Arduino SPI вам не поможет. Вам придется взломать ваше собственное решение. Стандарт SPI на самом деле довольно свободный, и многие люди делают это по-своему. Что очень раздражает. Я видел устройства, использующие линию SS для запуска синхронизации часов. Это означает, что вы не можете просто привязать его к земле, чтобы этот раб всегда был включен.
Прежде чем списать, я бы посоветовал выяснить, почему он не принимает фиктивный байт. Возможно, вы используете "3-проводной" SPI, который объединяет MOSI и MISO и превращает его из полнодуплексного в полудуплексный, и вам придется правильно выбрать время, чтобы не растоптать все.
При осознании сложности SPI осциллограф творит чудеса, чтобы увидеть, что на самом деле произошло, а не то, что, по вашему мнению, должно было произойти.