Questions tagged «spi»

SPI是具有时钟(SCLK),数据输入(MISO)和数据输出(MOSI)的低级3线或4线串行总线接口。第四根线是从选择,用于唯一选择总线上的设备。该信号通常为低电平有效。从选择,片选,CS#,SS#通常代表相同的功能。不过,请务必检查数据表。SPI总线是缺乏正式规范的事实上的标准。


1
V-USB如何固定ATmega328p的内置SPI?
我正在研究一个V-USB项目,该项目使用ATmega328p显示为键盘。USB部分运行良好(这不是我的第一个V-USB项目),但是当我使用来启动V-USB堆栈后usbInit(),对SD卡库的所有调用都会失败。如果我之前调用过相同的函数usbInit(),那么一切都将完美运行。 我使用了一个名为Diavolino的Arduino克隆,但没有Arduino /接线框架。我将USB连接到数字I / O 2和3,将SD卡连接到10-13(内置SPI线)。 我浏览了SD卡库,发现除了之外没有使用任何中断或寄存器的迹象SPxx。我也grep想过V-USB代码,但它甚至没有触及SPxx寄存器。 问题的第一个迹象是当设备应该访问SD卡时断开连接时。然后,我将usbPoll()其wdt_reset()调用到所有SD卡处理循环中,发现在写入的情况下,卡发送完最后两个字节(CRC-16)后将永远等待卡的确认。 我使用的SD卡库是sd_rawRoland Riegel提供的。
14 avr  atmega  spi  usb-device  sd 


4
光隔离2MHz SPI通信
我需要隔离两个芯片之间的SPI通信。 通信的瓶颈在从设备上,从设备显然可以处理高达2MHzSPI时钟频率。 我的想法是使用光耦合器进行隔离。第一次尝试时,我使用了4n35。它只是无法正常工作,所以我查看了数据手册,发现芯片需要10 us升高和10 us降低信号(在最坏的情况下)。这使其使用毫无意义。 有人可以给我建议一个光耦合器吗? 为此目的要足够快(2MHz,但也可以接受1MHz) 容易购买且不贵 我在互联网上搜索了满足这些要求的光耦合器,但找不到最值得推荐的光耦合器。 如果可行,我愿意就如何以其他方式隔离通信提出建议。

1
SPI总线终端和上拉电阻
我的微控制器(ATMEL系列)需要使用SPI协议与从设备进行通信。我正在设计硬件。SPI总线的最大速度为1 MHz。主从之间的距离小于50mm。 Q1)我是否需要在SPI总线上串联增加端接,以避免在此SPI速度(1MHz)下反射?如果是这样,我应该如何计算其值,我应该在哪里将终端电阻放置在主机附近或从机附近? Q2)我看到了其他参考设计,其中有时人们在所有SPI信号上使用上拉电阻,有时仅在一些信号(CS或MISO)上使用,而有时没有。我们是否需要在SPI信号上使用上拉电阻(因为SPI端口是推挽配置)?只有在微控制器获得电源并将引脚设置为输出之前,引脚才会浮动。因此,我应该使用上拉电阻吗?如果我在设计中不使用任何上拉电阻,会发生什么?

1
SPI事务超时linux设备驱动程序
我被困了最后三天。 我正在使用msm8960高通芯片组开发eink设备驱动程序。 Scenario: 在文件中:kernel / arch / arm / mach-msm / devices-8960.c 我无法验证use of spidm_channels" and "spidm_crci"和相应的条目。(msm8960 pro)(从某些参考代码复制)如何验证相应的值start and end是否正确?我有msm的数据表,但找不到任何参考。 为了在文件中创建新的gsbi资源,我添加了以下代码: static struct resource resources_qup_spi_gsbi9[] = { { .name = "spi_base", .start = MSM_GSBI9_QUP_PHYS, .end = MSM_GSBI9_QUP_PHYS + SZ_4K - 1, .flags = IORESOURCE_MEM, }, { .name = "gsbi_base", .start …
11 spi  driver  linux 

