我正在使用测试驱动的开发方法编写C语言中的传感器驱动程序。驱动程序将在使用STM32F415 ARM处理器的项目中使用。项目是使用CubeMX软件生成的,该软件除其他外还为各种外围设备生成了特定于供应商的硬件抽象层文件。我要在传感器驱动程序中使用为SPI通信协议生成的文件 stm32f4xx_hal_spi.h 和相应的源文件。
我的目标是为SPI接口创建一个模拟,然后测试驱动我的传感器驱动程序。我还想尽可能地从驱动程序代码中提取SPI HAL。原因是同一驱动程序还必须支持I2C协议,因此理想情况下它们可以轻松交换。这也是我要避免将SPI HAL文件直接复制到我的传感器驱动程序中的原因。
我最初的方法是创建一个单独的头文件spi_interface.h
,并使用它重新声明stm32f4xx_hal_spi.h
中需要的功能。然后,我将从该头文件生成一个模拟。这将使我能够测试驱动器接口的其余部分。
但是,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接口时,是否存在建立结构的完善方法?是否将所有需要的struct
定义复制到我的spi_interface.h
?我的最初计划在这种情况下有效吗?
答案 0 :(得分:0)
在Google上搜索“ SPI bit bash”或“ SPI bit bang”,然后将其移植到STM32。您真正应该做的唯一移植是交换要移植到STM的代码的GPIO层。因此,请寻找能将这一部分抽象化的代码,并使您可以轻松地将其换出。我猜您可以尝试Maxim的this driver。只需移植spiReadReg ()
和spiWriteReg()
函数。
首先,您需要将SPI_CS = 1;
之类的内容与GPIO_SetBits(YOUR_SPI_PORT, YOUR_GPIO_CS_PIN);
之类的内容进行交换。
使用SPI,操作总线的速度无关紧要。您可以随心所欲地慢速前进,直到发现错误为止。
对于I2C,我已经成功地将this driver从Microchip移植到STM32F,并使其与TI的基于I2C的电池平衡器/监视器一起使用。如果您使用的代码足够简单,那么它应该是一件简单且相对轻松的工作,即使不是很有趣。