×

阿霍霍伊!我们想让你知道SparkFun因极端天气预报关闭,金沙线上娱乐场3/13/2019。我们不想冷落你——只是因为我们不在办公室,并不意味着你不应该下订单!请使用代码“Goneskiing”享受10%的折扣,今天只!我们将于2019年3月14日恢复正常运营。对于给您带来的不便,我们深表歉意!

欢迎来到实验室

抛光速度

Sparkx产品并不像普通的SparkFun产品那样闪亮或抛光;金沙线上娱乐场我们可以更快地进入市场。你对一个没有经过完全用户测试的电路板满意吗?你能看一下说明书吗?Sparkx是给你的。

不失败

Sparkx不在乎是否有什么事情没有完成。射击,我们非常确定一个想法会奏效。我们会让你知道什么是已知的和测试过的,剩下的由你决定。你对绿线和初学者指南都满意吗?Sparkx是给你的。

去吧!

Sparkx追逐闪亮。如果有一个产品或项目对我们有吸引力,我们会做,不金沙线上娱乐场管市场的考虑。想玩一些可能永远无法上市的东西吗?Sparkx是给你的。

斯帕克斯产品


实验产品:Sparkx产品迅速生产,为您带来最先进的技术。这些产品经过测试,但没有保证。Sparkx产品不提供实时技术金沙官方娱乐场支持。
原型竖琴

原型竖琴

SPX-14799
59.95美元
A111脉冲雷达突破

A111脉冲雷达突破

SPX-14811
49.95美元
GPS U形接头Sam-M8Q(QWIIC)

GPS U形接头Sam-M8Q(QWIIC)

SPX-15106
29.95美元
QWIIC AS3935雷电探测器

QWIIC AS3935雷电探测器

SPX-1557
19.95美元
QWIIC构思工具包

QWIIC构思工具包

SPX-1474
199.95美元
原子钟

原子钟

SPX-14830
1995美元
磁成像磁砖-8x8

磁成像磁砖-8x8

SPX-14652
149.95美元
QWIIC射频识别ID-XXLA

QWIIC射频识别ID-XXLA

SPX-14867
54.95美元

Sparkx博客帖子


保存缓冲区

一个愚蠢的解决方案的愚蠢问题的细节:如何在使用Arduino核心库时不覆盖传出的SPI数据缓冲区

喜爱的 最喜欢的

像许多初出茅庐的制造商一样,修补工和业余爱好者会这样做,我深深地印在可寻址LED上。我是说,即使只点亮一盏灯,也会让人感觉像是你自己的迪斯科派对,所以什么是不爱约100…500…1000 +?在我的项目中,LED的数量呈指数级增长和少量完美主义之间,金沙线上娱乐场我开始关注更新LED数据的最有效方法。这是一个关于硬件修复如何在Arduino IDE周围工作以追求最大速度的故事。

LED和速度的基础知识

在放弃了任何“现实世界应用”的伪装,仅仅承认我们痴迷于最高性能之后,让我们决定如何最快地输出LED数据。这个问题从选择LED条开始。有两种主要类型的LED条带-那些具有双线控制,就像APA102,而那些只有一根电线控制的,像WS2812B。一条线控制仅使用一条数据线,并且依赖主(Arduino)和从(在本例中是LED)来约定数据频率。双线控制,另一方面,使用时钟线准确地告诉LED输入数据的有效时间。这使得通信更加快速和灵活。以下是对相似和不同之处的简要概述:

双线(APA102) 单线(WS2812B)
颜色深度(位) 二十四 二十四
亮度 惊人的 耀眼的
通信 同步的 异步的
最小比特率 0赫兹 800千赫
最大比特率 10兆赫+ 800千赫
60赫兹时的理论最大LED 五千二百零八 四百一十七

在很多方面,这两种技术是可以比较的——它们都很漂亮。然而,对于高速应用,双线控制方法更为优越。接下来,我们需要考虑如何尽可能快地将数据实际发送出主控形状。

也许发送数据最明显的方法是“位爆炸”或手动切换管脚。通过使用汇编指令和直接访问管脚控制寄存器,可以很快地执行该方法。但正如我们在线上金沙指定注册网址快速赛车手…阿杜诺速度测试,使用ArduinoDigialWrand()函数有很多开销。不要烦恼,大多数微型计算机都有一种更简单、更可靠的方法。

