我已经明白,当涉及到GPIO上的SPI/I2C时,位敲击是一种可怕的做法.为什么这样?
我正在尝试使用 z80 制作一台复古计算机,理想情况下希望让它能够从 SD 卡启动。我 100% 决定使用 z80,并且不想使用具有内部 SPI 硬件接口的微控制器。我想了解计算机的硬件和软件方面,因此 arduino 和微控制器不在考虑之列,因为硬件方面在您购买之前就已完成。无论如何,我的主要问题是是否可以将移位寄存器、一些解码逻辑和软件结合起来通过 SPI 模式从 SD 卡读取数据?我在互联网上搜索了几个小时并阅读了几篇文章,但似乎找不到教程。我了解 SPI 协议,但是,缺乏有关硬件方面的信息,因为微控制器往往内置所有硬件。我计划将 SD 卡的 SOMI 连接到移位寄存器 SIMO 的串行输入引脚将SD卡的串行输出引脚连接到移位寄存器的串行输出引脚,然后将一些数据引脚连接到一些触发器,中间有一些解码逻辑,这样如果我输出到特定端口,它将切换触发器。触发器将充当 SD 卡的时钟和芯片使能线。我还将 z80 的一个引脚连接到移位寄存器的锁存器引脚(同样在中间有解码逻辑),这样如果我输出到特定端口,它将锁存移位寄存器的数据。我不关心速度/效率,只要我能准确地从 SD 卡读取数据即可。另外,我是否可以将移位寄存器时钟输入连接到与 SD 卡连接的同一时钟?任何有关如何实现这一点的建议将不胜感激,谢谢!
我有一个 BeagleBoneBlack Wireless,我想使用 SPI(和 I2C)。我发现很难获得有关如何在 BBB 上设置和使用 SPI 的明确说明。首先,我不清楚 BBB 的默认配置是什么。我似乎有两个 SPI 设备:
$ ls /dev/spi*
/dev/spidev1.0 /dev/spidev1.1 /dev/spidev2.0 /dev/spidev2.1
Run Code Online (Sandbox Code Playgroud)
我似乎也有 I2C:
$ ls /dev/i2c*
/dev/i2c-0 /dev/i2c-1 /dev/i2c-2
Run Code Online (Sandbox Code Playgroud)
我不清楚这些总线是否实际上多路复用到引脚,或者它们是否真的不可用。如果它们连接到引脚,究竟哪条总线是哪条?
我尝试使用引脚多路复用信息(来自此处)进行检查,该信息告诉我对于 SPI1 芯片选择 0,我应该使用偏移量为 0x19C 的引脚,因此我查询了该引脚上的模式:
$ sudo cat /sys/kernel/debug/pinctrl/44e10800.pinmux/pins | grep 44e1099c
pin 103 (44e1099c.0) 00000002 pinctrl-single
Run Code Online (Sandbox Code Playgroud)
它作为模式 2 返回,这对我来说不是很有用(它不是 SPI)。我试图按照有关为此设置覆盖的说明(从这里),但这需要对我的内核进行一些调整,即使那时似乎也无济于事。
请有人指点我一些说明,使这更清楚一点,并且理想情况下与我使用的内核版本(4.4.30)相匹配?
我正在JDK 9上使用SPI进行实验。整个示例都可以在没有“ module-info.java”的JDK 9上使用。添加“ module-info.java”后,ServiceLocator找不到实现类。我很困惑,在模块化的JDK 9项目中找不到有效的SPI示例。
所以我的示例项目如下所示:
/spidemo
??? apiModule
? ??? pom.xml
? ??? src
? ??? main
? ??? java
? ??? eu
? ? ??? com
? ? ??? example
? ? ??? text
? ? ??? spi
? ? ??? TextAPI.java
? ??? module-info.java
??? applicationB
? ??? pom.xml
? ??? src
? ??? main
? ??? java
? ? ??? eu
? ? ??? com
? ? ??? example
? ? ??? spi
? ? …Run Code Online (Sandbox Code Playgroud) 有谁知道有一家公司销售适用于普通非物联网 Windows 10 PC 的 USB 电缆,该电缆可以将 USB 转换为 40 针 Raspberry pi 接头上的所有以下总线?示例:USB->GPIO、I2C、SPI、UART 等。
我能找到的最接近的是:
这可以将 PC USB 转换为 GPIO/I2C/SPI 等...除了我正在寻找更小、电线更少的东西...只有 40 针接头或更少...类似于树莓派 40 针接头,除了被驱动从连接到 PC 的 USB 改为...有人见过这种类型的待售产品,它可以通过所有列出的总线从 PC-USB 转换为 40 针接头吗?
另外,我希望能够使用“Windows.Devices”Api 而不是专有驱动程序 DLL API 通过Windows UWP对该 USB 转换设备进行编程...还没有真正找到...示例:
// C# Program GPIO connected to USB dongle of regular PC...
using Windows.Devices.GPIO;
...
private void InitGPIO()
{
var gpio_ctrl = GpioController.GetDefault();
// Check GPIO state
if (gpio_ctrl == null)
{
this.pin = null; …Run Code Online (Sandbox Code Playgroud) 我正在使用 STM32L476RG 板和 HAL SPI 功能:
HAL_SPI_Transmit(&hspi2, &ReadAddr, 1, HAL_MAX_DELAY);
HAL_SPI_Receive(&hspi2, pBuffer, 4, HAL_MAX_DELAY);
Run Code Online (Sandbox Code Playgroud)
我需要以最大速度从加速度计的缓冲区接收数据,但这些功能存在延迟问题。正如您在示波器屏幕截图中看到的那样,有几微秒没有任何反应。我不知道如何最小化传输间隙。
我尝试使用 HAL_SPI_Receive_DMA 函数,这个延迟更大。您知道如何使用 HAL 函数或有关如何在没有这些延迟的情况下编写 SPI 函数的任何指针来解决此问题吗?
我刚刚为PINE64 ROCK64媒体板编译了U-Boot 2020.04。它编译得很好,没有错误。但当我尝试探测 SPI 闪存时遇到了问题。
U-Boot 命令行的输出:
=> sf probe
Invalid bus 0 (err=-19)
Failed to initialize SPI flash at 0:0 (error -19)
=>
Run Code Online (Sandbox Code Playgroud)
开发板上的设备树 SPI 部分:
&spi0 {
status = "okay";
spiflash@0 {
compatible = "jedec,spi-nor";
reg = <0>;
/* maximum speed for Rockchip SPI */
spi-max-frequency = <50000000>;
};
};
Run Code Online (Sandbox Code Playgroud)
我还尝试了不同的总线和芯片选择。但没有成功。根据电路板原理图,使用的是 SPI 闪存器件GD25Q128CS。
我如何编译源代码:
$ make rock64-rk3328_defconfig
$ make CROSS_COMPILE=/path/to/gcc-arm-9.2-2019.12-x86_64-aarch64-none-elf/bin/aarch64-none-elf- -j 4
Run Code Online (Sandbox Code Playgroud)
我使用了ARM 网站上的官方GCC端口。
还尝试了旧版本和新版本的 U-Boot。同样的问题。我按照U-Boot文档刷写了microSD卡:
$ dd if=idbloader.img …Run Code Online (Sandbox Code Playgroud) 我尝试使用DMA通道使用SPI发送数据.当我在没有DMA的情况下发送一切都没问题,但是用DMA确实是错误的.当我调试我的程序时,SPI DR寄存器始终为0.我想使用dma循环模式一直发送我的数组.有我的代码GPIO INIT:
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(SPI_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(GPIO_PERIPH_CLOCK, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
GPIO_PinAFConfig(GPIOB, AF_PIN_SOURCE, GPIO_AF);
GPIO_InitStructure.GPIO_Pin = GPIO_PIN_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Run Code Online (Sandbox Code Playgroud)
SPI INIT
SPI_I2S_DeInit(SPI1);
SPI_InitTypeDef SPI_InitStructure;
SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_Tx;
SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_InitStructure.SPI_CRCPolynomial = 7;
SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE);
Run Code Online (Sandbox Code Playgroud)
DMA INIT:
DMA_InitTypeDef dma;
DMA_DeInit(DMA1_Channel1);
DMA_StructInit(&dma);
dma.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR;
dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
dma.DMA_PeripheralDataSize …Run Code Online (Sandbox Code Playgroud) 我想问一下,在以下情况下,STM32 中的 DMA SPI rx 将如何表现。我有一个名为 A 的指定(例如)96 字节数组,用于存储从 SPI 接收到的数据。我打开对每个字节进行操作的循环 SPI DMA,配置为 96 字节。是否有可能,当 DMA 将填充我的 96 字节数组时,传输完成中断将关闭,以快速将 96 字节数组复制到另一个 - B,然后循环 DMA 将开始写入 A(并破坏保存在 B 中的数据) ? 我想通过 USB 将数据从 B 快速传输(每次我从 B 中的 A 获取新数据时)到 PC。
我只是在想如何通过 USB 将 STM32 的连续数据流 SPI 传输到 PC,因为我认为每隔一定时间通过 USB 传输的 96 字节数据块比通过 STM32 将实时 SPI 流传输到 USB 更容易?我不知道这甚至可能