两个 RFID RC522 Raspberry PI 2 Windows 物联网
Two RFID RC522 Raspberry PI 2 Windows IOT
如果我想通过 SPI 连接第二个 rfid reader,我应该在主题 的 class 中更改什么?
我将第二个 "ss line" 连接到 SPI_CE1_N 引脚,将 "reset line" 连接到 GPIO12 引脚。
我在 class Mfrc522 中添加了一个构造函数,我使用 SPI_CONTROLLER_NAME、SPI_CHIP_SELECT_LINE、RESET_PIN 作为参数但没有成功。
第一次初始化
public async Task InitIO()
{
...
...
try
{
settings = new SpiConnectionSettings(SPI_CHIP_SELECT_LINE);
settings.ClockFrequency = 1000000;
settings.Mode = SpiMode.Mode0;
String spiDeviceSelector = SpiDevice.GetDeviceSelector();
IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(spiDeviceSelector);
_spi = await SpiDevice.FromIdAsync(devices[0].Id, settings);
}
catch (Exception ex)
{
throw new Exception("SPI Initialization Failed", ex);
}
...
...
}
第二次初始化:
public async Task ReInitSpi()
{
_spi.Dispose(); //Here is important.
try
{
if (settings.ChipSelectLine == 0)
{
settings = new SpiConnectionSettings(1); //CS1
}
else
{
settings = new SpiConnectionSettings(SPI_CHIP_SELECT_LINE); //CS0
}
settings.ClockFrequency = 1000000;
settings.Mode = SpiMode.Mode0;
String spiDeviceSelector = SpiDevice.GetDeviceSelector();
IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(spiDeviceSelector);
_spi = await SpiDevice.FromIdAsync(devices[0].Id, settings);
}
/* If initialization fails, display the exception and stop running */
catch (Exception ex)
{
throw new Exception("SPI Initialization Failed", ex);
}
}
每次使用时,例如,这样做:
await mfrc.ReInitSpi();
var writeBuffer = new byte[] { 0x55, 0xaa };
mfrc._spi.Write(writeBuffer);
这对我有用。希望对你有所帮助。
终于解决了问题
感谢 Rita Han 的帮助。您的代码现在运行良好。现在因为我有硬件问题。
我连接的设备如图:
连接示波器后发现MISO总线电压不正确。两种设备都将电压拉低至地。而不是 3,3V 只是 1,24V。 (3,3V CMOS 逻辑电平 1 的最小电压为 2,4V)
为了快速测试,我使用了两个二极管(用于分离输出)和电阻器(用于加速下降沿)。
结果:3.3V - Vf = 2.56V
现在两个设备都运行良好。
我觉得最终还是用SN74HC125N比较好
顺便说一句:为什么不能通过属性更改SS引脚?
_spi.ConnectionSettings.ChipSelectLine = 1;
如果我想通过 SPI 连接第二个 rfid reader,我应该在主题
我将第二个 "ss line" 连接到 SPI_CE1_N 引脚,将 "reset line" 连接到 GPIO12 引脚。
我在 class Mfrc522 中添加了一个构造函数,我使用 SPI_CONTROLLER_NAME、SPI_CHIP_SELECT_LINE、RESET_PIN 作为参数但没有成功。
第一次初始化
public async Task InitIO()
{
...
...
try
{
settings = new SpiConnectionSettings(SPI_CHIP_SELECT_LINE);
settings.ClockFrequency = 1000000;
settings.Mode = SpiMode.Mode0;
String spiDeviceSelector = SpiDevice.GetDeviceSelector();
IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(spiDeviceSelector);
_spi = await SpiDevice.FromIdAsync(devices[0].Id, settings);
}
catch (Exception ex)
{
throw new Exception("SPI Initialization Failed", ex);
}
...
...
}
第二次初始化:
public async Task ReInitSpi()
{
_spi.Dispose(); //Here is important.
try
{
if (settings.ChipSelectLine == 0)
{
settings = new SpiConnectionSettings(1); //CS1
}
else
{
settings = new SpiConnectionSettings(SPI_CHIP_SELECT_LINE); //CS0
}
settings.ClockFrequency = 1000000;
settings.Mode = SpiMode.Mode0;
String spiDeviceSelector = SpiDevice.GetDeviceSelector();
IReadOnlyList<DeviceInformation> devices = await DeviceInformation.FindAllAsync(spiDeviceSelector);
_spi = await SpiDevice.FromIdAsync(devices[0].Id, settings);
}
/* If initialization fails, display the exception and stop running */
catch (Exception ex)
{
throw new Exception("SPI Initialization Failed", ex);
}
}
每次使用时,例如,这样做:
await mfrc.ReInitSpi();
var writeBuffer = new byte[] { 0x55, 0xaa };
mfrc._spi.Write(writeBuffer);
这对我有用。希望对你有所帮助。
终于解决了问题
感谢 Rita Han 的帮助。您的代码现在运行良好。现在因为我有硬件问题。
我连接的设备如图:
连接示波器后发现MISO总线电压不正确。两种设备都将电压拉低至地。而不是 3,3V 只是 1,24V。 (3,3V CMOS 逻辑电平 1 的最小电压为 2,4V)
为了快速测试,我使用了两个二极管(用于分离输出)和电阻器(用于加速下降沿)。
结果:3.3V - Vf = 2.56V
现在两个设备都运行良好。
我觉得最终还是用SN74HC125N比较好
顺便说一句:为什么不能通过属性更改SS引脚?
_spi.ConnectionSettings.ChipSelectLine = 1;