当前位置: 首页 > 知识库问答 >
问题:

BMI088 over SPI不连接到RPi4B[C]

温嘉玉
2023-03-14

在我写下我的问题之前,请允许我说,我已经访问了互联网上关于RPi4B、SPI、BMI088、bcm2835库和C的所有相关页面,没有运气,也没有很多挫折感。

我有6个BMI088传感器,我想通过SPI连接到RPi4B。在Arduino上,它与Bolder Flight library完美配合(一个或全部6个)。问题是,当我将传感器连接到RPi时,我没有从传感器获得任何信息。连接正常(3.3 V、接地、MISO、MOSI、SCK、CS、PS接地(仅BMI088))。我还有一个开关可以打开/关闭传感器电源。我发送的信息与Arduino库发送的信息完全相同,但我从传感器中什么也没有得到,味噌是无声的。我提供CSB1引脚的上升沿,如数据表所述。如果我连接MISO和MOSI,RPi将接收数据。

如何让BMI088通过SPI与RPi对话?

代码(不是全部,只是相关部分):

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

#define CS_PIN 25

unsigned char buffer[7] = {0};

int main(int argc, char *argv[])
{
    int x1, x2, y1, y2, z1, z2;
    if (!bcm2835_init())
    {
      printf("bcm2835_init failed.\n");
      return 1;
    }
    if (bcm2835_init())
    {
      printf("bcm2835_init successful.\n");
    }
    if (!bcm2835_spi_begin())
    {
      printf("bcm2835_spi_begin failed.\n");
      return 1;
    }
    if (bcm2835_spi_begin())
    {
      printf("bcm2835_spi_begin successful.\n");
    }

    bcm2835_spi_setBitOrder(BCM2835_SPI_BIT_ORDER_MSBFIRST);      // The default
    bcm2835_spi_setDataMode(BCM2835_SPI_MODE0);                   // The default
    bcm2835_spi_setClockDivider(BCM2835_SPI_CLOCK_DIVIDER_1); // The default
    bcm2835_spi_chipSelect(BCM2835_SPI_CS_NONE);                      // The default
    //bcm2835_spi_setChipSelectPolarity(BCM2835_SPI_CS0, LOW);      // the default
    bcm2835_gpio_fsel(CS_PIN, BCM2835_GPIO_FSEL_OUTP); //CS is an output
    bcm2835_gpio_clr(CS_PIN);

    delayms(100);
    while(1)
    {
        // chip ID
        buffer[0] = 0x00; //ACC_CHIP_ID;
        //buffer[1] = 30;
        bcm2835_spi_transfer(0x00);
        bcm2835_delayMicroseconds(100);
        bcm2835_gpio_set(CS_PIN);
        bcm2835_delayMicroseconds(100);
        bcm2835_gpio_clr(CS_PIN);
        bcm2835_spi_transfern(buffer, 1);
        bcm2835_delayMicroseconds(100);
        bcm2835_gpio_set(CS_PIN);
        printf("\n\nID:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);

        // soft reset
        buffer[0] = 0x7E;
        buffer[1] = 0xB6;
        bcm2835_spi_transfern(buffer, 2);
        delayms(100);
        printf("RESET:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);

        // set power
        buffer[0] = 0x7D;
        buffer[1] = 0x04;
        bcm2835_spi_transfern(buffer, 2);
        printf("POWER:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);

        // set mode
        buffer[0] = 0x7C;
        buffer[1] = 0x03;
        bcm2835_spi_transfern(buffer, 2);
        printf("MODE:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);

        // set range
        buffer[0] = 0x41;
        buffer[1] = 0x03;
        bcm2835_spi_transfern(buffer, 2);
        printf("RANGE:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);

        // set ODR
        buffer[0] = 0x40;
        buffer[1] = 0xAC;
        bcm2835_spi_transfern(buffer, 2);
        printf("RANGE:\t0x%02X\t0x%02X\n", buffer[0], buffer[1]);
        delayms(100);



        buffer[0] = 0x12;
        buffer[1] = 0x13;
        buffer[2] = 0x14;
        buffer[3] = 0x15;
        buffer[4] = 0x16;
        buffer[5] = 0x17;
        bcm2835_spi_transfern(buffer, 7);
        x1 = buffer[1];
        x2 = buffer[2];
        y1 = buffer[3];
        y2 = buffer[4];
        z1 = buffer[5];
        z2 = buffer[6];
        printf("X:%d %d\tY:%d %d\tZ:%d %d\n", x1, x2, y1, y2, z1, z2);
        delayms(500);
    }
}

共有1个答案

赏开宇
2023-03-14

我知道问题出在哪里。显然,为了向传感器发送正确的字节(使用SPI),您必须对某些地址使用位掩码。BMI088数据表中未规定这一点。在我用逻辑分析仪检查了Arduino发送给传感器的内容之后,我发现了这一点,我还查看了BMI088 Arduino库。现在我得到了正确的数据。

 类似资料:
  • 我正在尝试使用Kafka Connect Elasticsearch连接器,但没有成功。它正在崩溃,并出现以下错误: 我已经在kafka子文件夹中解压了插件的编译版本,并在connect-standalone.properties中有以下代码行: 我可以看到该文件夹中的各种连接器,但Kafka Connect不加载它们;但它确实加载了标准连接器,如下所示: 如何正确注册连接器?

  • 我试图使用带有Datastax Spark-Cassandra连接器的Spark查询Cassandra。火花代码是 我发现了另一个帖子,看起来类似的火花工作卡珊德拉错误,但它是一个不同的类,无法找到,所以我不确定它是否有帮助。

  • 问题内容: 注意:我已经尝试过这里给出的其他解决方案,但是没有用 NodeJ的新手。我试图跟随AngularJS专业人士,并陷入设置NodeJs服务器。根据书,我安装了nodejs,然后使用npm install connect安装了connect软件包 然后将angularjs下载到nodejs文件夹旁边的文件夹中。然后编写server.js文件以连接到服务器。这是文件的内容: 当我使用以下命令

  • 我正在尝试运行卡桑德拉,但每次它在连接时都会给出相同的错误...有什么我需要在配置文件或属性文件中编辑的吗? ('无法连接到任何服务器',{'127.0.0.1:9042 ':错误(61,"尝试连接到[('127.0.0.1 ',9042)]。最后一个错误:连接被拒绝")}) 启动cassandra时出错

  • 我有一个kafka connect插件,部署在kafka集群中(在独立模式下,仅用于测试,目的是分布式完成)。这个Kafka连接插件使用curator连接到集群的zookeper,并从中提取一些信息,以决定如何处理这些消息。 代码如下: 在treeCache启动时超时,配置根路径存在于本地zookeeper中(已确认在zookeeper外壳中执行ls,对于我尝试使用的zkConnection字符串

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的