0

我正在构建一个使用 HID OEM75 作为锁定机制访问点的项目。我们通过 Arduino Duemilanove (ATmega328) 进行控制。我们正在与SPI合作以提供安全性和(显然)支持。(我意识到任何 RFID 芯片的安全性都很弱。)

我目前正在努力通过 SPI 从读卡器接收字节。

读卡器处于自主读取模式,这意味着它读取卡,向 Arduino 发送信号(通过卡存在线,与 SPI 分开),这告诉 Arduino 将 Slave Select 线拉高以激活从读卡器。这是我遇到麻烦的地方,我不明白如何让 Arduino 简单地读取来自读卡器的字节而不向读卡器发送任何命令字节?

默认命令结构 SPI.transfer(0x00) 发送一个字节(在本例中为虚拟字节 0x00),然后从源接收一个字节,但由于我们的源是自主运行的,它不会接受虚拟字节(这实际上会扰乱它的操作)。

简而言之:我们如何使用 Arduino 的 SPI 库在不从主源发送字节的情况下从从源接收一串字节?

4

2 回答 2

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 的本质时,示波器可以很好地查看实际发生的情况与您认为应该发生的情况。

于 2013-10-04T15:22:11.627 回答
0

如果我没记错的话,使用 SPI 总线作为主机就像将一个虚拟字节转移到从机,同时反向读取传入的字节。

  • 来自 Embedded24.net 的适用于 Windows 的 USB HID 主机驱动程序
于 2011-03-18T11:50:36.080 回答