gpt4 book ai didi

c - ARM 中 SPI 的位冲击

转载 作者:太空宇宙 更新时间:2023-11-04 01:58:31 25 4
gpt4 key购买 nike

我正在尝试使用 SPI 从 FXLS8471Q 3 轴线性加速度计读取数据。我正在使用 bit banging 方法从加速度计读取数据。我正在使用 LPC 2184 ARM 处理器。我使用了以下代码。

unsigned char spiReadReg (const unsigned char regAddr)

{

unsigned char SPICount;

unsigned char SPIData;

SPI_CS = 1;
SPI_CK = 0;
SPIData = regAddr;

SPI_CS = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
if (SPIData & 0x80)
SPI_MOSI = 1;
else
SPI_MOSI = 0;
SPI_CK = 1;
SPI_CK = 0;
SPIData <<= 1;
}
SPI_MOSI = 0;

SPIData = 0;
for (SPICount = 0; SPICount < 8; SPICount++)
{
SPIData <<=1;
SPI_CK = 1;
SPIData += SPI_MISO;
SPI_CK = 0;
SPIData &=(0xFE);
}
SPI_CS = 1;

return ((unsigned char)SPIData);
}

但是我得到的不是有效值 0x6A ,而是垃圾值。请帮我解决这个问题;

最佳答案

SPIData &=(0xFE); 正如在另一个答案中指出的那样,这绝对是错误的,因为它会删除您刚刚收到的位。

但是,您的代码还有其他主要问题。SPI 从设备通过在上升或下降时钟上设置 MISO 的值​​来向您发送数据,具体取决于设备的类型。但是,您没有在代码中等待值出现在 MISO 上。

您可以通过将时钟设置为 1 和 0 来控制通信。datasheet of the accelerometer第 19 页说,

Data is sampled during the rising edge of SCLK and set up during the falling edge of SCLK.

这意味着为了读取它,您的处理器需要将时钟从 1 更改为 0,从而向加速度计发送信号以将下一位发送到 MISO。这意味着你做了相反的事情,你在你的代码中读取上升沿,而你应该在下降沿读取。将时钟设置为零后,您必须稍等片刻,直到值出现在 MISO 上,然后您才应该读取它并将其添加到您的 SPIData 变量中。 表 9,SPI 时序 指示您必须等待的时间:至少 500 纳秒。这并不多,但如果您的 CPU 运行速度超过 2 MHz,那么如果您不使用延迟,您将尝试在加速度计有时间正确设置它之前读取 MISO。

你还忘记了slave Select,它实际上需要指示数据报的开始和结束。

查看数据表中的图 7. SPI 时序图,它指出了使用 SPI 与设备通信需要执行的操作以及顺序。

我还建议阅读有关 SPI 的旋转寄存器如何工作的信息,因为从它的数据表来看,加速度计需要在有用数据出现在其输出上之前接收到明确指定的位数。别忘了,当你向设备发送一个位时,它也必须向你发送一个位,所以如果它还没有解码命令,它只能发送乱码。作为主人,您的代码只能“插入”位,并收集在另一侧“弹出”的位。这意味着您必须发送一个命令,然后再发送更多位,直到所有答案都一点一点地推送给您。

如果您遇到困难,我认为您在 https://electronics.stackexchange.com/ 上获得帮助会更幸运, 而不是仅仅将相同的代码放在那里(这似乎是从 www.maximintegrated.com 中盲目复制的,并且与您试图解决的问题完全无关),我强烈建议您尝试理解“图 7.SPI 时序图“我之前建议过,并相应地更改您的代码。在不了解您尝试与之通信的设备如何工作的情况下,如果您仅仅因为标题中写着“spi”而盲目地从一个完全不同的项目中复制代码,您将永远不会成功。

关于c - ARM 中 SPI 的位冲击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30390157/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com