找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2041|回复: 0
收起左侧

VL53X0调试源代码

[复制链接]
ID:531506 发表于 2019-8-22 10:50 | 显示全部楼层 |阅读模式
#include "ioCC2530.h"
#include "VL53L0X.h"

typedef union
{
    uint16 u16;               // element specifier for accessing whole u16
    int16 i16;               // element specifier for accessing whole i16

    struct
    {
        uint8 u8L;              // element specifier for accessing low u8
        uint8 u8H;              // element specifier for accessing high u8
    } s16;                  // element spec. for acc. struct with low or high u8
} nt16;

void Delay_5us()
{
    uint8 i;

    for (i=0; i<8; i++)
    {
        asm("NOP");
    }
}

void Delay_ms(uint16 sec)
{
    uint16 i;

    while (sec --)
    {
        for (i = 0; i < 1500; i ++)
        {
            asm("NOP");
        }
    }
    return;
}

void initUARTSEND(void)
{
    //时钟配置
    CLKCONCMD &= ~0x40;        //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);   //等待晶振稳定
    CLKCONCMD &= ~0x47;        //设置系统主时钟频率为32MHZ
    //端口配置
    PERCFG = 0x00;               //位置1 P0口
    P0SEL = 0x0c;                                //P0_2,P0_3用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0
   //串口配置
    U0CSR |= 0x80;                                //UART方式
    U0GCR |= 11;                                 //U0GCR.BAUD_E
    U0BAUD |= 216;                                //波特率设为115200 UxBAUD.BAUD_M
    UTX0IF = 0;                                 //UART0 TX中断标志初始置位0
}

void UartSendString(char *Data, uint16 len)
{
  uint16 j;
  for (j = 0; j < len; j++)
  {
    U0DBUF = *Data++;
    for (; 0 == UTX0IF ;);
    UTX0IF = 0;
  }
}

void uart0PutChar(char c)
{
  uint16 i;

  for(i=0; i<10000; i++)
  {
    if(!(U0CSR & 0x01))
    break;
  }

  U0DBUF = c;
  for(i=0; i<10000; i++)
  {
    if(!(U0CSR & 0x01))
    break;
  }
}

uint16 makeuint16(int lsb, int msb)
{
  return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}

void uartPutInt16(uint16 c)
{
  uart0PutChar((c & 0xFF00) >> 8);
  uart0PutChar(c & 0xFF);
}

void GPIO_Init(void)
{
    P0SEL &= ~0x12;          //将P0_1、P0_4设置为通用I/O端口功能
    P0DIR |= 0x02;           //将P0_1的端口传输方式设置为输出
    P0DIR &= ~0x10;          //将P0_4的端口传输方式设置为输入

    P1SEL &= ~0x08;          //将P1_3设置为通用I/O端口功能
    P1DIR |= 0x08;           //将P1_3的端口传输方式设置为输出
    P0INP &= ~0xef;
    P2INP &= ~0x20;
    KK_wakeup = 1;
    KK_Xshut = 0;
}

void I2C1_Init(void)
{
    SCL_1_W();
    SDA_1_W();

    I2C1_SCL_HIGH;
    I2C1_SDA_HIGH;   
}

void I2C1_Start(void)
{
    SCL_1_W();SDA_1_W();
    I2C1_SDA_HIGH;
    I2C1_SCL_HIGH;
    Delay_5us();
    I2C1_SDA_LOW;
    Delay_5us();
    Delay_5us();
    I2C1_SCL_LOW;
}

void I2C1_Stop(void)
{
    SCL_1_W();SDA_1_W();

    I2C1_SDA_LOW;
    I2C1_SCL_LOW;
    Delay_5us();
    I2C1_SCL_HIGH;
    Delay_5us();
    Delay_5us();
    I2C1_SDA_HIGH;
}

uint8 I2C1_WaitAck(void)
{
    uint8 ErrTime = 0;

    // 将 SCL 引脚和 SDA 引脚设置为输出模式
    SCL_1_W();SDA_1_W();

    I2C1_SDA_HIGH;       // SDA 置高
    I2C1_SCL_HIGH;       // SCL 置高
    Delay_5us();

    SDA_1_R();            // SDA 设置为输入模式
    while(I2C1_SDA_STATE)// 当 SDA 为低电平时退出循环
    {
        ErrTime++;
        if(ErrTime>250)
        {
            I2C1_Stop();
            return true;
        }
    }
    I2C1_SCL_LOW;
    Delay_5us();

    return false;
}

void I2C1_SendAck(void)
{
    SCL_1_W();SDA_1_W();

    I2C1_SDA_LOW;
    I2C1_SCL_LOW;
    Delay_5us();
    I2C1_SCL_HIGH;
    Delay_5us();
    I2C1_SCL_LOW;
}

void I2C1_SendNoAck(void)
{
    SCL_1_W();SDA_1_W();

    I2C1_SCL_LOW;
    I2C1_SDA_HIGH;
    Delay_5us();
    I2C1_SDA_HIGH;
    Delay_5us();
    I2C1_SCL_LOW;
}

void I2C1_Send_Byte(uint8 txd)
{
    uint8 t = 0;

    SCL_1_W();SDA_1_W();

    for (t = 0; t < 8; t ++)
    {
        if ((txd & 0x80) >> 7)
        {
            I2C1_SDA_HIGH;
        }
        else
        {
            I2C1_SDA_LOW;
        }

        txd <<= 1;

        Delay_5us();
        I2C1_SCL_HIGH;

        Delay_5us();
        I2C1_SCL_LOW;

        Delay_5us();
    }
}

