我对Windows 10 iot和SPI通信有疑问。我尝试与Raspberry PI的扩展板进行通信。要与电路板通信,我使用SPI0。第一个从器件位于GPIO 7(引脚26)上,第二个片选器位于GPIO 24(引脚18)上,第三个器件位于GPIO 08(引脚24)上。
Pins的位置由制造商确定,系统最初用于linux。
与奴隶1(CS1)的沟通非常有效。但这就是全部。我的问题是与第二和第三奴隶说话。我尝试将GPIO 24用作输入/输出GPIO,以便在从CS0读取之前设置通信,但是没有机会。
目前,我正在使用硬件黑客攻击。我使用电缆将PIN 18连接到PIN 24,但是,我不想打开每个系统来放置电缆桥。
是否有可能为树莓派设置自定义窗口10 iot图像,将针脚26用作CS0,针脚24用作CS1,针脚18用作CS2?
答案 0 :(得分:1)
正如@Rita Han指出的那样,板载SPI控制器不支持针对SPI芯片选择的引脚18复用。但是,如果您稍微破解spi驱动程序,我认为仍然可以使用引脚18作为CS引脚。
因此收件箱SPI驱动程序位于此处,https://github.com/ms-iot/bsp/tree/master/drivers/spi/bcm2836,如果查看源代码,可以在每次SPI数据传输之前和之后看到,它设置SPI寄存器以切换芯片选择引脚
所以你可以在这里做的不是使用默认的板载spi驱动程序,而是尝试使用GPIO控制器在收件箱SPI驱动程序中切换引脚18的电压。
SPI芯片选择引脚具有松弛的时序要求,所以我认为使用GPIO时序应该没问题。
之后,您需要关注一些tutorial来创建自定义窗口iot image。
答案 1 :(得分:0)
是否有可能为其设置自定义窗口10 iot图像 树莓派使用引脚26作为CS0,引脚24作为CS1和引脚18作为 CS2?
答案是否定的。
因为引脚18是BCM2835的GPIO 24,并且它没有基于BCM2835 data sheet的SPI芯片选择的替代功能。因此,您不能将引脚18用作SPI芯片选择。
答案 2 :(得分:0)
您只需要指明要呼叫的设备即可。
首先,例如,使用芯片选择线0设置SPI的配置
settings = new SpiConnectionSettings(0); //chip select line 0
settings.ClockFrequency = 1000000;
settings.Mode = SpiMode.Mode0;
String spiDeviceSelector = SpiDevice.GetDeviceSelector();
devices = await DeviceInformation.FindAllAsync(spiDeviceSelector);
_spi1 = await SpiDevice.FromIdAsync(devices[0].Id, settings);
您不能在其他操作中使用此引脚!因此,现在您应该使用GpioPin类配置输出端口,该类将用于指示设备。
GpioPin_19 = IoController.OpenPin(19);
GpioPin_19.Write(GpioPinValue.High);
GpioPin_19.SetDriveMode(GpioPinDriveMode.Output);
GpioPin_26 = IoController.OpenPin(26);
GpioPin_26.Write(GpioPinValue.High);
GpioPin_26.SetDriveMode(GpioPinDriveMode.Output);
GpioPin_13 = IoController.OpenPin(13);
GpioPin_13.Write(GpioPinValue.High);
GpioPin_13.SetDriveMode(GpioPinDriveMode.Output);
始终在传输前指示设备:(示例方法)
private byte[] TransferSpi(byte[] writeBuffer, byte ChipNo)
{
var readBuffer = new byte[writeBuffer.Length];
if (ChipNo == 1) GpioPin_19.Write(GpioPinValue.Low);
if (ChipNo == 2) GpioPin_26.Write(GpioPinValue.Low);
if (ChipNo == 3) GpioPin_13.Write(GpioPinValue.Low);
_spi1.TransferFullDuplex(writeBuffer, readBuffer);
if (ChipNo == 1) GpioPin_19.Write(GpioPinValue.High);
if (ChipNo == 2) GpioPin_26.Write(GpioPinValue.High);
if (ChipNo == 3) GpioPin_13.Write(GpioPinValue.High);
return readBuffer;
}