stm32F107VC通过模拟SPI方式读取LIS3DH三轴加速度传感器数据
2016-05-18 16:25
316 查看
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个加速度数据寄存器
读取数据时可以挨个读取寄存器也可以根据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个加速度数据寄存器
读取数据时可以挨个读取寄存器也可以根据SPI 时序连续读取。
相关文章推荐
- android 传感器(OnSensorChanged)使用介绍
- Android重力传感器实现滚动的弹球
- STM32 IO口双向问题
- 使用CMake来构建STM32工程
- 为什么三星手机一直坚持使用塑料外壳?
- Keil STM32工程环境搭建
- stm32之RTC
- STM32串口操作相关事项
- iOS中传感器的基本使用
- 【eBox生态圈】连载一:简化STM32的编程之eBox生态圈
- STM32 SPI工作在主模式时用DMA方式接收数据
- STM32 配置定时器让引脚输出PWM波形
- Zabbix 使用IPMI监控服务器硬件各项传感器。
- 微软研究院为智能手机研发独特触控技术
- Android的常用传感器开发教程案例
- stm32笔记:Systick系统滴答定时器
- stm32笔记:GPIO的简介
- stm32笔记:GPIO的的配置和操作(1)推挽输出方式
- stm32笔记:GPIO的的配置和操作(2)引脚输入之查询按键
- [嵌入式裸机课程]Cortex-M3开发实训班