[求助] msp430,MMA7455,问题啊...IIC.问题

莫莫无蚊   2011-8-16 18:13 楼主
MSP430,写了一个EEPROM的程序,IIC 通过.~在用同样的IIC,做 MMA7455,为什么 ACK或者CHECK,或者叫respons怎么没应答(用一个IF()就可以知道有没有应答了)......今天搞了半天.... 就是不行...求指教啊..结果是 X1=0,Y1=255,


//这是 IIC.C
#include

#define SCL_H P1OUT |= BIT2
#define SCL_L P1OUT &= ~BIT2
#define SDA_H P1OUT |= BIT3
#define SDA_L P1OUT &= ~BIT3

#define SDA_in  P1DIR &= ~BIT3   //SDA改成输入模式
#define SDA_out P1DIR |= BIT3    //SDA变回输出模式
#define SDA_val P1IN&BIT3        //SDA的位值

#define TRUE    1
#define FALSE   0

/*******************************************
函数名称:delay
功    能:延时约15us的时间
参    数:无
返回值  :无
********************************************/
void delay(void)
{
    uchar i;
   
        for(i = 0;i < 15;i++)
          _NOP();
}       
/*******************************************
函数名称:start
功    能:完成IIC的起始条件操作
参    数:无
返回值  :无
********************************************/
void start(void)
{
        SCL_H;
        SDA_H;
        delay();
        SDA_L;
        delay();
        SCL_L;
        delay();
}
/*******************************************
函数名称:stop
功    能:完成IIC的终止条件操作
参    数:无
返回值  :无
********************************************/
void stop(void)
{
        SDA_L;
        delay();
        SCL_H;
        delay();
        SDA_H;
        delay();          
}
/*******************************************
函数名称:mack
功    能:完成IIC的主机应答操作
参    数:无
返回值  :无
********************************************/
void mack(void)
{
        SDA_L;
        _NOP(); _NOP();
        SCL_H;
        delay();
        SCL_L;
        _NOP();_NOP();
        SDA_H;     
        delay();
}
/*******************************************
函数名称:mnack
功    能:完成IIC的主机无应答操作
参    数:无
返回值  :无
********************************************/
void mnack(void)
{
        SDA_H;
        _NOP(); _NOP();
        SCL_H;
        delay();
        SCL_L;
        _NOP(); _NOP();
        SDA_L;   
        delay();      
}

