You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LPC824通过SPI连接ISM330DLC加速度计无法读写寄存器求助

LPC824通过SPI连接ISM330DLC加速度计无法读写寄存器求助

各位好,我最近做项目时遇到了一个头疼的问题:用LPC824控制器通过SPI连接ISM330DLC加速度计,却完全没法正常读写寄存器。我用的是MCUXpresso SDK,尝试读取WHO_AM_I寄存器(地址0x0F)时,返回的是0xFF和0x88这种明显错误的垃圾数据。

我怀疑问题出在SPI配置上,已经试过调整时钟极性、相位,甚至尝试开启各类延迟参数,但都没解决问题。实在找不到根源了,麻烦大家帮忙看看我的代码和配置有没有哪里出错!


main.c代码

#include "fsl_spi.h"
#include "pin_mux.h"
#include "board.h"
#include "fsl_debug_console.h"
#include <stdbool.h>

#define SPI_MASTER          SPI0
#define MASTER_CLK_SRC      kCLOCK_MainClk
#define SPI_MASTER_CLK_FREQ CLOCK_GetFreq(MASTER_CLK_SRC)
#define SPI_MASTER_BAUDRATE 500000U
#define SPI_MASTER_SSEL     kSPI_Ssel0Assert

static void SPIMasterInit(void);
static void MasterStartTransfer(uint8_t reg);
static void TransferDataCheck(void);
static void activateISM330(void);
static void writeToISM330Registr(uint8_t, uint8_t);

#define BUFFER_SIZE (2)
static uint8_t txBuffer[BUFFER_SIZE];
static uint8_t rxBuffer[BUFFER_SIZE];

int main(void)
{
    CLOCK_EnableClock(kCLOCK_Uart0);
    CLOCK_SetClkDivider(kCLOCK_DivUsartClk, 1U);
    CLOCK_EnableClock(kCLOCK_Spi0);

    BOARD_InitBootPins();
    BOARD_InitBootClocks();
    BOARD_InitDebugConsole();

    SPIMasterInit();
    activateISM330();
    MasterStartTransfer(0x0F);
    TransferDataCheck();

    while(1) {
    }

    SPI_Deinit(SPI_MASTER);
}

static void SPIMasterInit(void)
{
    spi_master_config_t userConfig = {0};
    uint32_t srcFreq               = 0U;

    SPI_MasterGetDefaultConfig(&userConfig);
    userConfig.baudRate_Bps   = SPI_MASTER_BAUDRATE;
    userConfig.sselNumber     = kSPI_Ssel0Assert;
    userConfig.clockPolarity  = kSPI_ClockPolarityActiveLow;
    userConfig.clockPhase     = kSPI_ClockPhaseFirstEdge;
    userConfig.direction      = kSPI_MsbFirst;
    userConfig.dataWidth      = kSPI_Data8Bits;
    userConfig.sselPolarity   = kSPI_SpolActiveAllLow;
    userConfig.enableLoopback = false;

    //userConfig.delayConfig.postDelay     = 0xFF;
    //userConfig.delayConfig.preDelay      = 0xFF;
    //userConfig.delayConfig.transferDelay = 0xFF;

    PRINTF("CLK FREQ: %d\n\r", SPI_MASTER_CLK_FREQ);
    srcFreq = SPI_MASTER_CLK_FREQ;
    SPI_MasterInit(SPI_MASTER, &userConfig, srcFreq);
}

static void activateISM330(void)
{
    txBuffer[0] = 0x01; // 0000 0001 first bit = r/w
    txBuffer[1] = 0x80; // 1000 0000

    spi_transfer_t xfer = {0};
    xfer.txData      = txBuffer;
    xfer.rxData      = rxBuffer;
    xfer.dataSize    = sizeof(txBuffer);
    xfer.configFlags = kSPI_EndOfTransfer | kSPI_EndOfFrame;

    SPI_MasterTransferBlocking(SPI_MASTER, &xfer);
}

