问题标签 [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.

0 投票
1 回答
716 浏览

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”。我得到的是:

0 投票
5 回答
3702 浏览

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。

有人知道为什么我不能编辑文件吗?如果不可能,是否有解决方法?

0 投票
1 回答
748 浏览

.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 时,它没有安装任何示例。

0 投票
2 回答
4469 浏览

c - 使用 SPI 向 SD 写入一个块,来自 SD 的奇怪响应

这是我将 512 字节块写入 SD 卡的代码。代码运行良好,但是当我检查一切正常(通过读取 SD 的响应)时,我读取了0xFF.

该值应该类似于(来自 SD 参考手册):

这是代码:

问题在于开关的最后一种情况。

0 投票
0 回答
4342 浏览

arduino - 如何使用 FastSPI 获取 Arduino UNO 和 WS2811 LED

带有 FASTSPI 的 Arduino UNO 和 WS2811

有没有人有任何可以帮助初始化 LED 的代码?

我昨晚刚开始学习这些。让 Adafruit 工作正常。不知道如何使用 FASTSPI 进行设置。但我正在努力。到处都看过。

如果有人有任何代码可以帮助他们继续前进,那将非常有帮助!!!

谢谢!!缺口

0 投票
1 回答
2087 浏览

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的背面进行传输

所以我就这样写了:

代码应该像这样工作:

  1. 当 SS 变为有效(低)时,数据[511] 已经通过导线在 MISO 上输出。(这里没有三态,因为我是公共汽车上唯一的东西。)
  2. 在 SCK 上,从机对 MOSI 进行采样,主机在 MISO 上获取数据[511]。
  3. 在 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?

谢谢!

0 投票
1 回答
1175 浏览

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 的情况下,我如何实现这一目标?

0 投票
0 回答
1014 浏览

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 传输的函数。本质上,我将一大组传输排队到一条消息中。

0 投票
1 回答
1319 浏览

c - tx_buf 期望在 spi_transfer 中作为输入的内容

我正在查看使用 spi_transfer 结构在 SPI 线上写入一些数据的代码

现在像这样的一些是在代码中完成的

现在 t[0].tx_buf = cmd;

现在我想知道这个缓冲区中写入了什么以及 tx_buf 在这里期望什么?我们正在通过 SPI 线写入一些看门狗计数器。

0 投票
1 回答
4874 浏览

arduino - Raspberry PI SPI 使用wiringPI2 从Arduino slave 读取?

我在NOOBS Raspbian PI 发行版上安装了wiringpi2wiringpi2 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 个输入,所以我不应该得到“测试”吗?

我在这里想念什么?任何指针都非常感谢。