标签: spi

UART与I2C对SPI,用于微控制器之间的处理器间通信

我正在研究一种连接两个微控制器的方法.在序列化的层面上,我正在考虑使用Nano protobuffers(http://code.google.com/p/nanopb/).这样我就可以编码/解码消息并在两个处理器之间发送它们.

基本上,一个小型处理器将是RPC服务器,能够执行多个功能.较大的处理器将通过发送的消息调用RPC,然后当数据准备好时,它将从较小的处理器读取它.

使用UART,I2C或SPI的优缺点是什么?

邮件将在发送之前放入邮箱中.

最好的问候,Drasko

embedded microcontroller spi i2c uart

25
推荐指数
1
解决办法
3万
查看次数

串行与SPI

SPI和串口有什么区别?在阅读一篇关于处理器间通信的文章时,它指出串行接口正在被SPI取代以获得更好/更快的通信?究竟有什么区别?

hardware serial-port spi

12
推荐指数
1
解决办法
9188
查看次数

在SPI问题中初始化SD卡

我已经看过堆栈溢出问题使用SPI接口初始化microSD卡并没有看到任何与我的问题匹配的答案(也就是我尚未尝试过的事情).

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

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

以下是未完成初始化例程的三张卡的结果(所有这些都是连续完成而不更改任何代码或时序参数):

Canon 16Meg card (labeled as SD):
Set card select high
Send 80 SPI clock cycles (done by writing 0xFF 10 times)
Set card select low
Send CMD0 [0x400000000095] and Loop up to 8 times waiting for high bit on response to go low
R1 = 0x01 (indicates idle)
Send CMD8 [0x48000001AA87] and Loop up to 8 times waiting for high bit on response …
Run Code Online (Sandbox Code Playgroud)

embedded microcontroller initialization spi sd-card

11
推荐指数
1
解决办法
2万
查看次数

通过SPI实现芯片到芯片的通信协议

我试图通过SPI在一侧的微控制器和另一侧的多核TI芯片上的ARM处理器之间设计有效的通信协议.

所需协议的要求:

1 - 具有排队支持的多会话,因为我有多个发送/接收线程,因此它将是多个使用此通信协议的应用程序,我需要协议来处理这些请求的排队(如果传输我会保持缓冲区是队列,但我只需要协议来管理队列的调度).

2 - 通过SPI作为底层协议.

3 - 简单的错误检查.

在这个线程:" 简单的串行点对点通信协议 ",PPP是一个推荐的选项,但我看到PPP只做部分工作.

我还发现轻量级IP(LwIP)项目采用PPP over serial(我假设我可以通过SPI使用它),所以我想到了利用任何上层协议(如TCP/UDP)来完成其余工作的可能性.所需的工作.幸运的是,我发现TI包括LwIP作为其起始软件包中的以太网SW的一部分,我认为这至少可以在TI芯片方面轻松移植.

所以,我的问题是:

1 - 使用LwIP进行此通信方案是否有效?这会不会引起很多开销,因为IP头不是点对点(在芯片级别)通信所必需的并且会消耗吞吐量?

2 - 驻留在LwIP中的TCP或任何类似协议是否会处理传输请求的排队,例如,如果我在通信信道忙于发送/接收另一个线程的另一个套接字(会话)的请求时通过套接字请求传输,这将是由协议栈管理?如果是这样,哪个协议层管理它?

3 - 它们是否比LwIP更有效的协议栈,满足上述要求?

更新1:需要考虑的更多要点

1 - SPI是唯一可用的选项,我将它与可用的GPIO一起使用,以便在从机有数据要发送时向主机指示.

2 - 当前实现的(非标准)协议使用带有SPI的DMA,以及具有固定消息片段长度的消息格式"STX_MsgID_length_payload_ETX",但是当前方案的主要缺点是主机等待对消息的响应(不是片段)在发送另一个之前,这会消耗吞吐量并且不利用SPI的全双工特性.

3-这方面的一个改进是使用一种邮箱来接收片段,因此较长的消息可以被更高优先级的消息中断,这样单个消息的片段可以非顺序到达,但问题是这个设计引导使事情变得复杂,尤其是我没有太多可用资源用于许多缓冲区以在控制器(主)端使用邮箱方法.所以我认为这就像我通过为简单的点对点链接设计协议栈而重新发明轮子,这可能效率不高.

4- SPI上面通常可以使用哪种更高级别的协议来建立多个会话并解决消息的排队/调度问题?

更新2:另一个有用的线程" 嵌入式设备的良好串行通信协议/堆栈? "

更新3:我看了一下Modbus协议,它似乎指定了应用层然后直接用于串行线路通信的数据链路层,这听起来跳过面向网络协议层的不必要开销.

你认为这对于预期目的来说是比LwIP更好的选择吗?另外,有一个广泛使用的开源实现,如LwIP,但对于Modbus?

embedded spi lwip

10
推荐指数
1
解决办法
9318
查看次数

是什么让SPI比I2C协议更快

我知道I2C和SPI通信的基本知识.由于两者都是同步协议.我想知道是什么让SPI比I2C更快.如果我没有使用I2C,我们可以使用400kbps,而在SPI中我们也可以达到10mbps.是因为硬件变化了吗?在一次采访中我问过这个问题.如果我错了,请告诉我.

c embedded spi i2c

10
推荐指数
2
解决办法
2万
查看次数

spidev无法控制芯片选择信号

我在嵌入式linux设备上使用内核3.12.rc4(olimex imx233 micro).我的目标是使用/dev/spidev能够与另一个spi设备通信.

我编辑arch/arm/boot/dts/imx23-olinuxino.dts为:

ssp1: ssp@80034000 {
  #address-cells = <1>;
  #size-cells = <0>;
  compatible = "fsl,imx23-spi";
  pinctrl-names = "default";
  pinctrl-0 = <&spi2_pins_a>;
  clock-frequency = <1000000>;
  status = "okay";

  spidev: spidev@0 {
    compatible = "spidev";
    spi-max-frequency = <1000000>;
    reg = <1>;
  };
};
Run Code Online (Sandbox Code Playgroud)

arch/arm/boot/dts/imx23.dtsi: 有这个配置

spi2_pins_a: spi2@0 {
  reg = <0>;
  fsl,pinmux-ids = <
    0x0182 /* MX23_PAD_GPMI_WRN__SSP2_SCK */
    0x0142 /* MX23_PAD_GPMI_RDY1__SSP2_CMD */
    0x0002 /* MX23_PAD_GPMI_D00__SSP2_DATA0 */
    0x0032 /* MX23_PAD_GPMI_D03__SSP2_DATA3 */
  >;
  fsl,drive-strength = <1>;
  fsl,voltage = <1>; …
Run Code Online (Sandbox Code Playgroud)

linux spi linux-kernel

9
推荐指数
1
解决办法
7855
查看次数

什么是Linux设备驱动程序代码中的MODULE_ALIAS?

在解释MODULE_ALIAS 代码

/* work with hotplug and coldplug */
MODULE_ALIAS("platform:omap2_mcspi");
Run Code Online (Sandbox Code Playgroud)

但是,MODULE_ALIAS究竟是什么?

参数中有(冒号)有意义吗?

c linux spi linux-device-driver linux-kernel

9
推荐指数
1
解决办法
6133
查看次数

SDHC microSD卡和SPI初始化

我有一个32 GB的金士顿SDHC microSD卡,它必须通过SPIMSP430F2618通信.我无法使用CMD55 + ACMD41(bit30设置为1)对其进行初始化,如SD规范文件中所述.这个顺序是有效的:

  CMD0, arg: 0         , CRC: 0x95 (response:0x01)
  CMD8, arg: 0x1AA     , CRC: 0x87 (response:0x01)
  CMD1, arg: 0x40000000, CRC: 0xFF (response:0x00)
Run Code Online (Sandbox Code Playgroud)

我也尝试使用8 GB SanDisk卡,也适用于此.所以实际上,我在这里使用CMD1,而不是ACMD41,HCS位设置为1.但是,它不稳定,有时它可以工作,有时却不行.这可能与硬件有关.

卡片用参数响应CMD1并不奇怪0x40000000吗?

spi

8
推荐指数
1
解决办法
7706
查看次数

Spidev不使用ioctl同时写/读

我希望找到一些帮助,即使这个问题可能是硬件而不是软件相关(我们会看到).我正在开发基于Freescales P1021处理器(ppc,e500v2核心)的定制电路板.外部PCB将连接,可由SPI配置.该外部PCB的规格读取为全双工模式下的2字节命令,并且只有最后一个字节用于在MISO上传输数据.

知道这一点,我目前正在准备一些软件来测试这个设备.所以我从众所周知的spi_test程序开始.

root@p1021rdb:~# ./spi_test -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00
root@p1021rdb:~#
Run Code Online (Sandbox Code Playgroud)

PIC1

信号显示608个时钟,似乎上半部分只有数据.我决定用loopback调查和测试它 - 切割MOSI-MISO将数据循环回rx缓冲区.结果:

root@p1021rdb:~# ./spi_test -D /dev/spidev32766.3
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 …
Run Code Online (Sandbox Code Playgroud)

c powerpc spi linux-device-driver embedded-linux

8
推荐指数
1
解决办法
8318
查看次数

如何在stm32f4上使用硬件NSS(SPI)?

所以我尝试将硬件NSS信号与HAL库一起使用,但我找不到任何使NSS引脚具有低电平或高电平的功能.我也试图在HAL文档中找到答案,但也没有任何信息.Internet中的所有示例仅包含NSS软件.如何使用硬件NSS?

microcontroller arm spi stm32 stm32f4discovery

8
推荐指数
2
解决办法
3万
查看次数