BowenQQ 发表于 2014-12-9 11:45:14

哪位坛友用过KMA36磁阻传感器,请指点一二,感激不尽!

KMA36 磁阻传感器做直线位移测量,标准的IIC读取数据,有起始和停止波形,就是不能读出数据,有了解我大侠帮忙看看,感激不尽~

sbit    KMA36_SDA=P3^0;         //定义数据线
sbit    KMA36_SCL=P3^1;         //定义时钟线
bit   flag;

uint    idataucSendBuffer=0;
uint    idataucReceData;

void    delay(void);
void    delay_10ms(void);

void    ACK();
void    NoACK();
/**************************************************************/
void delay(void)
{
uint i;
for(i=100;i>0;i--)
_nop_();
}

void delay1ms()
{
uchar i;
for(i=124;i>0;i--);//延时124*8+10=1002us
}
/*********************************************************
**名称:I2C_Start
**功能:启动I2C
**输入:无
**返回:无
*********************************************************/
void I2C_Start()
{
      KMA36_SDA=1;
      delay();
      KMA36_SCL=1;
      delay();
      KMA36_SDA=0;
      delay();
      KMA36_SCL=0;                //钳位I2C总线,准备发送数据
}
/**********************************************************
**名称:I2C_Stop
**功能:停止I2C
**输入:无
**返回:无
**********************************************************/
void I2C_Stop()
{
      KMA36_SDA=0;
      delay();
      KMA36_SCL=1;
      delay();
      KMA36_SDA=1;
      delay();
}
/**********************************************************
**名称:Ack
**功能:应答信号
**输入:无
**返回:无
**********************************************************/
void Ack()
{
      KMA36_SDA=0;
      delay();
      KMA36_SCL=1;
      delay();
      KMA36_SCL=0;
      delay();
      KMA36_SDA=1;
      delay();
}
/********************************************************
**名称:NoAck
**功能:发送非应答信号
**输入:无
**返回:无
********************************************************/
void NoAck()
{
      KMA36_SDA=1;
      delay();
      KMA36_SCL=1;
      delay();
      KMA36_SCL=0;
      delay();
      KMA36_SDA=0;
      delay();
}
/********************************************************
**名称:Test_Ack()
**功能:检测应答位
**输入:无
**返回:flag,有应答时flag为0,无应答时flag为1
*********************************************************/
bit Test_Ack()
{
      KMA36_SCL=0;
      KMA36_SDA=1;//读入数据
      _nop_();_nop_();_nop_();_nop_();
      KMA36_SCL=1;
      _nop_();_nop_();_nop_();_nop_();
      if(KMA36_SDA==0)
                flag=1;
      else      flag=0;
      KMA36_SCL=0;
      return(flag);
}
/*******************************************************
**名称:SendData()      
**功能:发送一字节数据
**输入:buffer
**返回:
*******************************************************/
void SendData(uint buffer)
{
      uint BitCnt=8;//一字节8位
      uint temp=0;
      do
      {
                temp=buffer;
                KMA36_SCL=0;
                delay();
                if((temp&0x80)==0) //判断最高位是0还是1
                        KMA36_SDA=0;
                else
                        KMA36_SDA=1;
                delay();
                KMA36_SCL=1;
                temp=_crol_(buffer,1);//将buffer中的数据左移一位
                buffer=temp;
                BitCnt--;
      }
      while(BitCnt);
      KMA36_SCL=0;      
}
/**************************************************************
**名称:uint ReceiveData()
**功能:接收一字节数据
**输入:
**返回:ucReceData
**说明:将接收的数据存放在ucReceData中
**************************************************************/
uint ReceiveData()
{
      uint BitCnt=8;
      uint temp=0;
      KMA36_SDA=1;//读入数据
      do
      {
                KMA36_SCL=0;
                delay();
                KMA36_SCL=1;
                delay();
                if(KMA36_SDA==1)
                        ucReceData=ucReceData|0x01;//低位置1
                else
                        ucReceData=ucReceData&0x0fe; //低位清0
                if(BitCnt-1)
                {
                        temp=_crol_(ucReceData,1);   //数据左移一位
                        ucReceData=temp;
                }
                BitCnt--;
      }
      while(BitCnt);
      KMA36_SCL=0;
      return(ucReceData);
}

/*************************************************************
**名称:bit WriteNByte()
**功能:主机向24C02中写入多字节数据
**输入:
**返回:
**说明:sla-器件地址 suba-数据地址,*s-写入的数据,n-写入的字节数(n<=8)
**************************************************************/
bit WriteNByte(uint sla,uint suba,uint *s,uint n)
{
      uint i;
      I2C_Start();//启动I2C
      SendData(sla);//发送器件地址
      Test_Ack();
       // if(flag==0)      return(0);
      SendData(suba);
      Test_Ack();
      //if(flag==0)      return(0);
      for(i=0;i<n;i++)//写入8字节数据
      {
                SendData(*(s+i));
                Test_Ack();
               // if(flag==0)      return(0);
      }
      I2C_Stop();
      return(1);
}
/*************************************************************
**名称:bit ReadNByte()
**功能:主机从24C02中读出N字节数据(n<=8)
**输入:
**返回:
**说明:随机地址读操作
**************************************************************/
bit ReadNByte(uint sla,uint suba,uint *p,uint n)
{
      uint i;
      I2C_Start();//启动I2C
      SendData(sla);//发送器件地址
      Test_Ack();
      //if(flag==0)      return(0);
      SendData(suba);//发送器件内部地址
      Test_Ack();
      //if(flag==0)      return(0);

      I2C_Start();
      SendData(sla+1);
      Test_Ack();
      if(flag==0)      return(0);
      for(i=0;i<n-1;i++)//读取字节数据
      {
                *(p+i)=ReceiveData();//读取数据
                ACK();
      }
      *(p+n-1)=ReceiveData();
      
      NoACK();
      I2C_Stop();
      return(1);
}
页: [1]
查看完整版本: 哪位坛友用过KMA36磁阻传感器,请指点一二,感激不尽!