STM32L051C与LIS3DH通过SPI通信的测试驱动

STM32L051C与LIS3DH通过SPI通信的测试驱动

测试环境:STM32CubeMX 通信:SPI
这是第一次写这种文章,主要是怕自己忘记是如何调试的,调试这个LIS3DH用了我2天的时间,也是比较久了,可能技术能力还是有限吧。。。
LIS3DH有I2C接口和SPI接口两种,本文用的是SPI接口,那就需要注意SPI通信有4中模式,需要根据LIS3DH的文档来确定它具体是那种模式,然后在STM32CubeMX中进行配置,这个很关键,我就是没有弄懂这个咋回事浪费了很多时间,总体来说,只要配置正确,功能就可以实现。直接上图。。。
STM32L051C与LIS3DH通过SPI通信的测试驱动_第1张图片
上图是配置的引脚PA4~PA7,其中PA4设置成普通输出口,这个比较重要,因为在写LIS3DH的SPI读写程序时,需先拉低PA4(CS),通信完成后再拉高PA4(CS)。
STM32L051C与LIS3DH通过SPI通信的测试驱动_第2张图片
上图是具体配置,注意CPOL和CPHA,因为这两个配置浪费了我太多时间,其实对SPI时序图了解的同学,应该看到时序图就知道如何配置了。简单讲一下STM32CubeMX中CPOL和CPHA的功能。
CPOL:是指在时钟线空闲的时候的高低,如下图。在这里插入图片描述
这里截取了LIS3DH文档中SPI通信的时钟线,可以发现两边是高电平,中间是时钟脉冲,所以空闲时候是“HIGH”。
CPHA:是指,时钟是在第几次跳变时数据第一次采集。如下图
在这里插入图片描述
从图中看“SPC”一开始是高电平,然后变成低电平,这个跳变发生的时候“SDI”对应的线没有发生数据传输;在“SPC”第二个跳变(从低电平变成高电平)发生时,观察“SDI”对应的线发生数据传输,故在STM32CubeMX中选择“2 Edge”。
在设置SPI引脚基本功能的时候需要注意,如下图所示。STM32L051C与LIS3DH通过SPI通信的测试驱动_第3张图片
一定要选择上拉(Pull-up)尤其是PA5(SPI时钟引脚)
网上也有些文档提供了一些LIS3DH的驱动程序,不过没有给出具体读写程序,下面附上读写程序

//读程序
BaseType_t LIS3DH_ReadReg(uint8_t Reg, uint8_t* Data) 
{
  //To be completed with either I2c or SPI reading function
  //i.e. *Data = SPI_Mems_Read_Reg( Reg );  
  HAL_StatusTypeDef xStatus;
  Reg = (Reg | 0x80);
  if(HAL_SPI_Init(&hspi1) != HAL_OK)
  {
//    Error_Handler();
  }
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//CS拉低
  xStatus = HAL_SPI_Transmit(&hspi1, &Reg, 1, 100);
  if(xStatus != HAL_OK)
  { 
    return pdFAIL;
  }
  xStatus = HAL_SPI_Receive(&hspi1, Data, 1, 100);
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//CS拉高
  HAL_Delay(2);
  return (!xStatus)?(pdPASS):(pdFAIL);
}
//写程序
uint8_t LIS3DH_WriteReg(uint8_t WriteAddr, uint8_t Data)
 {
  //To be completed with either I2c or SPI writing function
  //i.e. SPI_Mems_Write_Reg(WriteAddr, Data);  
  
  HAL_StatusTypeDef xStatus;
  uint8_t ucWriteBuffer[2];
  ucWriteBuffer[0] = WriteAddr;
  ucWriteBuffer[1] = Data;
  if(HAL_SPI_Init(&hspi1) != HAL_OK)
  {
//    Error_Handler();
  }
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);//CS拉低
  xStatus = HAL_SPI_Transmit(&hspi1, ucWriteBuffer, 2, 100);
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);//CS拉高
  return (!xStatus)?(pdPASS):(pdFAIL);
}

如果有什么问题,希望大家指出,共同进步。。。

你可能感兴趣的:(STM32L051C与LIS3DH通过SPI通信的测试驱动)