主题中讨论的其他器件: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 示例。
我的驱动器中是否有任何明显错误使其无法正常工作?