内置在微控制器中的SPI外围设备通常可以以接近CPU时钟的速度输出数据,并且可以配置为时钟极性和数据相位的任意组合-这被称为SPI模式.通过检查APA102产品介绍我们可以看到螺旋模式3(CPHA=1,cpol=1)是一个完美的匹配。可以,现在我们已经了解了如何最好地从微控制器发送数据。下一步是确保数据是我们想要的,所以我们需要一种方法来指定LED像素信息。这将使我们讨论我在Arduino环境中发现的问题。

模式0-3的SPI时序图

Arduino的问题

我们准备尽快发送数据,但我们对这些数据应该是什么有着强烈的看法。尽管有很多独特的方法可以指定和存储这些数据,最简单的方法是在内存中创建一个字节数组。我甚至倾向于在脑海中想象它们沿着我的LED灯带的长度排列!为了控制LED,我们需要按顺序发送该阵列中的每个字节。

在最底层,微控制器中的所有东西都配置好了,通过将数据写入内存中称为“寄存器”的特定位置来控制和评估。IDE的优点在于它为那些寄存器提供了一个更直观、更易于使用的接口。Arduino环境有一个内置的库来支持您使用的任何板上的SPI外围设备。金沙官方娱乐场函数传递()是Arduino提供的在SPI外围设备上发送(和接收)数据的方法。

Arduino参考你可以找到那个传递()有两种方法可以发送字节大小的数据。第一个是单字节写入,第二个将把每个字节写入一个称为“缓冲区”的长度为“大小”的数组。

直觉告诉我只有一个函数调用会更有效率,但我很快发现了一个令人恼火的问题:当使用缓冲区写入版本时,当数据打卡时,缓冲区中的数据将被miso行上的内容覆盖。这是故意的,当然,但它会抹去你为显示猫的图像而精心设置的LED数据!下面是Arduino内部的代码:

内联静态空隙转移(空隙*buf,大小如果(count==0)返回;uint8_t*p=(uint8_t*)buf;SPDR=*P;而(--count>0)uint8_t out=*(p+1);而(!)(SPSR&BV(SPIF));uint8_t in=spdr;SPDR=OUT;* p++=in;}()!(SPSR&BV(SPIF));*P= SPDR;}

有问题的代码段是(组合在一起)uint8_t in=spdr;* p++=in;.第一个将值从SPSR由于SPI外围设备的工作方式,需要注册和。第二个代码段覆盖缓冲区值(他们怎么敢?).

确定了覆盖的原因之后,您可能会看到一个明显的解决方案:注释掉* p++=in;这样您的数据就不会被覆盖,或定义调用的新函数转移输出()转移()按你喜欢的方式工作。这是一个完全可行的方法来让你的项目工作,金沙线上娱乐场但这对于Arduino图书馆的发展是不可接受的。

在开发库(如RGB OLED 64x64库)时,保持Arduino Vanilla的“胆量”是很重要的,这样你的软件就可以很容易地被其他人使用。另一个解决方案可能是加入Arduino开发人员的电子邮件列表并提出更改建议,但这是一个需要其他各方考虑并达成协议的过程。相反,我需要一个快速的解决方案。

问题的代价

照我说的做,不像我做的那样。尽管我匆忙地提出了解决方案,但通常很好的做法是确保问题确实存在,好,有问题的我很幸运,在事后找到了一个合理的解决办法。在这里,我会假装我是按正确的顺序做的!

这个问题的可能解决方案是什么?

  1. 每次发送前都要填写一个缓冲区(我通常的解决方案,但感觉恶心)。
  2. 使用传递()一次一个字节,因为它保留了该字节的值。
  3. 开发自动保存缓冲区内容的硬件解决方案。
