主题中讨论的其他器件: CC3220SF
我正在尝试使用 SPI_TRANSFER ()在 CC3220SF-LAUNCHXL (SPI 主器件)和外部传感器(Adafruit LIS3MDL)之间建立基本 SPI 通信。 我正在 FreeRTOS 中构建一个使用 Simplelink SDK 版本2.10.00.04的应用程序。
我已成功将 器件 ID 读取命令(0xCF)发送到外部传感器。 在逻辑分析仪上、传感器以预期值(0x3D)进行响应。 但是、读取缓冲区正在接收值0xE3。 我可以反复发送传输、该值始终为0xE3。
这里是否有一些基本配置(软件或硬件)我可能会错?
SPI 配置(索引 CC3220SF_LAUNCHXL_SPI1):
{ .baseAddr = GSPI_BASE, .intNum = INT_GSPI, .intPriority = (~0), .spiPRCM = PRCM_GSPI, .csControl = SPI_SW_CTRL_CS, .csPolarity = SPI_CS_ACTIVELOW, .pinMode = SPI_4PIN_MODE, .turboMode = SPI_TURBO_OFF, .scratchBufPtr = &spiCC3220SDMAscratchBuf[CC3220SF_LAUNCHXL_SPI1], .defaultTxBufValue = 0, .rxChannelIndex = UDMA_CH6_GSPI_RX, .txChannelIndex = UDMA_CH7_GSPI_TX, .minDmaTransferSize = 100, .mosiPin = SPICC32XXDMA_PIN_07_MOSI, .misoPin = SPICC32XXDMA_PIN_06_MISO, .clkPin = SPICC32XXDMA_PIN_05_CLK, .csPin = SPICC32XXDMA_PIN_NO_CONFIG }
SPI_open 调用:
SPI_Params_init(&xSpiParams); xSpiParams.transferMode = SPI_MODE_BLOCKING; xSpiParams.transferTimeout = SPI_WAIT_FOREVER; xSpiParams.transferCallbackFxn = NULL; xSpiParams.mode = SPI_MASTER; xSpiParams.bitRate = 1000000; // xSpiParams.bitRate = 500000; xSpiParams.dataSize = 8; xSpiParams.frameFormat = SPI_POL0_PHA0; // xSpiParams.frameFormat = SPI_POL1_PHA1; xSpiHandle = SPI_open(CC3220SF_LAUNCHXL_SPI1, &xSpiParams);
SPI 读取代码:
static int32_t prlSpiRead(void *handle, uint8_t reg, uint8_t *bufp, uint16_t len) { int32_t lRetVal = 0; SPI_Transaction xSpiTransaction = {0}; SPI_Handle xSpiHandle = *((SPI_Handle*) handle); memset(xSpiTxBuff, 0xA5, 100); memset(xSpiRxBuff, 0x00, 100); GPIO_write(CC3220_LIS3MDL_SPI_CS_PIN, 0); xSpiTxBuff[0] = (reg | 0xC0); //read + auto increment xSpiTransaction.count = 1+len; // 1 command byte + number of expected bytes xSpiTransaction.txBuf = (void*) xSpiTxBuff; xSpiTransaction.rxBuf = (void*) xSpiRxBuff; SPI_transfer(xSpiHandle, &xSpiTransaction); GPIO_write(CC3220_LIS3MDL_SPI_CS_PIN, 1); memcpy(bufp, &xSpiRxBuff[1], len); if(SPI_TRANSFER_COMPLETED != xSpiTransaction.status) { lRetVal = -1; } return lRetVal; }