当与来自覆盆子Pi的ADXL355加速度计通信时,i2c工作正常。但是,当我尝试使用SPI时,寄存器地址与手册中的地址不匹配,我需要理解原因。
例如,下面的代码将输出结果发送到根据手册(我在使用I2C时所体验到的),分别对应于,,,,,和。

#include <bcm2835.h>
#include <stdio.h>

void transfer(char charToTransfer)
{
    char buffer[] = { charToTransfer, 0x00};
    bcm2835_spi_transfern(buffer, sizeof(buffer));
    printf("Rx:  %02X \n", buffer[1]);
}

int main(int argc, char **argv)
{
    if (!bcm2835_init())
        return 1;

    bcm2835_spi_begin();
    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_256);
    bcm2835_spi_chipSelect(BCM2835_SPI_CS0);
    bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);

    transfer(0x00);
    transfer(0x01);
    transfer(0x02);
    transfer(0x03);

    bcm2835_spi_end();

    return 0;
}

结果是
Rx:  00
Rx:  AD
Rx:  00
Rx:  1D

既然它应该
Rx:  AD
Rx:  1D
Rx:  ED
Rx:  01

任何帮助都将非常感谢,因为目前我无法从加速计获得数据,直到我明白为什么这个简单的通信不起作用。

最佳答案

我认为问题在于位0告诉设备它是读还是写。我不熟悉W(请随意纠正我)上方的条的符号,但根据我的结果,我猜它必须是1表示读取,这就是为什么0x00变为0x01、0x01变为0x03、0x02变为0x05等,因为寄存器地址需要上移1位以允许RW位。
ADXL355 SPI Protocol
如果对其他人有帮助,按如下所示更改传输函数,寄存器现在匹配:

void transfer(char charToTransfer, int read)
{
    char buffer[] = { (charToTransfer << 1) + read , 0x00};
    bcm2835_spi_transfern(buffer, sizeof(buffer));
    if(read)
    {
        printf("Rx:  %02X \n", buffer[1]);
    }
}

关于c - 使用SPI与ADXL355进行通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49433454/

10-11 21:04