UWP上的GPIO上的SPI

时间:2019-02-07 19:54:34

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

我尝试将max7219与在Raspberry Pi 3上运行的UWP应用程序集成。
max7219连接到跟随引脚:

  • 40(GPIO21)-时钟
  • 38(GPIO20)-数据
  • 36(GPIO16)-CS

本机SPI端口:19、21、23、24、26忙于触摸板。
我没有找到如何配置.NET Windows.Devices.SerialCommunication.SerialDevice以使用GPIO端口,因此我从Arduino移植了shiftOut,如下所示:

    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上运行,并通过shiftOut函数使用了GPIO端口。

现在,我通过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 }

但表盘上的LED(由max7219管理)以闪烁的方式闪烁
我认为基于芯片的数据表,问题在于-Raspberry处理器的频率。

max7219 timing Arduino的运行频率约为50 MHz,而Rasbpery Pi 3的运行频率为1.4 GHz。 Tcl,Tch等值在Arduino上处于可接受范围内,可能约为1微秒,但在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 :(得分:1)

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);
}