stm32F107VC通过模拟SPI方式读取LIS3DH三轴加速度传感器数据

LIS3DH为三轴向高精度数字式加速度传感器,可以通过IIC,SPI方式直接采集加速度数据。这里使用的是模拟SPI。

1.初始化配置

   采集数据之前需要对有关寄存器进行必要的配置:

     write_reg(0x23, 0x08, GPIOA, GPIO_Pin_3); //0x48大端 0x08小端
     write_reg(0x20, 0x57, GPIOA, GPIO_Pin_3);     //100HZ采样,电源正常模式,三个轴采样使能

这里GPIOA, GPIO_Pin_3是片选CS脚

2.读写寄存器

   u8 read_reg(u8 register_name, GPIO_TypeDef* GPIOCS, uint16_t GPIO_Pin_CS, GPIO_TypeDef* GPIOSDO, uint16_t GPIO_Pin_SDO)
   {
u8 value,i;
u8 nMISO=0;
value=0;
register_name |= 0x80; // D7=1 -> read; D6=0 -> single byte
GPIOCS->BRR=GPIO_Pin_CS;//CSN_L;
delayus(8);
for (i=0;i<8;i++) // address
{
if (register_name & 0x80)
GPIOB->BSRR=GPIO_Pin_9;//MOSI_H;
else
GPIOB->BRR=GPIO_Pin_9;//MOSI_L;
register_name <<= 1;
clk();
}
for (i=0;i<8;i++) // read data
{
clk();
in_byte <<= 1;
nMISO = ((GPIOSDO->IDR & GPIO_Pin_SDO)!=0)?1:0;
value|= nMISO;
}
GPIOCS->BSRR=GPIO_Pin_CS;//CSN_H;
return value;
  }

  void write_reg(u8 register_name, u8 register_value, GPIO_TypeDef* GPIOCS, uint16_t GPIO_Pin_CS)
  {
u8 i;
register_name &= 0x3f;  // D7=0 -> write; D6=0 -> single byte
GPIOCS->BRR=GPIO_Pin_CS;//CSN_L;
delayus(8);
for (i=0;i<8;i++) // address
{
if (register_name & 0x80)
GPIOB->BSRR=GPIO_Pin_9;//MOSI_H;
else
GPIOB->BRR=GPIO_Pin_9;//MOSI_L;
register_name <<= 1;
clk();
}
for (i=0;i<8;i++) // write data
{
if (register_value & 0x80)
GPIOB->BSRR=GPIO_Pin_9;//MOSI_H;
else
GPIOB->BRR=GPIO_Pin_9;//MOSI_L;
register_value <<= 1;
clk();
}
GPIOCS->BSRR=GPIO_Pin_CS;//CSN_H;
   }

3.读加速度传感器数据

  LIS3DH有6个加速度数据寄存器

  

   stm32F107VC通过模拟SPI方式读取LIS3DH三轴加速度传感器数据_第1张图片

读取数据时可以挨个读取寄存器也可以根据SPI 时序连续读取。

 

你可能感兴趣的:(ARM)