主题中讨论的其他器件:CC1310
您好
我正在尝试编写函数来精简 CC1310和 LPS22HB 压力传感器之间的 SPI 通信。 除了不断初始化参数等、我想使用 SPI 为 r/w 函数提供一个函数。
对于 SPI_Write 函数:
bool SPI_Write(SPI_Handle spi_handle, SPI_Params spi_params, SPI_Transaction spi_transaction, uint8_t size, uint8_t *txBuffer) { SPI_Params_init(&spi_params); spi_params.transferMode = SPI_MODE_BLOCKING; spi_params.bitRate = 10000000; spi_params.dataSize = 8; spi_handle = SPI_open(0, &spi_params); if (!spi_handle) { // Error opening SPI return false; } spi_transaction.count = size; spi_transaction.txBuf = txBuffer; spi_transaction.rxBuf = NULL; if(!SPI_transfer(spi_handle, &spi_transaction)) { return false; } SPI_close(spi_handle); return true; }
对于我的 SPI_READ 函数:
bool SPI_Read(SPI_Handle spi_handle, SPI_Params spi_params, SPI_Transaction spi_transaction, uint8_t size, uint8_t *rxBuffer) { SPI_Params_init(&spi_params); spi_params.transferMode = SPI_MODE_BLOCKING; spi_params.bitRate = 10000000; spi_params.dataSize = 8; spi_handle = SPI_open(0, &spi_params); if (!spi_handle) { // Error opening SPI return false; } spi_transaction.count = size; spi_transaction.txBuf = NULL; spi_transaction.rxBuf = rxBuffer; if(!SPI_transfer(spi_handle, &spi_transaction)) { false; } SPI_close(spi_handle); return true; }
反过来、我的 LPS22HB 驱动器包含:
SPI_Transaction LPS22HB_SpiTransactionHandle; SPI_Handle LPS22HB2_SpiHandle; SPI_Params LPS22HB_SpiParams; #define TOGGLE_CS GPIO_write(Board_GPIO_TEST_DIO25, 0) #define RELEASE_CS GPIO_write(Board_GPIO_TEST_DIO25, 1) static void LPS22HB_Mem_Write(uint8_t reg, uint8_t *dataW, uint8_t size) { uint8_t spiReg = reg; TOGGLE_CS; //sets the CS low SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, 1, &spiReg); SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, size, dataW); RELEASE_CS; //sets the CS high } static void LPS22HB_Mem_Read(uint8_t reg, uint8_t *dataR, uint8_t size) { uint8_t spiBuf[1] = {0}; spiBuf[0] = reg | 0x80; uint8_t i; TOGGLE_CS; //sets the CS low SPI_Write(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, 1, spiBuf); SPI_Read(LPS22HB_SpiHandle, LPS22HB_SpiParams, LPS22HB_SpiTransactionHandle, size, dataR); RELEASE_CS; //sets the CS high }
然后、我将尝试使用以下代码段读取 chip_id (传感器的"我是谁")、应为0xB1:
LPS22HB_Mem_Read(0x0f, ui8dummy, 1); uint8_t ui8dummy[2] if(strcmp(ui8dummy, "D") != 0) { return false; }
当我读取 CHI-ID 时、如果我希望0xb1的值、由数据表给出、则我得到零。 我已经全面调试了 SPI R/W 代码。 我已经向 SPI_W/R 函数添加了断点、可以保证不会产生错误(这些函数不返回 false)。 我正在使用一个由"toggle"和"release"宏给出的软件芯片选择。 我已经在示波器上进行了检查、可以确认我的 CS 和时钟是否有效。 我将使用 CC1310 SDK 20.02.07版中的 uartEcho 示例。
我的驱动器中是否有任何明显错误使其无法正常工作?