static void writeToISM330Registr(uint8_t reg, uint8_t data)
{
    spi_transfer_t xfer = {0};

    for(int i = 0; i < BUFFER_SIZE; i++) {
        rxBuffer[i] = 0;
        txBuffer[i] = 0;
    }

    txBuffer[0] = (0 << 7) | reg;
    txBuffer[1] = data;

    xfer.txData = txBuffer;
    xfer.rxData = rxBuffer;
    xfer.dataSize = sizeof(txBuffer);
    xfer.configFlags = kSPI_EndOfTransfer | kSPI_EndOfFrame;

    SPI_MasterTransferBlocking(SPI_MASTER, &xfer);
}

static void MasterStartTransfer(uint8_t reg)
{
    uint32_t i          = 0U;
    spi_transfer_t xfer = {0};

    for(int i = 0; i < BUFFER_SIZE; i++) {
        rxBuffer[i] = 0;
        txBuffer[i] = 0;
    }

    txBuffer[0] = (1 << 7) | reg;

    xfer.txData      = txBuffer;
    xfer.rxData      = rxBuffer;
    xfer.dataSize    = sizeof(txBuffer);
    xfer.configFlags = kSPI_EndOfTransfer | kSPI_EndOfFrame;

    SPI_MasterTransferBlocking(SPI_MASTER, &xfer);
}

static void TransferDataCheck(void)
{
    uint32_t i = 0U;

//    PRINTF("\n\rThe TX data are: ");
//    for(i = 0; i < BUFFER_SIZE; i++) {
//        PRINTF("0x%02X ", txBuffer[i]);
//    }

    PRINTF("\n\rThe RX data are: ");
    for(i = 0; i < BUFFER_SIZE; i++) {
        PRINTF("0X%02X ", rxBuffer[i]);
    }
}

引脚初始化代码

void BOARD_InitPins(void)
{
    CLOCK_EnableClock(kCLOCK_Iocon);
    CLOCK_EnableClock(kCLOCK_Swm);

    gpio_pin_config_t dereConfig = {
        kGPIO_DigitalOutput,
        1,
    };
    GPIO_PinInit(GPIO, 0, 15U, &dereConfig);

    gpio_pin_config_t ssel = {
        kGPIO_DigitalOutput,
        0,
    };
    GPIO_PinInit(GPIO, 0, 12U, &ssel);

    gpio_pin_config_t lampochka = {
        kGPIO_DigitalOutput,
        0
    };
    GPIO_PinInit(GPIO, 0, 0, &lampochka);

    SWM_SetMovablePinSelect(SWM0, kSWM_USART0_TXD, kSWM_PortPin_P0_14);
    //SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RTS, kSWM_PortPin_P0_15);
    SWM_SetMovablePinSelect(SWM0, kSWM_USART0_RXD, kSWM_PortPin_P0_11);
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SCK, kSWM_PortPin_P0_13);
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MOSI, kSWM_PortPin_P0_23);
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_MISO, kSWM_PortPin_P0_17);
    SWM_SetMovablePinSelect(SWM0, kSWM_SPI0_SSEL0, kSWM_PortPin_P0_12);

    CLOCK_DisableClock(kCLOCK_Swm);
}

我已经排查过的点:

  • 调整过SPI的时钟极性(ActiveLow/ActiveHigh)和相位(FirstEdge/SecondEdge)
  • 尝试过开启各类延迟参数(postDelay/preDelay/transferDelay),但没效果
  • 确认过引脚映射是正确的,SPI的SCK、MOSI、MISO、SSEL都对应到了指定引脚

现在完全没头绪了,不知道是不是还有其他地方没考虑到?比如传感器的激活方式不对?或者SPI的传输模式有问题?麻烦各位大佬指点一下!

备注:内容来源于stack exchange,提问作者teleportboy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 10:48:21