问题标签 [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 投票
2 回答
3686 浏览

arm - OMAP SPI 控制器

有没有人开发过一些应用程序来控制 OMAP3 上的 spi 设备?我可以加载 spi 驱动程序“mcspi”,但我不知道如何使用它。

0 投票
4 回答
3914 浏览

c - 您如何在内存非常有限的嵌入式系统上处理大量数据传输?

我有一个微控制器,它必须从 PC 串行端口(115200 波特)下载一个大文件,然后通过 SPI(~2 MHz)将其写入串行闪存。闪存写入必须在 256 字节块中,前面有写入命令和页面地址。系统上可用的总 RAM 为 1 kB,堆栈大小为 80 字节。

这目前是通过从 UART 填充一个 256 字节缓冲区然后乒乓到另一个 256 字节缓冲区来工作的,该缓冲区由 RX 缓冲区就绪信号上的中断填充,同时使用忙写入写入闪存。重复缓冲区交换,直到操作完成。

我更愿意为在单独的循环缓冲区上运行的 SPI 和 UART 端口设置 TX/RX 中断处理程序。因此,我可以简单地填充 TX 缓冲区并启用中断或检查缓冲区是否有传入数据,而不是轮询新字节并等待操作完成。这将为实际工作提供更多时钟周期,而不是等待外围设备。

在使用 128 字节循环缓冲区实现 IRQ 后,我轮询 UART RX 缓冲区中的数据并立即将其放入 SPI TX 缓冲区以进行文件传输。我使用这种方法遇到的问题是我没有足够的 RAM 用于缓冲区,并且 PC 接收缓冲区的填充速度比我将数据传输到闪存传输缓冲区的速度要快。显然,传输速度不是问题(115.2 kHz 输入和 2 MHz 输出),但在传输每个 256 字节页面后有一个写周期等待。


似乎频繁的 SPI 中断阻塞了一些 UART 中断并导致字节丢失。我选择的解决方案是为 UART 接收中断使用一个环形缓冲区,并将数据馈送到一个 256 字节的页面缓冲区,该缓冲区通过轮询字节传输和写入完成来发送到串行闪存。一个 128 的环形缓冲区足够大,可以防止 SPI 写入期间的溢出。

0 投票
2 回答
3150 浏览

sunspot - 你推荐使用 SunSPOT 的 TTL、SPI 还是 I2C

我开始尝试与一些外部组件(Skyetek M1 Mini 或 M1 RFID 扫描仪)接口,而不是支持以下协议 TTL、SPI 或 I2C。我想知道您会推荐其中哪一条路线。现场运行的应用程序需要大量的处理时间(一种持续运行的手势匹配算法)并且资源相当昂贵。

任何有关该主题的链接或来源将不胜感激。

我发现的有用链接:

时间:

谢谢你的帮助。


编辑:

如果它有助于我尝试连接的设备是 Skyetek M1M1 mini。平台/CPU 是 Sun SunSPOT

0 投票
2 回答
445 浏览

embedded - 将 45DB161 数据闪存与 89LP4052 控制器连接

我正在尝试将数据闪存与 89lp 4052 控制器连接。水晶使用 11.0592 兆赫。该控制器内置 spi 总线。我尝试了 CPHA 和 CPOL 的所有组合。尝试了模式 0 和模式 3。无法读取状态寄存器。有时它会读取寄存器,但有时它只是从闪存中取出代码。

我的代码如下。

;;================================================== ===============================

WRITE_FLASH: MOV 20H,#0D7H ;COMMAND LCALL SEND_CLOCK_ONE LCALL READ_FLASH CLR SCON.1 MOV A,21H MOV SBUF,A JNB SCON.1,$ CLR SCON.1 ;;============= ==================================================== ======== SETB CS CLR SCLK LCALL DELAY2 CLR CS ; 再次选择 MOV 20H,#84H LCALL SEND_CLOCK MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#33H LCALL SEND_CLOCK LCALL DELAY2 SETB CS LCALL DELAY2 CLR SCLK CLR CS ;再次选择 MOV 20H,#0D4H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL SEND_CLOCK
MOV 20H,#00H LCALL
SEND_C ,#00H LCALL SEND_CLOCK_ONE

;;================================================== ======================= SEND_CLOCK_ONE: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C, 05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND_LAST RET ;;===================================== ======================================= READ_FLASH: LCALL PULSE_SEND MOV C,DIN MOV 0FH,C LCALL PULSE_SEND MOV C,DIN MOV 0EH,C LCALL PULSE_SEND MOV C,DIN MOV 0DH,C LCALL PULSE_SEND MOV C,DIN MOV 0CH,C LCALL PULSE_SEND MOV C,DIN MOV 0BH,C LCALL PULSE_SEND MOV C,DIN MOV 0AH,C LCALL PULSE_SEND MOV C,DIN MOV 09H,C LCALL PULSE_SEND MOV C,DIN MOV 08H,C LCALL PULSE_SEND RET ;;================================== ====================================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================== ================================ SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDDIN MOV 08H,C LCALL PULSE_SEND RET ;;======================================== ================================ SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;============================================= =========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND RET ;;============================================= =========================== SEND_CLOCK: MOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDMOV C,07H ;MSB MOV DOUT,C LCALL PULSE_SEND MOV C,06H MOV DOUT,C LCALL PULSE_SEND MOV C,05H MOV DOUT,C LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SENDC LCALL PULSE_SEND MOV C,04H MOV DOUT,C LCALL PULSE_SEND MOV C,03H MOV DOUT,C LCALL PULSE_SEND MOV C,02H MOV DOUT,C LCALL PULSE_SEND MOV C,01H MOV DOUT,C LCALL PULSE_SEND
MOV C,00H MOV DOUT,C LCALL PULSE_SEND RET

;;================================================== =========================== DELAY2: mov 56H,#0FFH DJNZ 56H,$ mov 56H,#0FFH DJNZ 56H,$ RET ;; ==================================================== ================= PULSE_SEND: SETB SCLK LCALL DELAY2 CLR SCLK LCALL DELAY2 RET ;;==================== ================================ PULSE_SEND_LAST: SETB SCLK LCALL DELAY2 RET ;;========== ============================================ PULSE_READ_FIRST:CLR SCLK LCALL DELAY2 SETB SCLK LCALL DELAY2 RET ;;============================================= ================

结尾

0 投票
1 回答
2028 浏览

microcontroller - 用于通过 SPI 访问的 SD 文件系统

我找到了这个站点:http : //www.pjrc.com/tech/8051/ide/fat32.html 基本上它是对 FAT32 文件系统的一个很好的概述。到目前为止,它已被证明非常容易理解,

我想知道是否有人知道不同 Linux 文件系统的任何类似文档/操作方法,我对它们如何在驱动器上存储数据感兴趣!

我从谷歌搜索了一些关于 etx3 规范和诸如此类的东西,但没有找到更多,它基本上是 etx2 与日志......等等,而不是关于如何组织数据以及如何访问的描述

感谢您的任何帮助。

0 投票
3 回答
26416 浏览

embedded - 在 SPI 问题中初始化 SD 卡

我查看了 Stack Overflow question Initialization of a microSD card using an SPI interface,但没有看到任何与我的问题相匹配的答案(也就是说,我还没有尝试过的事情)。

我有一个类似的问题,我试图通过微控制器的 SPI 接口(特别是HC908)访问 SD 卡。我已经尝试遵循物理层简化规范 v2.00 中的流程图,它似乎在 Transcend 1 GB 和 2 GB 以及 AE&C 1 GB 卡上正确初始化。但是我在相机上使用的旧卡中的其他三张随机卡上遇到了问题。

我的代码都是 HC908 汇编程序。我确定了 SPI 时钟线的范围,在初始化期间它的运行频率约为 350 kHz(HC908 在我的 100 - 400 kHz 窗口内的低 MCU 时钟速度下提供的唯一速度倍增器)。

以下是未完成我的初始化例程的三张卡的结果(全部连续完成,无需更改任何代码或时序参数):

非法命令标志卡住了吗?我应该在 CMD8 之后做些什么来清除那个标志吗?

为什么OCR全是F?似乎一点都不合适。另外,为什么 ACMD41 和 CMD1 响应非法命令?CMD1 失败是因为卡在 CMD55 之后等待有效的 ACMD,即使有非法命令响应?

那张卡到底有什么问题?

有时它是同步的,有时则不是。(上述模式可重复的。)我已经确定了这个范围,我没有看到 MOSI/MISO 传输之间有任何流氓时钟周期。

0 投票
1 回答
1238 浏览

embedded - AT91SAM7X512 的 SPI 外设在写入 SPI_TDR 时被禁用

我的 AT91SAM7X512 的 SPI 外设在我写入的 X 时间(X 变化)上被禁用SPI_TDR。结果,处理器挂起检查TDRE标志的 while 循环SPI_SR。此 while 循环位于SPI_Write()属于 ATMEL 提供的软件包/库的函数中。问题是任意发生的 - 有时一切正常,有时重复尝试失败(尝试 = 将相同的二进制文件下载到 MCU 并运行程序)。

配置是(按写作顺序定义):

  1. SPI_MR
    • MSTR= 1
    • PS= 0
    • PCSDEC= 0
    • PCS= 0111
    • DLYBCS= 0
  2. SPI_CSR[3]
    • CPOL= 0
    • NCPHA= 1
    • CSAAT= 0
    • BITS= 0000
    • SCBR= 20
    • DLYBS= 0
    • DLYBCT= 0
  3. SPI_CR
    • SPIEN= 1

SPIENS设置配置后,代码通过检查标志来验证 SPI 是否已启用。

我执行字节传输如下:

问题:

  1. 是什么导致 SPI 外设在写入时被禁用SPI_TDR
  2. 我应该取消注释SPI_Write()读取SPI_RDR寄存器的行吗?
    意思是,下面代码中的第 4 行:(第 4 行原本标记为注释)

    /li>
  3. 上面传输 5 个字节数据的代码有问题吗?

请注意:

  • NPCS 行号。3 是 GPIO 线(表示处于 PIO 模式),不受 SPI 控制器控制。我在代码中自己控制这条线,在需要时通过取消/断言 ChipSelect#3 (NPCS3) 引脚。我这样做的原因是在尝试让 SPI 控制器控制该引脚时出现问题。
  • 我没有使用 PDC/DMA 控制器,也不想使用它。
  • 我没有重置 SPI 外设两次,因为勘误表告诉我只有在我执行重置时才重置它两次——我不这样做。引用勘误表:

    如果执行软件复位(SPI 控制寄存器中的 SWRST),SPI 可能无法正常工作(在片选之前使能时钟。)
    问题修复/解决方法
    SPI 控制寄存器字段,SWRST(软件复位)需要写入两次才能正确设置。

  • 我注意到有时,如果我在写入SPI_TDR寄存器(in SPI_Write())之前延迟,那么代码可以完美运行并且通信成功。

有用的链接:

一个初始化 SPI 和执行 5 个字节传输的例子非常受欢迎和有用。

0 投票
4 回答
5618 浏览

embedded - 使用 SPI 初始化 SD 卡

我看到了很多关于 MMC/SD 卡的信息,我试图创建一个库来阅读这个(修改Procyon AVRlib)。

但是我这里有一些问题。我没有更改原始代码并在这里尝试。我的问题是关于 SD 卡的初始化。我这里有两个,一个 256 MB,另一个 1 GB。

我按以下顺序发送初始化命令:CMD0、CMD55、ACMD41 和 CMD1。

但是 256 MB SD 卡只为每个命令返回一个 0x01 响应。我多次发送 CMD1,256 MB SD 卡总是只返回 0x01,从不返回 0x00。

1 GB SD 更疯狂... CMD0 返回 0x01。很好,但是 CMD55 命令以 0x05 响应。有时它会以 0xC1 响应,有时也会在下一次交互中以 0xF0 响应 0x5F...

网上有资料和例子,但有点混乱。在我的项目中,我必须使用 1 GB 卡,并且我正在尝试使用带有 SD 适配器的 microSD 卡(我认为这不是问题)。

我该如何解决这个问题?

PS:我的问题类似于 Stack Overflow question Initializing SD card in SPI issues 中的问题,但解决方案并没有解决我的问题。1 GB SD 卡永远只返回 0x01... :cry:

0 投票
1 回答
627 浏览

hardware - SPI和GDO,GDO是什么的缩写?

与 SPI 总线连接时,通常有许多 GDO 引脚用于中断 SPI 连接的主设备或从设备。但是 GDO 的首字母缩写词是什么?

0 投票
1 回答
6633 浏览

initialization - 使用 SPI 接口初始化 SD 卡

我从我的 SD 卡(CMD8、CMD55 和 CMD41)收到无效的响应代码。

初始化例程:

您可以在评论中阅读响应代码。

响应代码是否可能CMD80xC1?第 7 位应该是 0,对吧?

是硬件错误吗?