SPI через GPIO на UWP - PullRequest
       117

SPI через GPIO на UWP

0 голосов
/ 07 февраля 2019

Я пытаюсь интегрировать max7219 с приложением UWP, работающим на Raspberry Pi 3.
max7219, подключенным к следующим контактам:

  • 40 (GPIO21) - Часы
  • 38 (GPIO20) - Данные
  • 36 (GPIO16) - CS

Собственные порты SPI: 19, 21, 23, 24, 26 заняты сенсорной панелью.
Я не сделалнашел, как настроить .NET Windows.Devices.SerialCommunication.SerialDevice для использования портов GPIO, поэтому я портировал shiftOut из Arduino следующим образом:

    private void shiftOut(BitOrder aBitOrder, byte val)
    {
        if (aBitOrder == BitOrder.LSBFIRST) {
            for (byte i = 0; i < 8; i++)
            {
                GpioPinValue __val = (val & (1 << i)) == 0x0 ? 
                    GpioPinValue.Low : 
                    GpioPinValue.High;

                _data_pin.Write(__val);
            }
        } else {
            for (byte i = 0; i < 8; i++)
            {
                GpioPinValue __val = (val & (1 << (7 - i))) == 0x0 ? 
                    GpioPinValue.Low : 
                    GpioPinValue.High;

                _data_pin.Write(__val);
            }
        }

        _clock_pin.Write(GpioPinValue.High);
        _clock_pin.Write(GpioPinValue.Low);
    }

В прошлом проект работал на Arduino Avr и использовал порты GPIO через *Функция 1018 *.

Теперь я запускаю проект на Raspberry Pi 3. Я предоставляю следующие данные для чипа:

{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x1, 0x01, 0x01 },
{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 },
{ 0x01, 0x01, 0x01, 0x01, 0x01, 0x1, 0x01, 0x01 }

, но светодиоды на циферблате (который управляется max7219) хаотично мерцают .
Основываясь на спецификации чипа, я думаю, что проблема - частота процессора Raspberry.

max7219 timing В то время как Arduino работает с частотой приблизительно 50 МГц, Rasbpery Pi 3 работает с частотой 1,4 ГГц.Значения, такие как Tcl, Tch и т. Д. Находились в диапазоне приемлемости на Arduino, может быть, что-то около микросекунды, но на Raspberry это может быть 1 или 2 наносекунды.

Следующая проблема - я не могувставьте достаточно короткую паузу между записями, минимальная пауза может составлять миллисекунду, и я считаю, что это слишком много для стандартов SPI:

_clock_pin.Write(GpioPinValue.High);
Task.Delay(-1).Wait(1);  
_clock_pin.Write(GpioPinValue.Low);

Другая проблема, я запускаю проект с Visual Studio 2015, поэтому я могуне использовать библиотеки Nuget как RaspberrySharp и др.
Какое может быть решение?

1 Ответ

0 голосов
/ 08 февраля 2019

На Raspberry Pi 3 есть два собственных SPI, вы можете использовать SPI1:

enter image description here

Пример кода использования SPI1:

// Use chip select line CS0
var settings = new SpiConnectionSettings(0);
// Set clock to 10MHz 
settings.ClockFrequency = 10000000;

// Get a selector string that will return our wanted SPI controller
string aqs = SpiDevice.GetDeviceSelector("SPI1");

// Find the SPI bus controller devices with our selector string
var dis = await DeviceInformation.FindAllAsync(aqs);

// Create an SpiDevice with our selected bus controller and Spi settings
using (SpiDevice device = await SpiDevice.FromIdAsync(dis[0].Id, settings))
{
    byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };
    device.Write(writeBuf);
}
...