Atmega16驱动三轴加速度传感器MMA7455

最近做一个设计G-Sense的设备,需要一个三轴加速度传感器,最终选择飞思卡尔的MMA7455,因为看起来似乎比博士的三轴加速度芯片简单一些,哈哈。原本是准备应用在ARM上的,首先在比较熟悉的AVR单片机的环境下做个测试。
来个MMA7455模块的近照:

MMA7455模块外观图

考虑到7455工作在3.3V,所以用宽电压工作的Atmega16L,这样就不存在电压冲突的问题。电路图参考7455的Datasheet:

MMA7455电路图

在这里,中断INT1和INT2我都没有用,ACC_CS接3.3采用I2C模式,IADDR0接3.3,设置7455的写地址为0X3A,读地址为0X3B,该引脚如果接地,则7455的读写地址分分别为0X38和0X39(参考7455手册)。

下面贴出所有的代码(测试通过)

<span style="font-size:13px;">/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          Type.h 
** Last modified Date: 2011-09-1
** Last Version:       1.0 
** Description:         定义数据类型的别名
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */
 
#ifndef  __TYPE_H__ 
#define  __TYPE_H__ 
 
/******************************************************************************************************** 
*                       Date types(Compiler specific)  数据类型(和编译器相关)                         *                  
********************************************************************************************************/ 
typedef unsigned char  uint8;          // Unsigned  8 bit quantity  无符号8位整型变量       
typedef signed   char  int8;           // Signed    8 bit quantity  有符号8位整型变量    
typedef unsigned short uint16;         // Unsigned 16 bit quantity  无符号16位整型变量 
typedef signed   short int16;          // Signed   16 bit quantity  有符号16位整型变量  
typedef unsigned int   uint32;         // Unsigned 32 bit quantity  无符号32位整型变量  
typedef signed   int   int32;          // Signed   32 bit quantity  有符号32位整型变量 
typedef float           fp32;          // Single precision floating point 单精度浮点数(32位长度)     
typedef double          fp64;          // Double precision floating point 双精度浮点数(64位长度)   
 
#ifndef TRUE 
#define TRUE  1 
#endif 
 
#ifndef FALSE 
#define FALSE 0 
#endif 
 
#ifndef NULL 
#define NULL  0 
#endif 
 
 
 
#endif 
/********************************************************************************************************* 
*                                        End Of File                                                     * 
*********************************************************************************************************/ </span>

 

/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          I2C.h 
** Last modified Date: 2011-09-1
** Last Version:       1.0 
** Description:        IO口模拟I2C协议的函数声明
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-1
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */
#ifndef  __I2C_H__ 
#define  __I2C_H__ 

#include "Type.h"

extern void I2C_Init(void);
extern void Delay(void);
extern void I2C_Start(void);
extern void I2C_Stop(void);
extern uint8 Write_I2C(uint8 data);
extern uint8 Read_I2C(uint8 ack);

#endif 
/********************************************************************************************************* 
*                                        End Of File                                                     * 
*********************************************************************************************************/

 

/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          I2C.c
** Last modified Date: 2011-09-01
** Last Version:       1.0 
** Description:        IO口模拟I2C协议的函数实现
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */

#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"

//外部上拉电阻,PORTC.0--SCL,PORTC.1--SDA,模拟I2C协议
//当DDRC.0和DDRC.1置为输出时,拉低SDA;置为输入时,内部上拉拉高SDA(省去了外部上拉电阻)

#define SCL_0 DDRA|=BIT(0)
#define SCL_1 DDRA&=~BIT(0)
#define SDA_0 DDRA|=BIT(1)
#define SDA_1 DDRA&=~BIT(1)
#define SDA_in (PINA&0X02)  //判断SDA的电平


/*********************************************************************************************************  
** Function name:       I2C_Inti  
** Descriptions:        I2C初始化 
** input parameters:    无
** output parameters:   无  
** Returned value:      无  
*********************************************************************************************************/
void I2C_Init(void)
{
    PORTA&=~(BIT(0)|BIT(1));
    SCL_1;
    SDA_1;
}

/*********************************************************************************************************  
** Function name:       Delay
** Descriptions:        模拟I2C时序的延时 
** input parameters:    无
** output parameters:   无  
** Returned value:      无  
*********************************************************************************************************/
void Delay(void)  
{
    NOP();
    NOP();
    NOP();
    NOP();
}

/*********************************************************************************************************  
** Function name:       I2C_Start
** Descriptions:        模拟I2C的开始时序 
** input parameters:    无
** output parameters:   无  
** Returned value:      无  
*********************************************************************************************************/
void I2C_Start(void)
{
    SDA_1;
    SCL_1;
    Delay();
    SDA_0;
    Delay();
    SCL_0;
    Delay();
}

/*********************************************************************************************************  
** Function name:       I2C_Stop
** Descriptions:        模拟I2C时序的结束时序
** input parameters:    无
** output parameters:   无  
** Returned value:      无  
*********************************************************************************************************/
void I2C_Stop(void)
{
    SDA_0;
    SCL_1;
    Delay();
    SDA_1;
    Delay();
}

