这是我最近找到的三轴加速度MMA8451的中文手册和操作流程,现在发上来分享给大家
MMA8451三轴加速度传感器,16引脚,QFN封装,数字I2C输出,8位/14位精度可选,量程2g/4g/8g可选,电源供电1.95v~3.6v可选。输出数据速率从1.56到800Hz。有两个可编程的中断引脚,7个中断源。可检测自由落体、运动、脉冲、振动等、倾角等。 32个采样FIFO,每次采样都通过高通滤波后传入FIFO。 典型应用有:电子罗盘,静态姿态、运动检测,笔记本电子书等便携设备的翻滚、自由落体检测,实时的方向检测可用于虚拟现实设备或3d游戏中的位置检测,便携设备的节能应用中的运动检测等等。 芯片外形 不同姿态下X、Y、Z三轴对应的重力输出 典型连接 引脚定义如下: 灵敏度由count/g表示,2g量程下,可达4096/g,4g量程下,可达2048/g,8g量程下,可达1024/g MMA8451状态转换图 MMA8451内部框图,分为数字部分和模拟部分 在OFF模式下,数字部分和模拟部分都不工作 在STANDBY模式下,IIC通信照常进行,但模拟模块被禁止,内部时钟停止 在ACTIVE模式下(WAKE或SLEEP),IIC通信照常进行,数字和模拟模块都正常工作 I2C串行通信 MMA8451使用I2C串行通信和外部交换数据,MMA8451可通过中断信号指示新的采样序列可用,也可通过设置使用中断信号指示设备的移动、自由落体、瞬变、方向、单/双击。 I2C总线使用三根信号线进行通信,分别是SCL、SDA和SA0,外部上拉电阻需要将SDA和SCL接到VDDIO上,当总线空闲时,这两根线表现为高电平状态。MMA8451的I2C接口可工作在快速模式400KHz或普通模式100KHz。 总线传输开始由START信号触发,START信号定义为,当数据线从高电平跳变到低电平,而时钟线SCL仍然保持高电平。由主机发送START信号过后,I2C总线被认为从空闲(free)状态进入忙(busy)状态。紧接着START信号后主机发送的字节,前7位用于指示从机地址,第8位用于指示数据方向是读出(1数据从从机到主机)还是写入(0数据从主机到从机)。地址发送完毕后,总线上的所有从机将自己的地址和总线上接收到的地址进行比较,地址匹配的设备即为主机选中设备。第9个脉冲为应答响应,发送设备必须在这个ACK周期内释放数据线,而接收设备则需要在ACK周期的时钟高电平期间将数据线拉低。 SCL 线是高电平时,SDA 线由低电平向高电平切换,这个情况表示停止条件。停止条件将终止发送器的发送。 主机也可重复发出起始(START)条件,对于MMA8451,重复的起始条件可用于读取一些特殊的寄存器。 MMA8451的地址被设置为0x1c或0x1d,可用引脚7(SA0)的高低电平来选择。当SA0为高电平时,0x1d地址被选中有效,当SA0为低电平时,0x1c地址被选中有效。 重点概念: START条件:时钟线SCL为高电平期间,数据线从高电平跳变到低电平 START代码,使用IO口模拟IIC /******************************************* I2C START信号 时钟脉冲高电平期间,数据线负跳变 ********************************************/ void IIC_start(void) { IIC_SCL=0;//时钟线低 IIC_SDA=1;//数据线高 _asm(nop); IIC_SCL=1;//时钟线高 _asm(nop); IIC_SDA=0;//数据线从高跳变到低 _asm(nop); IIC_SCL=0;//时钟线低 } STOP条件: 时钟线SCL为高电平期间,数据线从低电平跳变到高电平 /******************************************* I2C STOP信号 时钟脉冲高电平期间,数据线正跳变 ********************************************/ void IIC_stop(void) { IIC_SCL=0;//时钟线低 _asm(nop); IIC_SDA=0;//数据线低 _asm(nop); IIC_SCL=1; //时钟线高 _asm(nop); IIC_SDA=1;//数据线正跳变 _asm(nop); IIC_SCL=0;//时钟线低 } ACK:确认,由地址匹配成功的从机在第9个脉冲周期内发出,这时主机释放数据线,从机在时钟高电平期间将数据线置为低电平。 MMA8451的I2C操作: 主机发送START,紧接着主机给出7位地址(0x1d或0x1c),并置第8位为0,表示数据从主机到从机。从机匹配地址后,返回确认ACK信号,接着主机传输8位寄存器地址,从机返回确认ACK。主机再次发出START,并给出7位从机地址,并置第8位为1,表示数据从从机到主机,从机确认后返回8位寄存器数据。主机不确认,并发出STOP。 注意:除了START,STOP,ACK以外,其它数据在时钟高电平期间必须维持不变。 单个字节读时序 主机发送八位数据或地址代码如下(使用IO口模拟) //************************************************* //字节发送程序 //发送c(可以是数据也可是地址),送完后接收从应答 //不考虑从应答位 void send_byte(unsigned char c) { unsigned char i; for(i=0;i<8;i++) { IIC_SCL=0; if((c<<i) & 0x80)IIC_SDA=1; //发送1 else IIC_SDA=0; //发送0 _asm(nop); IIC_SCL=1;//时钟高电平 _asm(nop); IIC_SCL=0;//时钟低电平 } _asm(nop);//第9个脉冲 IIC_SDA=1; //发送完8bit,释放总线准备接收应答位 _asm(nop); IIC_SCL=1; _asm(nop); //sda上数据即是从应答位 IIC_SCL=0; //不考虑从应答位,但要控制好时序 } **注意:发送设备地址时,MMA8451地址为0011100(0x1c,SA0=0)或0011101(0x1d,SA0=1),可将SA0引脚直接接地或接高电平,以接高电平为例,地址为7位,高位在前,地位在后,第8位为数据方向选择,若后续数据为主机到从机,则为0,若后续数据为从机到主机,则为1。 以单个字节读为例,地址设为0x1d,见时序图,START信号过后,则应发送00111010,即0x3A 可先如下定义,#define MMA8451_ADD 0X3A 第二次发送地址,则后续数据为从机到主机,第8位为1,可发送MMA8451_ADD+1即可
多字节读和单字节读基本相同,如果读完单字节后,主机不发送NAK和STOP,并对从机响应AK,则从机设备会自动将主机发送的寄存器地址加1,并发送对应的寄存器内容,直到主机响应NAK和STOP。
主机响应AK或NAK程序代码如下 //************************************************ //主应答(包含ack:SDA=0和no_ack:SDA=1) //入口参数:ack_main:1,应答ack,0,无需应答nak //注:ack:scl高电平期间,数据线低 // nak:scl高电平期间,数据线高 void IIC_ack_main(unsigned char ack_main) { IIC_SCL=0; if(ack_main)IIC_SDA=0; //ack主应答 else IIC_SDA=1; //no_ack无需应答 _asm(nop); IIC_SCL=1; _asm(nop); IIC_SCL=0; }
单个字节写入和单个字节读略有不同,区别在于发送为寄存器地址后,主机不再重复发送START信号和设备地址,而是直接给出写入的数据。代码如下: 多个字节写和单个字节写类似,只要主机发送STOP信号,则可以连续写入,写入的寄存器地址自动增加。
MMA8451寄存器: - 状态寄存器STATUS/F_STATUS 地址0x00
- 控制寄存器CTRL_REG1,地址0x2a
ASLP_RATE[1:0]:设置睡眠模式采样频率,默认00 DR[2:0]:数据速率选择。默认为000,800Hz 注意:当设备在睡眠模式下,数据输出速率以ASLP_RATE[1:0]为准,DR设置速率无效。 LNOISE:
- XYZ数据设置寄存器XYZ_DATA_CFG,地址0x0e
HPF_OUT:高通滤波器数据输出使能。 HPF_OUT=1:使能; HPF_OUT=0:禁止。 FS1:FS0:XYZ量程设置。 如下表所示:
完整的Word格式文档51黑下载地址: |