ARM:g-sensor数据手册、函数原型atoi&itoa、读取加速度的基础

来源:互联网 发布:淘宝高佣金采集 编辑:程序博客网 时间:2024/04/30 02:41
1、g-sensor数据手册   // mma8653
1.1 测量范围 
    ±2(1/256)±4(1/128)±8(1/64)
1.2 从设备地址 
    0x1d
    R:0x3b  W:0x3A

1.3 几种工作模式 
     powerdown / standby / active
1.4 内部有多少个寄存器(大概每个寄存器的用途)
   50 多个寄存器(除去保留的)

   所有的寄存器都是 8 bit的


    'STATUS
    - [ 0 : 3 ] - Z Y X方向是否有心的加速度值
    - [ 4 : 7 ] - Z Y X方向的数据是否被取走,没被取走就会被覆盖

    'SYSMOD
    - [ 1 : 0 ] - 当前系统工作模式
    'XYZ_DATA_CFG
    - [ 1 : 0 ] - 配置测量范围
1.5 哪个寄存器中存储的是g-sensor芯片的ID - 0x5a
    ' WHO_AM_I -0x0d
1.6 哪个寄存器中存储的是计算得到的三个轴的加速度值 
    'OUT_X_MSB    -    OUT_X_LSB
    'OUT_Y_MSB    -    OUT_Y_LSB
    'OUT_Z_MSB    -    OUT_Z_LSB
   该寄存器在ACTIVE模式下读取。
1.7 哪个寄存器可以操作改变g-sensor的工作模式

    ‘ CTRL_REG1
    - [ 0 ] 1 = 配置为ACTIVE活跃模式

1.8 S5P6818要从g-sensor中读取一个寄存器的值出来,具体时序要求?
1.9 S5P6818要将1个字节写入到g-sensor某个特定寄存器中,具体时序要求?

master--ST--从addr|W---接ACK---0x0d---接ACK---SR---从地址|R---接ACK---收---NACK---STOP
slave   --------接---------发ACK-----接---发ACK-----------接-------发ACK---


freescale 三周重力加速度传感器厂商 - 摩托罗拉的半导体产品部,被nxp收购,nxp官网上找到的 AN4083.pdf

2、编程实现itoa、atoi函数
    vi itoa.c
    void itoa (char* buffer, unsigned int num);
/** 代码演示 - itoa.c **/void itoa (char* buf, unsigned int num) {    unsigned int tmp = 0;    buf[0] = '0';    buf[1] = 'x';    int i = 9;      while (num) {        tmp = num % 16;         if (tmp > 9)            buf[i] = 'a' + tmp - 10;         else            buf[i] = '0' + tmp;        num /= 16;         i--;    }    while (i >= 2) {        buf[i--] = '0'; // 0x0000005a 中间补全的0    }    buf[10] = 0; // 最后1位的\0}

/** 代码演示 - atoi.c **/int atoi (char* s) {    int i = 0, cnt = 0, num = 0;    char* tmp = s;    while (*tmp) {        if (*tmp >= '0' && *tmp <= '9')             num = num * 10 + (*tmp - 48); // '0' <==> 48        else            break;        tmp++;    }       return num;}

' 一个代码写的好坏的有三个功能:
即算法的优劣:时间复杂度、空间复杂度、代码是否易读

/** 代码演示  - mma8653.h**/#ifndef _MMA8653_H_#define _MMA8653_H_extern void mma8653_show_id (void);#endif //_MMA8653_H_/** 代码演示  - mma8653.c**/#include "iic.h"#include "itoa.h"#include "uart.h"#define ID_REG    0x0d#define SLA_ADDR  0x1dvoid mma8653_read (unsigned char offset, /* 寄存器地址 */                   unsigned char* buf,   /* 字节缓冲区 */                   int len      /* 读取字节数 */) {    // start---发送从设备地址<<1|W---接收ACK    iic2_start (SLA_ADDR, 0);     // 发送要读取的寄存器地址---接收ACK    iic2_tx (&offset, 1);     // start---发送设备地址<<1|R---接收ACK    iic2_start (SLA_ADDR, 1);     // 接收从设备返回的指定的寄存器内容,NACK    iic2_rx (buf, len);    // 发送stop    iic2_stop ();}void mma8653_show_id (void) {    unsigned char id = 0;    char buf[11] = {0};    // 读取ID    mma8653_read (ID_REG, &id, 1);     // 显示ID    uart_puts ("\nmma8653_ID:");    itoa (buf, id);    uart_puts (buf);}

3、读取加速度的方法
3.1 切换为ACTIVE模式
    CTRL_REG1 - [ 0 ] 1 = ACTIVE模式 // 写入操作
单字节的写入:
    主设备发送start信号,发送从设备地址 | W
    主设备接收ACK信号
    主设备发送要写入的寄存器地址
    主设备接收ACK信号
    主设备发送要写入寄存器的数据
    主设备接收ACK信号
    主设备发送stop信号
    先将CTRL_REG1寄存器的内容读到S5P6818内部缓存
    在缓存中将bit0位 - 置1
    再将缓存的值写回CTRL_REG1寄存器


3.2 加速度值存在的寄存器
    STATUS:3轴加速度值状态信息
    OUT_X_MSB
    OUT_X_LSB:x轴的加速度值
    OUT_Y_MSB
    OUT_Y_LSB:y轴的加速度值
    OUT_Z_MSB
    OUT_Z_LSB:z轴的加速度值

    两种方式读取加速度值:
    1)单字节读取,每次读1个寄存器,读6次;
    2)多字节读取,一次性读取6个字节数据;
        寄存器地址会自动+1
    注意:// 按照多字节的读取方式,要保证 CTRL_REG - [1] = 0 才能读到XYZ低位加速度值。
0 0
原创粉丝点击