我已成功通信单个SPI设备(MCP3008)。是否可以在带有Windows 10的Rasberry pi 2上运行多个(4x)SPI设备?
(我打算监控32个模拟信号,这个信号将输入到运行Windows 10的树莓pi 2中)
非常感谢!
答案 0 :(得分:0)
来自:https://projects.drogon.net/understanding-spi-on-the-raspberry-pi/
Raspberry Pi此时仅实现主模式,并具有2个芯片选择引脚,因此可以控制2个SPI器件。 (虽然有些设备有自己的子寻址方案,所以你可以把更多的设备放在同一条总线上)
我在Jared Bienz DeviceTester project内的Breathalyzer project和IoT 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;
}