使用SPI与ADXL355进行通信

德里克·纳什(Derek Nash)

从Raspberry Pi与ADXL355加速度计通信时,i2c可以完美工作。但是,当我尝试使用SPI时,寄存器地址与手册中的不匹配,我需要了解原因。

例如,以下代码将发送0x00、0x01、0x02和0x03的结果打印回去,根据手册(以及我使用i2c时的经验),它们应对应于DEVID_AD,DEVID_MST,PARTID和REVID。

#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

非常感谢您的帮助,因为在我理解为什么这种简单的通讯无法正常工作之前,我无法从加速度计获得数据。

德里克·纳什(Derek Nash)

我认为问题在于位0告诉设备是读还是写。我对W上方的小节的符号不熟悉(可以随时纠正我),但是从我的结果来看,我猜它必须为1,这就是为什么0x00变为0x01、0x01变为0x03、0x02变为0x05等,因为寄存器地址需要上移1位以允许RW位。

ADXL355 SPI协议

如果这对其他人有帮助,可以通过如下所示更改传递函数来匹配寄存器:

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]);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章