我正在构建一个使用HID OEM75作为锁定机制的访问点的项目。我们通过Arduino Duemilanove(ATmega328)进行控制。我们正在与SPI合作以获得安全性和(显然)支持。 (我意识到任何RFID芯片的安全性都很差。)
我目前正在努力从读卡器通过SPI接收字节。
读卡器处于自主读取模式,这意味着它读取卡片,向Arduino发送信号(通过卡片存在线,与SPI分开),告诉Arduino将Slave Select线拉高以激活从读卡器转移周期。这是我遇到麻烦的地方,我无法理解如何让Arduino只读取来自读卡器的字节,而不向读卡器发送任何命令字节?
默认命令结构SPI.transfer(0x00)发送一个字节(在本例中为虚拟字节0x00),然后从源接受一个字节,但由于我们的源是自主运行的,它不会接受虚拟字节(这实际上会搞乱它的操作)。
简单地说:我们如何使用Arduino的SPI库接受来自从源的字节串而不从主源发送字节?
答案 0 :(得分:0)
如果我没有错,使用SPI总线作为主设备就像将一个虚拟字节移位到从设备,同时反向读取输入字节。
答案 1 :(得分:0)
嗯,这有点晚了,但是嘿,它会帮助那里的人。
首先关闭:
告诉Arduino将Slave Select线拉高以激活 来自读卡器的传输周期。
这是SPI,你将Slave Select拉低以激活从机,而不是高。当别人在说话的时候,你说得很高兴。
我无法理解如何让Arduino简单地读取字节 从读卡器进入而不发送任何命令字节 读卡器?
那是因为你没有。在SPI中,主设备(arduino设置为和SPI.h库假设)启动通信。它在MOSI线路上发送数据,从机在MISO线路上响应。如果你没有什么可说的奴隶,只需发送0xFF或任何虚拟字节,然后检查MISO上的内容。在arduino上,我相信它存储在SPDR,SPI数据寄存器中。或者使用spi库为您提供的任何内容。
但是因为我们的源是自主运行的,所以它不会接受 虚拟字节(这实际上会搞乱它的操作)。
如果情况是你真的无法将数据发送到SPI从设备而没有搞砸,那么它实际上并没有实现SPI,而arduino SPI库也无法帮助你。你必须破解自己的解决方案。 SPI标准实际上非常松散,各种各样的人都以自己的特殊方式来做。这非常令人讨厌。我见过设备使用SS线来启动时钟同步。这意味着你不能只是把它绑在地上让奴隶永远打开。
在你写完之前,我建议调查它为什么不接受虚拟字节。您可能正在使用结合了MOSI和MISO的“3线”SPI并将其从全双工转换为半双工,您必须正确使用时序,以免践踏所有内容。
当了解SPI的细节时,示波器可以看到实际发生的事情和您认为应该发生的事情。