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
相关产品推荐
相关产品推荐

