问题标签 [spi]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - LPC1788:使用 SPI 与 UFDC-1 通信
我正在使用 LPC1788 微控制器,我正在尝试使用 SPI 从 UFDC-1(通用频率数字转换器)发送和接收数据。我能够通过 MOSI 很好地向它传输数据(我已经用示波器确认了这一点),但是每当我发送诸如“获取精度”之类的指令时,我的数据缓冲区中唯一的数据就是数据或指令我刚发。“环回”未启用。
这是我的代码:
编辑:这是发送“设置精度”指令(0x020A)后我所有 SPI 线的捕获。预计 MISO 中的数据在这里毫无意义。如果需要,我可以为其他指令生成捕获。
从上到下:
- 味噌
- 莫西
- 党卫军
- 时钟
编辑 2: 具体来说,我要做的是使用指令 0x020A 设置 UFDC-1 的精度。最后一部分(“0A”)是准确度数。在那之后,我有一个while循环,我试图读回那个准确性。“获取准确度”指令是 0x01FF,其中“FF”是为了读回准确度号而发送的一个虚拟字节。因此,当我发送“0x01FF”时,我希望在从 UFDC-1 发回的数据中某处读回“0A”。
编辑 3:这是我第一次向 UFDC-1 发送“获取精度”指令时捕获的 SPI 线。蓝线(从上数第二个)是 MOSI,它肯定给出了正确的命令 (0x01FF)。如果这工作正常,UFDC-1 应该通过 MISO 回复“0A”(0b00001010),这是准确度数,在 MOSI 传输“FF”的同时。相反,当时我收到了“1A”,我不相信“A”实际上来自 UFDC-1,而只是来自我之前发送的“设置精度”指令 (0x020A)。这是因为我在 while 循环中有“获取准确性”指令,而我正在读回的稳态值是“0x7F00”
这是我的输出的样子:
编辑:原来问题出在 CPOL 和 CPHA 位上。它们都从 0 更改为 1。这似乎让 SPI 控制器与 UFDC 正确交互。
剩下的一个问题是 MISO 上的随机数据的 SPI 时钟。例如,我有一个 while 循环,我希望只返回“0xedff”。我得到的是:
linux - Beaglebone Linux:将行附加到文件的问题
我正在使用此处的说明在我的 beaglebone black(Angstrom 发行版)上启用 spi。
我现在需要添加 BB-SPI1-01/sys/devices/bone_capemgr.*/slots
来启用驱动程序。
发出命令,echo BB-SPI1-01 > /sys/devices/bone_capemgr.*/slots
或者echo BB-SPI1-01 >> /sys/devices/bone_capemgr.*/slots
,但是,产生错误echo: Write error: file exists
尝试使用 nano 进行编辑也失败了。我可以打开文件并编辑它,但是当我保存它时Error writing slots: no such file or directory
我已将文件的权限设置为 777。
有人知道为什么我不能编辑文件吗?如果不可能,是否有解决方法?
.net-micro-framework - 为 .NET 微框架创建自己的 SpiDevice 的最佳方式是什么?
在一个新设计(.NET Micro 的新设计)中,我有一系列 LED 7 段显示器,它们通过带有 Netduino 的 SPI 总线进行控制。
现在,我已经看到不必模拟 SPI 总线的东西,因为 .NET 微框架已经有一个模拟的 SPI 总线,太棒了。
由于我的“模块”是由 SPI 控制的,我想通过 SPIDevice 和 SPIBus 来抽象它,但是我已经在整个互联网上搜索过,并且无法找到一个如何滚动您自己的自定义 SPIDevice(并控制它)的示例) 用于 .NET MF DeviceEmulator 项目。
基本上,在我的 SPIDevice 中,我将拥有一系列控制寄存器以及每个 LED 的数据,但我迫切需要一个可以引导正确方向的示例。当我安装 .NET MF 4.3 时,它没有安装任何示例。
c - 使用 SPI 向 SD 写入一个块,来自 SD 的奇怪响应
这是我将 512 字节块写入 SD 卡的代码。代码运行良好,但是当我检查一切正常(通过读取 SD 的响应)时,我读取了0xFF
.
该值应该类似于(来自 SD 参考手册):
这是代码:
问题在于开关的最后一种情况。
arduino - 如何使用 FastSPI 获取 Arduino UNO 和 WS2811 LED
带有 FASTSPI 的 Arduino UNO 和 WS2811
有没有人有任何可以帮助初始化 LED 的代码?
我昨晚刚开始学习这些。让 Adafruit 工作正常。不知道如何使用 FASTSPI 进行设置。但我正在努力。到处都看过。
如果有人有任何代码可以帮助他们继续前进,那将非常有帮助!!!
谢谢!!缺口
verilog - 当我遵循规范时,SPI 从机不起作用,当我不遵循规范时会起作用吗?
我用 Verilog 写了一个 SPI 从机。那里有一些实现,但我仍在学习 Verilog 和一般的数字逻辑,所以我决定尝试自己编写它。
我的实施有效。但是我必须进行更改才能使其正常工作,并且进行更改(我认为)使我的实现与摩托罗拉 SPI 规范不一致。我想知道:我认为这很奇怪是对的,还是我只是不明白某些东西是如何工作的?
SPI 信号通过称为 SCK、SS、MOSI 和 MISO 的四根线输入。那里并不奇怪。FPGA 以 12MHz 运行,SPI 总线以 1MHz 运行。该策略是在每个 FPGA 时钟频率上采样总线 SPI 总线,并跟踪 SCK 和 SS 的当前值和最后值,以便我可以检测边缘。我还将每个信号通过缓冲区寄存器。所以逻辑总是在实际事件之后运行两个 FPGA 时钟:在时钟 1 上,我将信号锁存到缓冲区中;在时钟 2 上,我将其复制到用于逻辑的 reg 中,在时钟 3 上,我对其采取行动。
我使用的是 SPI 模式 0。根据 SPI 规范,在模式 0 下,从机应在 SCK 的边缘对 MOSI 线进行采样,然后在 SCK的背面进行传输。
所以我就这样写了:
代码应该像这样工作:
- 当 SS 变为有效(低)时,数据[511] 已经通过导线在 MISO 上输出。(这里没有三态,因为我是公共汽车上唯一的东西。)
- 在 SCK 上,从机对 MOSI 进行采样,主机在 MISO 上获取数据[511]。
- 在 SCK 的下降沿,从机将从 MOSI 采样的位移入数据,导致新的位移入 MISO 输出位置。
当我运行这个版本时,它到处乱扔垃圾。我从主机发送到从机的 512 位消息中有一半最终损坏了。
我查看了一个开源的 SPI 从机实现,并注意到它没有使用 SCK 的 negedge。所以我把我的代码改成这样:
进行此更改后,它运行良好。完全防弹。
但我在想,嗯?
我知道这没关系。MISO 在 SCK 定位后立即获得新值,并且在下一次定位时,当主采样时它仍然存在。但是在 negedge 上更改 MISO 有什么问题呢?即使由于缓冲,我在 SPI 总线后面运行了两个 FPGA 周期,但我仍然有 12 个 FPGA 时钟用于每一个 SCK 滴答,这意味着我在 SCK negedge 和下一个 posedge 之间有六个 FPGA 周期。我应该能够及时了解 MISO 的内容,对吧?
在实践中,每个人是否都只是(在 SPI 模式 0 中)在 SCK posege 之后立即更新 MISO 而不必担心 negedge?
谢谢!
spi - lpc1788 ssp (SPI) - proc 到 proc 通信
我想将一串字符从一个 proc(主)发送到另一个(从),然后从从属读取字符串。
目前我正在混合使用 arduino 和 LPC1788,使用 lpc 作为主机,使用 arduino 作为从机。LPC 正确发送了 arduino 在 ISR 中接收到的字符串。在循环函数中,我检查是否收到所有字符,然后尝试发回字符串。在 LPC 方面,ISR 由于某种原因无法正常工作。我已将 SR 设置为
所以我在从 LPC 发送字符串之后延迟了,然后从 arduino 开始读取。
我在洛杉矶看到的发送字符串是:
但是从 Arduino 读取字符串看起来很奇怪(字符串应该是“Pong\n”,我收到的并不总是 P……它会有所不同)
我想大多数问题都在发送和读取 SPI 缓冲区的同步中。在 LPC 上没有功能性 ISR 的情况下,我如何实现这一目标?
c - Atmel DMA 控制器编程
我正在开发一个 Linux 内核模块,以从片上 AT91SAM9x25EK 系统的 SPI 总线上的芯片读取计数。不过,我发现了一些不寻常的行为。芯片应返回如下所示的数字集:
170、172、172、172、170、173、173、173、170、174、174、174、170、175、175、175等
本质上,我应该看到 170 后跟 3 个字节,每次读取都会增加。
这适用于 PIO,但不实用。我必须每 200us 读取 4 个字节,这占用了整个 CPU。所以,DMA是要走的路。
但是,我对 DMA 有两个问题。首先来自 atmel_spi.c 文件的顶部说:
显然我需要的 4 个字节小于 DMA 的最低要求。这意味着要么我必须一次从芯片读取 16 个字节,要么将此#define 更改为 4。在任何一种情况下,结果都是相同的。激活 DMA 控制器会将 CPU 使用率降低到一半以下,但会破坏我的结果。现在,我的芯片吐出这样的东西:
170, 0, 0, 0, 170, 0, 0, 0, 170, 0, 0, 0, 170, 0, 0, 0
我的 170 标记仍然存在,但所有其他读取都返回 0。我是否读取了正确的字节数似乎并不重要,每次我使用 DMA 控制器时,我都会为每个值得到 0,我完全被难住了。
如果有人知道出了什么问题,或者知道如何完全规避整个 DMA 问题,我会很高兴尝试一下。200us 是一个硬性要求,但在其余的实现中我可能有更多的喘息空间。
这是我设置内核缓冲区和 DMA 的初始化函数:
此外,这是我设置 SPI 传输的函数。本质上,我将一大组传输排队到一条消息中。
c - tx_buf 期望在 spi_transfer 中作为输入的内容
我正在查看使用 spi_transfer 结构在 SPI 线上写入一些数据的代码
现在像这样的一些是在代码中完成的
现在 t[0].tx_buf = cmd;
现在我想知道这个缓冲区中写入了什么以及 tx_buf 在这里期望什么?我们正在通过 SPI 线写入一些看门狗计数器。
arduino - Raspberry PI SPI 使用wiringPI2 从Arduino slave 读取?
我在NOOBS Raspbian PI 发行版上安装了wiringpi2和wiringpi2 python 包装器。Adafruit 4 通道逻辑电平转换器使 PI 免受 5v 的影响,并且在 PI 端向 Arduino 发送数据就像这样简单:
以及相应的 Arduino 代码[3]。
编辑:道歉 - 从现在开始,我不能再发布我精心添加的链接,以显示我的工作、源代码和示例代码。你必须谷歌它并感谢 2-link 规则。
所以,我知道接线工作。但这不是我真正想要的方式——我想从 Arduino 读取一个引脚到 PI。
Arduino SPI 参考说明:
该库允许您与 SPI 设备通信,以 Arduino 作为主设备。
PI 必须是主设备。我以为我注定要失败,直到我阅读了 Nick Gammon 的关于 SPI 的优秀页面,该页面展示了 2 个 Arduinii 相互交谈。
此外,该SPI transfer()
命令会建议您可以从 Arduino 写入。
我现在处于谷歌前 4 个结果页面的所有链接都显示为“已关注”的阶段 - 所以这不是因为缺乏谷歌搜索!
理论上,如果我在 PI 端使用 READ 方法,这不应该工作吗?(注意:这只是众多尝试中的一种,而不是唯一一次!)
在 Arduino 上:
在 PI 结束时:
WiringPI 说传入的数据会覆盖我的数据,而 SPIDataRW 正好需要 2 个输入,所以我不应该得到“测试”吗?
我在这里想念什么?任何指针都非常感谢。