STM32控制三轴加速度传感器实现分析(2)
来源:互联网 发布:猎豹浏览器 for mac 编辑:程序博客网 时间:2024/05/22 16:38
MEMS控制原理
在程序动作前,需要初始化系统中断向量表(使用NVIC_SetVectorTable函数),配置系统时钟、使能各外设时钟(SystemInit,RCC_APB2PeriphClockCmd,RCC_APB1PeriphClockCmd)。
1。GPIO
PB6,PB7分别作为SCL和SDA。查找STM32芯片手册的AFIO部分,
将PB6,PB7作为SCL和SDA使用不需要进行重映射,因此只需初始化其模式、速度。
2。I2C
(1)外设时钟频率
外设时钟频率fPCLK1需写入CR2寄存器的最低六位,写入值的单位为MHz。因此,把RCC中PCLK1的频率值除以1000,000后,放入CR2中。
(2)CCR (clock control register)
该值控制master模式下的I2C时钟。
I2C传输分为standard mode (fSCL = 100kHz) 和fast mode (fSCL = 400kHz)。fast mode分为 tlow/thigh = 2 和 tlow/thigh = 16/9 两种。图示如下。16/9类同。
CCR值的公式为:
standard mode:
Thigh = CCR * TPCLK1
Tlow = CCR * TPCLK1
fast mode:
比例为2:
Thigh = CCR * TPCLK1
Tlow = 2 * CCR * TPCLK1
比例为16/9:
Thigh = 9 * CCR * TPCLK1
Tlow = 16 * CCR * TPCLK1
因此,计算CCR值的方法为:
standard mode:
CCR = Thigh / TPCLK1 = 0.5 * TSCL / TPCLK1 = fPCLK1 / (2 * fSCL)
(代码中结构体的变量I2C_ClockSpeed即为fSCL)
fast mode:
比例为2:
CCR = Thigh / TPCLK1 = (1 / 3) * TSCL / TPCLK1 = fPCLK1 / (3 * fSCL)
比例为16/9:
CCR = fPCLK1 / (25 * fSCL)
在CCR中,standard mode下最小值为0x04,fast mode下为0x01。
(3)TRISE寄存器
该值设定master模式下的最大上升时间。计算方法为允许的最大SCL上升时间除以TPCLK1,所得商值加1。
在I2C bus specification中,standard mode 下最大时间为1000ns,fast mode下为300ns。
因此,TRISE计算方法为:
standard mode:
TRISE = 1000 * (10^(-9)) / TPCLK1 + 1 = fPCLK1 + 1
fast mode:
TRISE = 300 * (10^(-9)) / TPCLK1 + 1 = 300 * fPCLK1 / 1000 + 1
3。读取MEMS中加速度数据
实现过程按照LIS302DL datasheet中给的时序
大致步骤为:允许ACK,发送起始位,发送外设写地址,发送命令数据,发送起始位,发送外设读地址,(收到外设数据),禁用ACK,发送停止位,允许ACK,从DR寄存器读数据。
发送和接收命令或地址数据的本质是读写DR寄存器。
每步执行之后需要检查SR1和SR2相应寄存器的状态,确认该步执行完成后才能进行下一步。
对于外设读写地址,LIS302DL datasheet中有说明:当SDO接地时,外设地址SAD为00111010;master要发送的地址数据位SAD+W/R,W/R位,从MEMS读数据时为1,向MEMS写数据时为0。
在发送外设写地址后,对MEMS的操作为:通过I2C写入MEMS寄存器的地址,(通过I2C写入对该寄存器的控制字)。
在发送外设读地址后,对MEMS的操作为:关闭ACK,发送停止位,从DR读取数据。
程序中用到的MEMS寄存器有:0x20 CTRL_REG1,选择电源模式,选择加速度检测方向
0x27 STATUS_REG,各轴数据获取和溢出状况
0x29, 2B, 2D OUT_X,Y,Z 各轴输出数据。
剩余问题:在I2C驱动中,对于外设时钟频率的赋值,汇编代码中,MCU寄存器中为正确的值,但单步时发现,赋值给时钟频率变量的值显示不正确,无法赋给正确的值;最后计算结果为寄存器中数据的计算,因此是正确的。
若把变量声明为static,汇编代码中该变量的存储位置发生变化。需要学习code, RO data, RW data和ZI data的职能。
- STM32控制三轴加速度传感器实现分析(2)
- STM32控制三轴加速度传感器实现分析(1)
- STM32控制三轴加速度传感器实现分析(3) end
- BMA150三轴加速度传感器在STM32上实现
- 三轴加速度传感器
- 三轴加速度传感器
- mma8452 三轴加速度传感器
- Freescale mma845x三轴加速度传感器驱动分析
- Freescale mma845x三轴加速度传感器驱动分析
- 【传感器】BMA253 数字,三轴加速度传感器
- Atmega16驱动三轴加速度传感器MMA7455
- 三轴加速度传感器bma150驱动解析
- 三轴加速度传感器BMA250解读
- 三轴加速度传感器原理及应用
- android SENSOR_ACCELEROMETER 三轴加速度传感器
- 加速度传感器开发分析
- ADI的ADXL345三轴加速度传感器,实现自由落体,静止和移动的寄存器驱动程序
- 加速度传感器(摇一摇)
- c# 常用命名空间功能解释
- 在WINDOWS 资源管理器中打开FTP
- 七种方法破解网吧下载限制
- Qt 4.5.3 +tslib1.4移植
- Windows下的linux开发环境Cygwin的安装配置
- STM32控制三轴加速度传感器实现分析(2)
- Raphael js库简介
- VS2010 上手感觉,真不错
- 正方教务管理系统2个0DAY by 深林孤鹰
- WPS中鼠标双击的10个妙用
- curl简介
- innerText和textContent
- untitled
- [转]百万级访问网站前期的技术准备