- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
当我发送 CMD0 命令(0x40 0x00 0x00 0x00 0x00 0x95)时,我试图在 STM32F303 上使用 SPI 初始化 SDCard,我试图在示波器上查看来自 MOSI 的信号,我看到了不同的信号如下所示。请注意 SPI 速度为 281.25kBits/s。任何帮助将不胜感激。
这是我用来测试 MOSI 输出的部分代码
uint8_t cmd0[6]={0x40,0x00,0x00,0x00,0x00,0x95};
FATFS_CS_HIGH;
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
for(int i=0;i<10;i++)
{
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
}
FATFS_CS_LOW;
while(1){
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[1], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[2], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[3], 1,10);
HAL_SPI_Transmit(&hspi1,(uint8_t *) cmd0[4], 1, 10);
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[5], 1, 10);
}
现在我正在发送正确的命令,我可以在示波器上看到它。但是,我没有从我正在使用的 SD 卡(SanDisk Ultra 40MB/s ...16GB)收到 0x01 响应(我一直收到 0xff)以下代码:
FATFS_CS_HIGH;
for (int i = 0; i < 10; i++) {
HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}
FATFS_CS_LOW;
HAL_SPI_Transmit(&hspi1, cmd0, 6, 10);
while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
for (int i = 0; i < 10; i++) {
HAL_SPI_Transmit(&hspi1, &dumb, 1, 10);
while (HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
}
HAL_SPI_Receive(&hspi1, &c, 1, 10);
最佳答案
您无需等待 SPI 传输结束即可开始下一个传输。您也不应该逐字节发送缓冲区,您可以在一次调用中发送整个缓冲区。
HAL_SPI_Transmit(&hspi1, cmd0, 6, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
你的这部分代码只是发送垃圾,除了你在发送下一个字节之前不等待的问题:
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
for(int i=0;i<10;i++)
{
HAL_SPI_Transmit(&hspi1, (uint8_t*)0xff, 1, 10);
}
第二个参数是指向数据缓冲区的指针。您的代码不会发送 0xff
,而是发送一些位于 0xff
内存地址的垃圾。
要发送 0xff
,请执行以下操作:
uint8_t value = 0xff
HAL_SPI_Transmit(&hspi1, &value, 1, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
更新:
还有这样的行:
HAL_SPI_Transmit(&hspi1, (uint8_t *)cmd0[0], 1, 10);
也发送垃圾数据。
此 cmd0[0]
将返回数组的第一个元素(数据),即 0x40
,然后将其转换为 uint8_t*
,并将其作为指向数据缓冲区的指针传递给HAL_SPI_Transmit
函数。因此,将要发送的实际数据是 0x40
内存位置的一些随机值。
例如,数组中某个字节的地址是&cmd[0]
。请注意返回地址的 &
运算符。正确的调用是:
HAL_SPI_Transmit(&hspi1, &cmd0[0], 1, 10);
while(HAL_SPI_GetState(&hspi1) != HAL_SPI_STATE_READY);
所以我再次建议如上所示在一次调用中发送整个数组。
关于c - 在 STM32F303 上使用 SPI 的 SD 卡初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40797299/
我的内部类如下: public class ClassWithInnerObject { private final InnerObject innerObject; public Class
我在 STM32F4 Discovery 上安装了 STM32F4407VGT6 Controller 。我尝试使用 SPI + DMA 从 AD7683 ADC 读取数据,但 DMA 接收缓冲区始终
假设您有一个只有一个片选的 SPI 总线。 是否有可以将 8 个或更多设备连接到该 SPI 总线的芯片? 为简化起见,您可以假设所有设备都同意 SPI 模式(数据需要在上升沿有效)。此外,所有设备都是
我有一个 32 GB 的金士顿 SDHC microSD 卡,它必须与 MSP430F2618 通信通过 SPI .我无法通过使用 CMD55 + ACMD41(bit30 设置为 1)来初始化它,如
我正在使用 chai-spies 来确保调用 Controller 中的函数,这是我的测试: it('Should show right season and analysts when compet
我刚开始进行 JS 单元测试,但很难理解如何使用 Jasmine spy 创建有意义的测试。 it('should take an array of shopping items', function
我一直在阅读 SPI 以及如何创建内核驱动程序,但我仍然不确定所有这些是如何工作的。 例如: static struct spi_driver ds1305_driver = {
这是我正在测试的代码 eventsApp.factory('userData', ['userResource', function(userResource){ return{ ge
我有一个简单的组件: .html: {{title}} Change title .ts: export class AppComponent { title = 'app works!'
当我从 SPI 总线上的 PIC-18F4520 向我的卡发出地址为 (0x00000000) 的 cmd17 时,我从命令问题中获得了正确的返回 R1 token 。然后,经过几次循环检查后,我从发
我正在使用rspec-spies我想知道在打完所有电话后是否有办法检查 spy 。 例如,如果我做类似的事情 # setup Post.stub(:find).with(@post.id).and_r
我正在使用 rspec-spies并且想知道是否有办法在所有电话都打完后检查 spy 。 例如,如果我做类似的事情 # setup Post.stub(:find).with(@post.id).an
我正在尝试制作一个可以点击另一个程序按钮的程序。我被告知我需要使用 spy++ 来获取我想要点击的按钮的 ID,所以我现在正在使用它。我找到了包含我希望从中获取按钮 ID 的按钮的窗口(窗口中有 3
问题 在我们的代码库中,我们有一个 sinon 问题,可以使用下面的代码片段重现。问题是,它似乎是间接调用的 spy 返回力 false,console.log 明确指出该方法被调用但 spy.cal
考虑以下 react 组件。 import React, { Component } from "react"; import { reduxForm, Field } from "redux-for
我正在开发一个 Linux spi 驱动程序来处理通过 SPI 端口的通信。 我的 SoC 提供了三个 spi 模块(我将其理解为端口),称为 ecspi1/ecspi2/ecspi3。 我需要使用
当我将类的方法包装成这样的 Sinon-spy 时: sinon.spy(myObject, "myMethod") spy 内部会发生什么? 我猜 spy 对象有一个指向“myObject.myMe
我正在为遗留代码编写一些 JUnit 测试,并且我非常喜欢使用注释。我想知道是否可以创建一个 spy 对象的声明,然后实例化它。我问的原因是因为我有一个带有非空构造函数的类。该构造函数的值直到测试用例
我有两个不同的设备要连接 Arduino .一个Ethernet屏蔽和轴编码器。第一个有 SPI模式 0 和第二个 SPI 模式 2。它们冲突。这个问题有解决方案吗? 我使用不同的芯片选择引脚,这两个
我正在运行使用 Yocto (Pyro) 构建的嵌入式 Linux (4.14.16)。我在具有 i.MX6DL 且 SPI 连接到 FPGA(Xilinx Artix 7)的定制板上运行。我目前正在
我是一名优秀的程序员,十分优秀!