uint8 I2C1_Read_Byte(uint8 ack)
{
    uint8 i = 0;
    uint8 receive = 0;

    SDA_1_R();
    for (i = 0; i < 8; i ++)
    {
        I2C1_SCL_LOW;
        Delay_5us();

        I2C1_SCL_HIGH;
        receive <<= 1;

        if (I2C1_SDA_STATE)
        {
            receive ++;
        }
        Delay_5us();
    }

    if (ack)
    {
        I2C1_SendAck();
    }
    else
    {
        I2C1_SendNoAck();
    }

    return receive;
}
/*****************************************************
函数功能:IIC连续写
主要参数:
addr-->器件地址
reg-->寄存器地址
len-->写入长度
buf-->数据区
返回值:0,正常
*****************************************************/
uint8 VL53L0X_Write_Len(uint8 reg,uint8 len,uint8 const *buf)
{
    uint8 i;

    I2C1_Start();
    I2C1_Send_Byte(0x52);       //发送器件地址+写命令  
    if(I2C1_WaitAck())        //等待应答
    {
       I2C1_Stop();                 
       return true;               
    }
    I2C1_Send_Byte(reg);        //写寄存器地址
    I2C1_WaitAck();            //等待应答
    for(i=0;i<len;i++)
    {
       I2C1_Send_Byte(buf[i]);        //发送数据
       if(I2C1_WaitAck())            //等待ACK
       {
          I2C1_Stop();         
          return true;                 
       }               
    }   
    I2C1_Stop();  

    return false;        
}
/*****************************************************
函数功能:IIC连续读
主要参数:
addr-->器件地址
reg-->寄存器地址
len-->读取长度
buf-->数据区
返回值:0,正常
*****************************************************/
uint8 VL53L0X_Read_Len(uint8 reg,uint8 len,uint8 *buf)
{
    I2C1_Start();
    I2C1_Send_Byte(0x52);//发送器件地址+写命令        
    if(I2C1_WaitAck())         //等待应答
    {
       I2C1_Stop();                 
       return true;               
    }
    I2C1_Send_Byte(reg);        //写寄存器地址
    I2C1_WaitAck();            //等待应答
    I2C1_Start();
    I2C1_Send_Byte(0x53);//发送器件地址+读命令        
    I2C1_WaitAck();            //等待应答
    while(len)
    {
       if(len==1)*buf=I2C1_Read_Byte(0);//读数据,发送nACK
       else *buf=I2C1_Read_Byte(1);     //读数据,发送ACK  
       len--;
       buf++;
    }   
    I2C1_Stop();        //产生一个停止条件

    return false;        
}

uint8 VL53L0X_Write_Byte(uint8 reg,uint8 data)                                 
{
    I2C1_Start();
    I2C1_Send_Byte(0x52);//发送器件地址+写命令        
    if(I2C1_WaitAck()) //等待应答
    {
       I2C1_Stop();                 
       return true;               
    }

    I2C1_Send_Byte(reg);          //写寄存器地址
    I2C1_WaitAck();               //等待应答
    I2C1_Send_Byte(data);         //写入数据
    if(I2C1_WaitAck())           //等待ACK
    {
       I2C1_Stop();         
       return true;                 
    }                 
    I2C1_Stop();  

    return false;
}

uint8 VL53L0X_Read_Byte(uint8 reg)
{
    uint8 VL53L0X_data;

    I2C1_Start();   
    I2C1_Send_Byte(0x52);          //发送器件地址+写命令        
    I2C1_WaitAck();                //等待应答
    I2C1_Send_Byte(reg);          //写寄存器地址
    I2C1_WaitAck();                //等待应答
    I2C1_Stop();                  //产生一个停止条件

    I2C1_Start();
    I2C1_Send_Byte(0x53);         //发送器件地址+读命令        
    I2C1_WaitAck();                //等待应答
    VL53L0X_data=I2C1_Read_Byte(0);//读取数据,发送ACK
    I2C1_Stop();                  //产生一个停止条件

    return VL53L0X_data;               
}

void main()
{
  uint8 gbuf[16];
  uint8 val = 0;
  uint32 cnt = 0;
  uint16 Distance = 0;

  GPIO_Init();
  Delay_ms(100);
  KK_Xshut = 1;  
  initUARTSEND();
  I2C1_Init();  


  while(1)
  {   
      if(KK_lcdctl)
      {
          KK_wakeup = 1;
      }
      else
      {
          //uartPutInt16(0xff);
          VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);//启动检测
          while(cnt < 65535)//当检测完成,即读取距离值
          {
             Delay_ms(1);
             val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);
             if( val & 0x01) break;
             cnt++;
          }

          if( val & 0x01)
          {  
              VL53L0X_Read_Len(0x1E , 2, gbuf);//读取数据      
//              VL53L0X_Write_Byte(0x0b, 0x01);//启动检测
              Distance = gbuf[0]<<8;
              Distance |= gbuf[1];                                 
          }

          if((Distance > 20)&&(Distance < 1500))
          {
             uartPutInt16(Distance);
             if((Distance>=450)&&(Distance<=550))
             {
                KK_wakeup = 0;
             }
          }
          Delay_ms(200);
      }      
  }
}


Source.zip

3.19 KB, 下载次数: 16, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表