/*********************************************************************************************************  
** Function name:       Write_I2C
** Descriptions:        向I2C器件的指定单元写一个字节
** input parameters:    代写入的一字节数据
** output parameters:   无  
** Returned value:      接收器件的应答信号(1-已经应答 0-没有应答) 
*********************************************************************************************************/
uint8 Write_I2C(uint8 data)
{
    uint8 ack,i;
    for(i=0;i<8;i++)
    {
        if(data&0X80)
        {
            SDA_1;
        }
        else
        {
            SDA_0;
        }
        SCL_1;
        Delay();
        SCL_0;
        data <<= 1;
        Delay();
    }
    Delay();
    SDA_1;  //释放总线,等到应答
    Delay();
    SCL_1;
    Delay();
    if(SDA_in)
    {
        ack=0;
    }
    else
    {
        ack=1;
    }
    SCL_0;
    Delay();
    return ack;
}

/*********************************************************************************************************  
** Function name:       Read_I2C
** Descriptions:        读取I2C器件一个字节
** input parameters:    是否应答(0-NACK,1-ACK)
** output parameters:   无  
** Returned value:      读到的一个字节
*********************************************************************************************************/
uint8 Read_I2C(uint8 ack)
{
    uint8 i,temp;
    temp=0;
    SDA_1;
    for(i=0;i<8;i++)
    {
        Delay();
        SCL_0;
        Delay();
        SCL_1;
        Delay();
        temp<<=1;
        if(SDA_in)
        {
            temp++;
        }
    }
    SCL_0;  //使从机等待,发出应答信号
    Delay();
    if(!ack)
    {
        SDA_1;
    }
    else
    {
        SDA_0;
    }
    Delay();
    SCL_1;
    Delay();
    SCL_0;
    Delay();
    return temp;
}

 

/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          MMA7455.h 
** Last modified Date: 2011-09-02
** Last Version:       1.0 
** Description:        读写MMA7455的声明
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-02
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */

#ifdef __MMA7455_H__
#define __MMA7455_H__

#include "Type.h"

void MMA7455_ByteWrite(uint8 add, uint8 data);
uint8 MMA7455_ByteRead(uint8 add);

#endif

 

/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          MMA7455.c
** Last modified Date: 2011-09-02
** Last Version:       1.0 
** Description:        读写MMA7455的实现
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-02
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */
#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"
#include "MMA7455.h"
#include "USART.h"

#define ACK 1  //MMA7455应答
#define NACK 0

/*********************************************************************************************************  
** Function name:       毫秒级延时程序
** Descriptions:        延时N毫秒
** input parameters:    延时秒数
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void Delay_ms(uint32 ms)
{    
    uint32 i,j;
    for(i=0;i<ms;i++)
        for(j=0;j<564;j++);
}

/*********************************************************************************************************  
** Function name:       MMA7455_ByteWrite
** Descriptions:        向MMA7455指定地址写一个字节
** input parameters:    写入地址:add,写入字节:data
** output parameters:   无
** Returned value:      无
*********************************************************************************************************/
void MMA7455_ByteWrite(uint8 add,uint8 data)
{
    I2C_Start();
    Write_I2C(0x3A); //写MMA7455的设备地址
    Write_I2C(add);
    Write_I2C(data);
    I2C_Stop();
    Delay_ms(10);  //这个延时很重要,保证写入时间
}

/*********************************************************************************************************  
** Function name:       MMA7455_ByteRead
** Descriptions:        读MMA7455指定地址一个字节
** input parameters:    读字节地址:add
** output parameters:   无
** Returned value:      读出的字节
*********************************************************************************************************/

uint8 MMA7455_ByteRead(uint8 add)
{
    uint8 data;
    I2C_Start();
    Write_I2C(0x3A);  //写命令
    Write_I2C(add);
    I2C_Start();
    Write_I2C(0x3B);  //读命令
    data=Read_I2C(NACK);
    I2C_Stop();
    return data;
}

 

/****************************************Copyright (c)************************************************** 
**                                   Southeast Univerdity                            
**--------------File Info------------------------------------------------------------------------------- 
** File Name:          main.c 
** Last modified Date: 2011-09-05
** Last Version:       1.0 
** Description:        测试函数
**------------------------------------------------------------------------------------------------------ 
** Created By:         JianGe
** Created date:       2011-09-01
** Version:            1.0 
**------------------------------------------------------------------------------------------------------ */

#include<iom16v.h>
#include<macros.h>
#include"I2C.h"
#include "Type.h"
#include "MMA7455.h"
#include "USART.h"


void main(void)
{
    int8 X,Y,Z = 0;
    MMA7455_ByteWrite(0x16,0x05);  //配置为measurement模式,8位精度
    MMA7455_ByteWrite(0x18,0x80);
    
    MMA7455_ByteWrite(0x10,11); 
    //MMA7455_ByteWrite(0x11,0); 
    MMA7455_ByteWrite(0x12,50); 
    //MMA7455_ByteWrite(0x13,0); 
    MMA7455_ByteWrite(0x14,0xD7);  
    MMA7455_ByteWrite(0x15,0xFF);  //若校正值为负,则一定要写入0XFF
    
    X = MMA7455_ByteRead(0x06);
    Y = MMA7455_ByteRead(0x07);
    Z = MMA7455_ByteRead(0x08);
    while(1);
    
}

posted on 2015-08-26 14:56  jianqi2010  阅读(478)  评论(0编辑  收藏  举报

导航