/**********检查应答信号函数******************/
/*如果返回值为1则证明有应答信号,反之没有*/
/*******************************************
函数名称:check
功    能:检查从机的应答操作
参    数:无
返回值  :从机是否有应答:1--有,0--无
********************************************/
uchar check(void)
{
        uchar slaveack;
   
        SDA_H;
        _NOP(); _NOP();
        SCL_H;
        _NOP(); _NOP();
        SDA_in;
        _NOP(); _NOP();
        slaveack = SDA_val;   //读入SDA数值
        SCL_L;
        delay();
    SDA_out;
    if(slaveack)    return FALSE;
    else            return TRUE;
}
/*******************************************
函数名称:write1
功    能:向IIC总线发送一个1
参    数:无
返回值  :无
********************************************/
void write1(void)
{
        SDA_H;
        delay();
        SCL_H;
        delay();
        SCL_L;                               
        delay();
}
/*******************************************
函数名称:write0
功    能:向IIC总线发送一个0
参    数:无
返回值  :无
********************************************/
void write0(void)
{
        SDA_L;
        delay();
        SCL_H;
        delay();                         
        SCL_L;                               
        delay();
}
/*******************************************
函数名称:write1byte
功    能:向IIC总线发送一个字节的数据
参    数:wdata--发送的数据
返回值  :无
********************************************/
void write1byte(uchar wdata)
{
        uchar i;
   
        for(i = 8;i > 0;i--)
        {
                if(wdata & 0x80)        write1();
                else                             write0();
                wdata <<= 1;
        }                  
       
        SDA_H;
        _NOP();   
}
/*******************************************
函数名称:writeNbyte
功    能:向IIC总线发送N个字节的数据
参    数:outbuffer--指向发送数据存放首地址
          的指针
          n--数据的个数
返回值  :发送是否成功的标志:1--成功,0--失败
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
        uchar i;
   
        for(i = 0;i < n;i++)
        {
                write1byte(* outbuffer);
                if(check())      
                {
                        outbuffer++;                       
                }
                else
                {
                        stop();
                        return FALSE;
                }
        }

        stop();
        return TRUE;                       
}
/*******************************************
函数名称:read1byte
功    能:从IIC总线读取一个字节
参    数:无
返回值  :读取的数据
********************************************/
uchar read1byte(void)
{
        uchar  rdata = 0x00,i;
    uchar flag;
   
        for(i = 0;i < 8;i++)
        {
                SDA_H;
                delay();
                SCL_H;
        SDA_in;
                delay();
                flag = SDA_val;
                rdata <<= 1;
                if(flag)        rdata |= 0x01;
        SDA_out;
                SCL_L;
                delay();
        }

        return rdata;
}
/*******************************************
函数名称:readNbyte
功    能:从IIC总线读取N个字节的数据
参    数:inbuffer--读取后数据存放的首地址
          n--数据的个数
返回值  :无
********************************************/
void readNbyte(uchar * inbuffer,uchar n)
{
        uchar i;
   
        for(i = 0;i < n;i++)
        {
                inbuffer = read1byte();
                if(i < (n-1))        mack();
                else            mnack();
        }
         
        stop();
}


//这是 MMA7455.C

#include
#include "IIC.H"
#include "MMA7455.h"

extern unsigned char X1,Y1,Z1;

void delay_10ms(void)
{
        int i = 1000;
        while(i--);
}
void mma7455()
{
  start();
  write1byte(MMA7455_ADDER_WRITE);     //1. IIC地址寻址
  if(check())
    X1=1;                              //这里 想看看有没有应答 改变X1的值!!! 结果是 X1=0,Y1=255,
  write1byte(MMA7455_READ_X);      //2. X轴数据寄存器寻址
  start();             //3.
  write1byte(MMA7455_ADDER_READ);     //改变读写方向
  if(check())
    X1=read1byte();        //4.读数据
  stop();
  delay_10ms();
  
  start();
  write1byte(MMA7455_ADDER_WRITE);     //1. IIC地址寻址
  check();
  write1byte(MMA7455_READ_Y);      //2. X轴数据寄存器寻址
  start();             //3.
  write1byte(MMA7455_ADDER_READ);     //改变读写方向
  check();
    Y1=read1byte();        //4.读数据
  stop();
  delay_10ms();
}

void INIT_MMA7455()
{
   
    //写数据
    start();
    write1byte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
    check();
    write1byte(MMA7455_Mode_Control_Register);    //2. 模式设置寄存器寻址

    check();
    write1byte(0x05);         //3. 模式寄存器数据写入

    check();
    stop();
   delay_10ms();
    //写数据
    start();
    write1byte(MMA7455_ADDER_WRITE);     //1. 在IIC总线上寻址MMA7455
    check();
    write1byte(MMA7455_Mode_Control_Register);    //2. 量程检测设置寄存器寻址

    check();
    write1byte(MMA7455_2G_Measurement_Mode);    //3. 设置量程为2G,检测模式。量程检测设置寄存器配置数据写入

   
    check();
   
    stop();
    delay_10ms();
}

结果是 X1=0,Y1=255,

回复评论 (2)

怎么会不应答呢?看看是不是那个加速器的外围电路的问题?你的应该是f149吧,没有集成IIC模块
点赞  2011-8-16 18:35

回复 沙发 cl1217982730 的帖子

那个是买的模块, 51测试通过...我149是照 51 初始化MMA7455 来写的.
点赞  2011-8-17 09:36
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复