对于(uint16_t indi=0;indi<num_字节;indi++)buffer[indi]=value;spi.transfer(unprotectedbuffer,NUMYBACK字节;
对于(uint16_t indi=0;indi<num_字节;indi++)spi.tansfer(无保护缓冲区[indi]);
SPI.传输(保护缓冲,NUMYBACK字节;

我们可以将问题的成本定义为现有解决方案和最理想解决方案之间的差异。如果问题的成本足够大,因此,开发理想溶液是值得的。在这种情况下,理想的解决方案是使用传递()在缓冲区上运行,而不必每次都重新强制执行每个数据值。我创建了一个Arduino基准草图,测试这三种方法完成给定字节数传输所需的时间。

下载基准草图

我尝试使用Desmos图形计算器来可视化结果,但是对于任何数量的LED(大于约10个),结果都会变得非常线性,显示以每字节传输微秒为单位的数据速率表更有意义:

阿杜尼诺 阿杜尼诺 青少年3.6 青少年3.6
(美国/字节) (LED/60Hz帧) (美国/字节) (LED/60Hz帧)
1,预执行 二点七二四 一千五百二十九 一点零二二 四千零七十六
2,个人写作 二点九八四 一千三百九十六 零点八四三 四千九百四十
三,缓冲区保护程序 一点四零零 二千九百七十六 零点八零八 五千一百五十四

我发现有趣的是,方法1和方法2的等级在两个平台之间切换,但这是另一篇文章的主题。在毒品和犯罪问题办公室和青少年的案例中,我们看到第三种方法的速度更快——几乎是毒品和犯罪问题办公室预执行方法的两倍。

解决方案

完全地证明这是一个值得利用的时间事先是时候提出解决方案了。这对我来说就像纯粹的灵感。基本上我认为,“我需要的数据显示在针脚11上,需要进入第12针…我们能把它们挂在一起吗?”我很快证明了它可以与跳线一起工作(忽略任何SPI模式和相位等的分析),然后开始比赛。我主要担心的是,仅仅将mosi连接到miso就可以防止SPI总线被用于其他传感器。这告诉我,我们需要一种方法来确定这两条线路是否连接。一三态缓冲器在低激活状态下,使能销是正确的齿轮。这是原理图中的情况:

缓冲器保护装置示意图

我所包括的其他一些设计特点是能够通过跳线强制使能销低,通过在板的背面放置一个5伏通电垫,切掉虚线上方的部分,可以获得非常紧凑的占地面积。这些特性使Buffersaver非常适合与数据和电源线直接连接到LED灯带或单向,SPI控制显示。

替换文本

验证

确定解决方案后,最后一步是验证解决方案。我需要确定两件事:

  • 高速(10MHz)信号可以通过缓冲区
  • 当缓冲区被禁用时,mosi数据不会影响miso

我写的测试草图表明,缓冲保护程序通过将APA102 LED条放置在与lis3dh加速度计相同的SPI总线上来完成它设计的工作。缓冲区保护程序保护LED数据,而不必每次都重新写入,但仍然允许加速度计控制miso线,将数据发送回微控制器。

下载测试草图

替换文本

这是正在运行的缓冲区保护程序!在测试所有东西的时候,我意识到把传感器和一个LED条连接在同一条线上真的很奇怪,这让我思考。在缓冲区保护程序的下一个版本上,将有第二个三态缓冲区,在未选择时将LED条从mosi线断开。这将允许您仅使用一个SPI端口控制多个独特的LED条带!

替换文本

我还提供了一个DLA捕获,它在以5兆赫驱动LED时显示输入和输出信号。如果您想更仔细地检查捕获,可以在下面下载并用打开它萨莱埃逻辑.

下载逻辑捕获

现在我很想知道是否有人想到了另一个解决方案传递()问题?您认为在一个SPI端口上可以使用两个不同的LED条带吗?

信用卡刷卡器改进:加垫片

警探又来敲门了,这次他们带来了一个新玩具!

继续阅读

Sparkx最新最好的产品

如果我们在Spar线上金沙指定注册网址kFun学到了一件事,那就是极客们喜欢谈论金沙线上娱乐场他们的项目!金沙线上娱乐场我们迫不及待地想分享我们做的菜。看看这堆新产品,传感器和接线板!

继续阅读

当Spar金沙线上娱乐场kfun得到一批1:8扫描速率面板时,让他们在错误的图书馆工作是我的责任。

继续阅读

通过参考库传递软件I2c流

它并不漂亮,但我们已经想出了一种方法,使基于I2c的库更加灵活。现在您可以将软件I2c端口传送到库中!

继续阅读

美丽的磁场和美丽的标签

我们有磁砖的存货,第一块用Buzzard制造的木板也在里面!

继续阅读