使用 SPI 与 ADXL355 通信
Communication with ADXL355 using SPI
当从 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
任何帮助将不胜感激,因为目前我无法从加速度计获取数据,直到我理解为什么这种简单的通信不起作用。
我认为问题在于第 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]);
}
}
当从 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
任何帮助将不胜感激,因为目前我无法从加速度计获取数据,直到我理解为什么这种简单的通信不起作用。
我认为问题在于第 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]);
}
}