rasberry pi 2上的多个(4x)SPI设备运行Windows 10 iot

时间:2016-02-26 09:07:31

标签: raspberry-pi2 spi windows-10-iot-core windowsiot

我已成功通信单个SPI设备(MCP3008)。是否可以在带有Windows 10的Rasberry pi 2上运行多个(4x)SPI设备?

  1. 我想手动连接CS(芯片选择)线并在调用spi函数之前将其激活,并在完成spi功能后激活它。 它可以在Windows 10上工作吗?
  2. 如何配置spi芯片选择引脚?在SPI初始化期间更改引脚号?那可能吗?
  3. 在Windows 10上使用多个(4 x MCP3008)SPI设备的更聪明的方法是什么?
  4. (我打算监控32个模拟信号,这个信号将输入到运行Windows 10的树莓pi 2中)

    非常感谢!

2 个答案:

答案 0 :(得分:0)

来自:https://projects.drogon.net/understanding-spi-on-the-raspberry-pi/

Raspberry Pi此时仅实现主模式,并具有2个芯片选择引脚,因此可以控制2个SPI器件。 (虽然有些设备有自己的子寻址方案,所以你可以把更多的设备放在同一条总线上)

我在Jared Bienz DeviceTester project内的Breathalyzer projectIoT Devices GitHub repo成功使用了2个SPI设备。

请注意,在每个项目中,SPI接口描述符在ControllerName属性中显式声明,用于这两个项目中使用的ADC和Display。有关Breathalyzer项目的详细信息,请访问我的blog

    // ADC
    // Create the manager
    adcManager = new AdcProviderManager();

    adcManager.Providers.Add(
        new MCP3208()
        {
            ChipSelectLine = 0,
            ControllerName = "SPI1",
        });

    // Get the well-known controller collection back
    adcControllers = await adcManager.GetControllersAsync(); 

    // Create the display
    var disp = new ST7735()
    {
        ChipSelectLine = 0,
        ClockFrequency = 40000000, // Attempt to run at 40 MHz
        ControllerName = "SPI0",
        DataCommandPin = gpioController.OpenPin(12),
        DisplayType = ST7735DisplayType.RRed,
        ResetPin = gpioController.OpenPin(16),

        Orientation = DisplayOrientations.Portrait,
        Width = 128,
        Height = 160,
    };

答案 1 :(得分:0)

当然,您可以使用任意数量的GPIO(尽可能多的GPIO引脚)。 您只需要指出要呼叫的设备。

首先,使用芯片选择线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;
}