我尝试将max7219与在Raspberry Pi 3上运行的UWP应用程序集成。
max7219连接到跟随引脚:
本机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处理器的频率。
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和其他库。
有什么解决办法?
答案 0 :(得分:1)
Raspberry Pi 3上有两个本机SPI,您可以使用SPI1:
使用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);
}