1
BMA180加速度计。如何在I2C和SPI之间共享引脚?
BMA180加速度计可以是SPI从机或I 2 C从机。两条总线的引脚是共享的。 SPI mode I2C mode --------------------------------------------------- SDI input SDA bidirectional (!) SDO output ADDR address bit, input SCLK input SCL input CSB chip select, input I2C mode select, input 根据数据手册(参见第8章),总线之间的选择通过CSB引脚完成。当CSB为低电平时,该器件为SPI从器件。当CSB为高电平时,该器件为I 2 C从器件。 这是我关注的故障模式。假设BMA180在SPI总线上。同一总线上还有另一个具有自己芯片选择的设备。假设SPI总线主设备正在与该另一设备通信。公务员事务局BMA180高,所以它的I 2 C应该允许。BMA180看到SCL(SPI的SCLK)上的时钟沿和SDA(SPI的MOSI)上的位飞过。如果这些位中的某些位像有效的I 2 C读事务的开始一样对BMA180来说是什么,并且BMA180开始输出数据并破坏现有的SPI事务,该怎么办?BMA180的设计将如何防止这种情况? 这是出于好奇。我还没有尝试过这些问题。我将在SPI上使用BMA180。 任何建议,见解或参考都非常感谢! 更新。 在数据表中找到了一些东西(参见7.7.11)。如果通过SPI与BMA180进行通信,建议通过将该位置1来禁用I dis_i2c2C。 使用SPI接口时,强烈建议将dis_i2c设置为1,以避免出现故障。 BMA180具有内置EEPROM。寄存器内容可以存储在EEPROM中,并在上电时自动加载。因此,它可能使BMA180不理我2下完全并始终。 更新。 L3GD20陀螺仪是另一种IC,它以类似的方式在I 2 C和SPI …
11 spi  i2c 

4
可编程可变电感器
我目前正在使用像这样的可变电感器。我正在尝试找到一种以编程方式控制调整的方法,就像数字电位器一样。是否存在这样的设备,或者是否有其他好的方法来实现此目的?它用于使谐振与不完美制造的设备匹配,这就是为什么它不能为固定值的原因。 编辑#1,添加原理图

4
为什么我的波形在触发之前开始?
我正在学习如何使用入门级数字存储示波器分析SPI总线时钟和数据。我正在使用BK Precision 2542B来测量使用ARM微控制器的Netduino的时钟和MOSI线的输出。 在此图中,我在通道1(黄色)上有时钟,在通道2(蓝色)上有MOSI。触发器设置为使用通道1,使用1.44V的上升沿触发器。时钟方波幅度约为3.3V。 触发指示器水平位于显示屏的中央,但左侧有一个脉冲。我期望时钟的第一个脉冲在触发位置开始。我知道数字存储示波器可以让您看到触发前和触发后的事件,但是我很困惑为什么第一个脉冲不在我预期的位置。 我对触发的理解不正确,还是我只是在使用一个奇怪的示波器? 编辑:脉冲序列的宽度为300μs,以2ms的间隔重复,我的触发释抑值为500μs。调整释抑并没有改变一个脉冲在触发之前的事实。 编辑2: 经过对信号的更多分析(包括使用模拟示波器)后,我认为我确定有时脉冲持续时间约为350μs,而不是300μs。这可能是代码生成帧中的故障。 我发现352μs的延迟时间会产生预期的结果,但是在触发之前,偶尔会有一个额外的脉冲。 我记录了一些帧以显示不存在和存在的脉冲: 如果我将水平时基设置得足够长以查看脉冲的持续时间,则它们之间似乎总是存在至少1.7ms: 因此,尽管我认为超前脉冲是源头上的“毛刺”造成的,但我仍然不确定触发释抑>360μs仍如何产生意外的超前脉冲。

1
当存在其他从SPI设备时,通过SPI访问microSD卡是否存在问题?
我正在设计一个只有一个SPI端口的CPU。我有多个(3)从站连接到此端口,其中之一是microSD卡。 这是一位工程师的报告,他说SD卡被设计为可作为SPI主设备的唯一从设备。 其他人是否能够在同一总线上与其他SPI从机一起使用microSD?也许此报告仅基于特定的有问题的miniSD卡? 为了安全起见,有人会建议使用去往miniSD卡的从选择线选通SPI CLK线吗?
10 spi  sd  microsd 

2
四路SPI PCB布局
我正在尝试为带有STM32 MCU的Quad SPI NOR闪存MT25QL256ABA1EW9-0SIT做好布局。我的问题是我发现存储芯片的引脚分配非常不便。我已经设法以信号彼此相邻的方式交换MCU端的引脚,但这仍然很困难。遵循Micron Quad spi布局指南,我设法: 不拆分下面的接地层(这是2层PCB), 使时钟信号变短,并尽可能减少弯曲, 不使用VIAS进行信号路由 但是,我没有设法: 通过计算带状线来保持任何合理的阻抗(实际上没有多少空间和许多信号) 保持信号长度相似。 这是布局: 放大图像后,您可以在存储芯片焊盘上看到网络名称。我想问您一个,您认为这种设计足以进行80 Mhz的时钟传输。为了进行比较,芯片内部的粉红色形状为18 x 8 mm。将GND多边形浇注架搁置以提高可见性。我将不胜感激。
10 pcb  stm32  spi  layout  high-speed 

