Windows 10 IOT SPI芯片选择与其他引脚或GPIO' S.

时间:2017-01-05 16:47:44

标签: c# raspberry-pi spi windows-10-iot-core

我对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?

3 个答案:

答案 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;
}
相关问题