我正在使用测试驱动开发方法用 C 语言编写传感器驱动程序。驱动程序将用于使用 STM32F415 ARM 处理器的项目。项目是使用 CubeMX 软件生成的,该软件还为各种外设生成供应商特定的硬件抽象层文件。我将在我的传感器驱动程序中使用为 SPI 通信协议(protocol)生成的文件 stm32f4xx_hal_spi.h 和相应的源文件。
我的目标是为 SPI 接口(interface)创建一个模拟,然后测试驱动我的传感器驱动程序。我还想尽可能从我的驱动程序代码中抽象 SPI HAL。原因是相同的驱动程序还必须支持 I2C 协议(protocol),因此理想情况下它们可以轻松交换。这也是我希望避免将 SPI HAL 文件直接复制到我的传感器驱动程序中的原因。
我最初的方法是创建一个单独的头文件 spi_interface.h
并使用它来重新声明 stm32f4xx_hal_spi.h
中我需要的函数。然后我会从这个头文件生成一个模拟。这将使我能够测试驱动程序接口(interface)的其余部分。
但是,SPI HAL 函数比我最初想象的要复杂。这是其中一个示例:
HAL_StatusTypeDef HAL_SPI_Transmit(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size, uint32_t Timeout);
我的问题与 SPI HAL 函数用作参数的 SPI_HandleTypeDef 结构有关:
typedef struct __SPI_HandleTypeDef
{
SPI_TypeDef *Instance; /* SPI registers base address */
SPI_InitTypeDef Init; /* SPI communication parameters */
uint8_t *pTxBuffPtr; /* Pointer to SPI Tx transfer Buffer */
uint16_t TxXferSize; /* SPI Tx Transfer size */
__IO uint16_t TxXferCount; /* SPI Tx Transfer Counter */
uint8_t *pRxBuffPtr; /* Pointer to SPI Rx transfer Buffer */
uint16_t RxXferSize; /* SPI Rx Transfer size */
__IO uint16_t RxXferCount; /* SPI Rx Transfer Counter */
void (*RxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Rx ISR */
void (*TxISR)(struct __SPI_HandleTypeDef * hspi); /* function pointer on Tx ISR */
DMA_HandleTypeDef *hdmatx; /* SPI Tx DMA Handle parameters */
DMA_HandleTypeDef *hdmarx; /* SPI Rx DMA Handle parameters */
HAL_LockTypeDef Lock; /* Locking object */
__IO HAL_SPI_StateTypeDef State; /* SPI communication state */
__IO uint32_t ErrorCode; /* SPI Error code */
}SPI_HandleTypeDef;
它由多个其他结构组成,这让我认真思考这里的正确方法。在模拟供应商 HAL 接口(interface)时是否有一种完善的处理结构的方法?我是否将所有需要的 struct
定义复制到我的 spi_interface.h
中?在这种情况下我最初的计划是否有效?
最佳答案
在 Google 上搜索“SPI bit bash”或“SPI bit bang”,然后将其移植到 STM32。您真正应该做的唯一移植是交换要移植到 STM 的代码的 GPIO 层。因此,寻找能够抽象出这部分的代码,并让您可以轻松地交换这部分。我想你可以尝试this driver来自马克西姆。只需移植 spiReadReg ()
和 spiWriteReg()
函数即可。
首先,您可以将 SPI_CS = 1;
之类的内容替换为 GPIO_SetBits(YOUR_SPI_PORT, YOUR_GPIO_CS_PIN);
之类的内容。
使用 SPI,无论您操作总线的速度有多慢都没有关系。您可以按照自己喜欢的速度慢慢地进行,然后逐渐加快速度,直到发现错误为止。
对于I2C,我已经成功移植this driver从 Microchip 移植到 STM32F,并使其与 TI 的基于 I2C 的电池平衡器/监视器配合使用。如果您正在使用的代码足够简单,那么它应该是一项简单且相对轻松的工作,即使不是很有趣。
关于c - 使用 ARM 供应商 HAL 进行测试驱动开发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51776544/