1
SPI总线终止问题
我一直在一个OMAP Linux SPI主设备与6个SPI从设备外围设备(5个A / D转换器和单个磁力计)交互的项目中进行工作。 我可以设置SPI时钟频率,并尝试了50 kHz,100 kHz和1MHz。 我附上了一个接线图/电路板图,显示了SPI主设备和所有外设的长度。在我的实验案例中,与主机之间的SPI总线长度(所有导线长度)约为970mm。 我发现的问题是,当我在总线上添加更多其他外围设备时,与1个外围设备的通信失败。即使通讯通过总线远端的磁力计,与另一侧的A / D转换器的通讯也会失败,直到卸下磁力计线束根,然后A / D部分恢复。 我在这里做了一些阅读: SPI总线端接注意事项, 以及: 短距离板对板通信 建议将RC LPF放置在靠近任何驱动节点的位置,因此SCLK和MOSI分别位于主机侧和我的6x MISO / SOMI信号中的每一个。我已经看到针对具有47pF / 27R RC网络的USB采取的类似方法。我的意图是在我的电路上尝试此操作,以减少快速的〜100nsec边缘跃变。 这是添加RC LPF时遵循的正确程序吗?这似乎真的很动摇,是否有更好的做法?我看到了TI的一份应用笔记,他们在讨论如何将SPI扩展到更长的总线距离,这是一个合适的解决方案,还是我的问题仅仅是高速边缘过渡产生的高频谐波之一? http://www.ti.com/lit/an/slyt441/slyt441.pdf 谢谢,尼克

4
FPGA-DIY编程
我已经为微控制器编程了几年了,上完数字设计课程后,我才发现FPGA。在对不同的FPGA,开发板等进行了一些研究之后,我仍然不愿购买任何产品,因为我不知道如何制作自己的最终“产品”版本。我已经将PIC,SAM,AVR等放在定制PCB上没有问题,所以我并不担心-我的主要担心是在没有制造商板的情况下对FPGA进行编程。 我的具体问题:如果我将Quartus,Vivado,iCEcube等生成的位图文件写入地址0开始的SPI闪存芯片(例如,通过FT2232H),并将FPGA连接至FPGA的SPI引脚(正确设置了MODE配置)? 对于部分假设,我深表歉意。我相当确定这是莱迪思的Diamond程序员所做的一切,但是我想知道这种方法是否适用于不同制造商的FPGA,或者说Quartus在编写时是否在存储器中添加了额外的“窗口修饰”或标头。 让我知道我是否可以做些什么来改善/阐明这个问题,或者我是否在FPGA编程过程中遗漏了重点。谢谢!
9 fpga  spi  programming 

3
SPI总线连接-循环还是不循环?
我对SPI总线的物理连接有疑问。 我有一个SPI主设备(一个PIC32器件)和多个从设备(在本例中为PIC16器件)。我只写信给从机,协议负责何时执行从属协议,所以没有MISO或SS信号可担心,我只是将数据和时钟线与所有从机并行。总线的总长度不超过几英尺(例如60厘米),我正在以8MHz运行SCK。 现在,从设备(实际上是其他板上的接口节点)的物理位置使得SPI总线直接回到主机,这样就可以将每个环路的两端分别连接到MOSI和SCK。 下图显示了我的意思-我说的是红色虚线连接-问题是:执行此操作是否是一件好事? 我的电源和地线也经历了类似的旅程,这显然是有用的,因为它最大程度地减小了由从站引起的电压降,因此非常有用。但是,我不知道对这些信号线进行相同的操作是好是坏。相反,我应该允许某种类型的端接-接地电阻(?)-还是串联电阻以抑制反射,或者什么? 可以说,无论是否有连接点,我都尝试过,并且在功能上没有任何区别,也没有变化,但是也许它长于60cm或快于8Mhz,我有问题吗?因此,我正在寻找有关该操作的建议,以防万一发生任何变化。 尽管对于8Mhz的60cm SPI总线,这个问题特别令人困扰,但对于其他情况,是否有任何一般原则?也许I2c总线上的上拉电阻应该放置不同? 任何适合的阅读材料的链接也将受到欢迎-我没有发现任何涵盖此特定问题的内容。

3
FSInit()-“ CE_BAD_PARTITION” [关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为电气工程堆栈交换的主题。 9个月前关闭。 我正在使用PIC18F26K80和XC8编译器。我正在尝试初始化SD卡并创建文件。我已经简单地格式化了Windows上的SD卡,使其具有“ FAT32”文件系统和512字节的“分配单元大小”。SD卡的容量为2GB。我正在使用MLA旧版中的MDD库。我的主要内容如下: FSFILE * file; char sendBuffer[22] = "This is test string 1"; //************************************************** // main function //************************************************** int main() { initIO(); LATBbits.LATB0 = 0; // Initialise SPI and SD-card while ( !MDD_MediaDetect() ); // Initialize the device while ( !FSInit() ); // Initialize #ifdef ALLOW_WRITES …
9 pic  spi  sd  fat 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.