Несколько (4x) SPI-устройств на Rasberry Pi 2 под управлением Windows 10 iot
Я успешно установил связь с одним устройством SPI (MCP3008). Возможно ли запустить несколько (4x) SPI-устройств на Raspberry Pi 2 с Windows 10 iot?
- Я думаю вручную подключить линию CS(выбор микросхемы) и активировать ее перед вызовом функции spi и активировать ее после выполнения функции spi. Это может быть работа на Windows 10 IOT?
- Как насчет настройки контакта выбора чипа Spi? Изменить номер контакта во время инициализации SPI? Это возможно?
- Есть ли более разумный способ использования нескольких (4 x MCP3008) SPI-устройств на Windows 10?
(Я планирую контролировать 32 аналоговых сигнала, которые будут поступать на мой Raspberry Pi 2 под управлением Windows 10 iot)
Большое спасибо!
2 ответа
Конечно, вы можете использовать столько раз, сколько хотите (столько же контактов GPIO). Вам просто нужно указать устройство, на которое вы звоните.
Сначала установите конфигурацию SPI, например, используя строку выбора микросхемы 0
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;
}
От: https://projects.drogon.net/understanding-spi-on-the-raspberry-pi/
В настоящее время Raspberry Pi реализует только основной режим и имеет 2 контакта выбора микросхемы, поэтому может управлять 2 устройствами SPI.(Хотя некоторые устройства имеют свою собственную схему субадресации, поэтому вы можете разместить больше из них на одной шине)
Я успешно использовал 2 SPI-устройства в проекте DeviceTester и Breathalyzer в репозитории GitHub IoT Devices от Jared Bienz.
Обратите внимание, что в каждом проекте дескриптор интерфейса SPI явно объявляется в свойстве ControllerName для ADC и Display, используемых в обоих этих проектах. Подробную информацию о проекте Breathalyzer можно найти в моем блоге.
// 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,
};