久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2540|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

VL53X0調(diào)試源代碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:531506 發(fā)表于 2019-8-22 10:50 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#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)
{
    //時(shí)鐘配置
    CLKCONCMD &= ~0x40;        //設(shè)置系統(tǒng)時(shí)鐘源為32MHZ晶振
    while(CLKCONSTA & 0x40);   //等待晶振穩(wěn)定
    CLKCONCMD &= ~0x47;        //設(shè)置系統(tǒng)主時(shí)鐘頻率為32MHZ
    //端口配置
    PERCFG = 0x00;               //位置1 P0口
    P0SEL = 0x0c;                                //P0_2,P0_3用作串口
    P2DIR &= ~0XC0;                             //P0優(yōu)先作為UART0
   //串口配置
    U0CSR |= 0x80;                                //UART方式
    U0GCR |= 11;                                 //U0GCR.BAUD_E
    U0BAUD |= 216;                                //波特率設(shè)為115200 UxBAUD.BAUD_M
    UTX0IF = 0;                                 //UART0 TX中斷標(biāo)志初始置位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設(shè)置為通用I/O端口功能
    P0DIR |= 0x02;           //將P0_1的端口傳輸方式設(shè)置為輸出
    P0DIR &= ~0x10;          //將P0_4的端口傳輸方式設(shè)置為輸入

    P1SEL &= ~0x08;          //將P1_3設(shè)置為通用I/O端口功能
    P1DIR |= 0x08;           //將P1_3的端口傳輸方式設(shè)置為輸出
    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 引腳設(shè)置為輸出模式
    SCL_1_W();SDA_1_W();

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

    SDA_1_R();            // SDA 設(shè)置為輸入模式
    while(I2C1_SDA_STATE)// 當(dāng) SDA 為低電平時(shí)退出循環(huán)
    {
        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;
}
/*****************************************************
函數(shù)功能:IIC連續(xù)寫
主要參數(shù):
addr-->器件地址
reg-->寄存器地址
len-->寫入長(zhǎng)度
buf-->數(shù)據(jù)區(qū)
返回值:0,正常
*****************************************************/
uint8 VL53L0X_Write_Len(uint8 reg,uint8 len,uint8 const *buf)
{
    uint8 i;

    I2C1_Start();
    I2C1_Send_Byte(0x52);       //發(fā)送器件地址+寫命令  
    if(I2C1_WaitAck())        //等待應(yīng)答
    {
       I2C1_Stop();                 
       return true;               
    }
    I2C1_Send_Byte(reg);        //寫寄存器地址
    I2C1_WaitAck();            //等待應(yīng)答
    for(i=0;i<len;i++)
    {
       I2C1_Send_Byte(buf[i]);        //發(fā)送數(shù)據(jù)
       if(I2C1_WaitAck())            //等待ACK
       {
          I2C1_Stop();         
          return true;                 
       }               
    }   
    I2C1_Stop();  

    return false;        
}
/*****************************************************
函數(shù)功能:IIC連續(xù)讀
主要參數(shù):
addr-->器件地址
reg-->寄存器地址
len-->讀取長(zhǎng)度
buf-->數(shù)據(jù)區(qū)
返回值:0,正常
*****************************************************/
uint8 VL53L0X_Read_Len(uint8 reg,uint8 len,uint8 *buf)
{
    I2C1_Start();
    I2C1_Send_Byte(0x52);//發(fā)送器件地址+寫命令        
    if(I2C1_WaitAck())         //等待應(yīng)答
    {
       I2C1_Stop();                 
       return true;               
    }
    I2C1_Send_Byte(reg);        //寫寄存器地址
    I2C1_WaitAck();            //等待應(yīng)答
    I2C1_Start();
    I2C1_Send_Byte(0x53);//發(fā)送器件地址+讀命令        
    I2C1_WaitAck();            //等待應(yīng)答
    while(len)
    {
       if(len==1)*buf=I2C1_Read_Byte(0);//讀數(shù)據(jù),發(fā)送nACK
       else *buf=I2C1_Read_Byte(1);     //讀數(shù)據(jù),發(fā)送ACK  
       len--;
       buf++;
    }   
    I2C1_Stop();        //產(chǎn)生一個(gè)停止條件

    return false;        
}

uint8 VL53L0X_Write_Byte(uint8 reg,uint8 data)                                 
{
    I2C1_Start();
    I2C1_Send_Byte(0x52);//發(fā)送器件地址+寫命令        
    if(I2C1_WaitAck()) //等待應(yīng)答
    {
       I2C1_Stop();                 
       return true;               
    }

    I2C1_Send_Byte(reg);          //寫寄存器地址
    I2C1_WaitAck();               //等待應(yīng)答
    I2C1_Send_Byte(data);         //寫入數(shù)據(jù)
    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);          //發(fā)送器件地址+寫命令        
    I2C1_WaitAck();                //等待應(yīng)答
    I2C1_Send_Byte(reg);          //寫寄存器地址
    I2C1_WaitAck();                //等待應(yīng)答
    I2C1_Stop();                  //產(chǎn)生一個(gè)停止條件

    I2C1_Start();
    I2C1_Send_Byte(0x53);         //發(fā)送器件地址+讀命令        
    I2C1_WaitAck();                //等待應(yīng)答
    VL53L0X_data=I2C1_Read_Byte(0);//讀取數(shù)據(jù),發(fā)送ACK
    I2C1_Stop();                  //產(chǎn)生一個(gè)停止條件

    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);//啟動(dòng)檢測(cè)
          while(cnt < 65535)//當(dāng)檢測(cè)完成,即讀取距離值
          {
             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);//讀取數(shù)據(jù)      
//              VL53L0X_Write_Byte(0x0b, 0x01);//啟動(dòng)檢測(cè)
              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, 下載次數(shù): 17, 下載積分: 黑幣 -5

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 免费在线看黄视频 | 久久久一区二区三区 | 久久机热 | 国产精品免费一区二区 | 国产精品一区二区三区免费观看 | 青青99 | 狠狠爱视频| 涩涩操 | 美女张开腿露出尿口 | 丁香六月伊人 | 免费黄色片视频 | 亚洲成人一区 | 国产高清美女一级a毛片久久w | 日韩中文在线 | 天天做日日做 | 久久久国产一区二区 | 一级在线观看 | 黄色免费观看 | 99久久久国产精品 | 亚洲精品一区二区网址 | 欧美久久久久久久久中文字幕 | 国产一区精品 | 久久精品久久久久久 | 在线观看成人精品 | 日韩成人在线网站 | 亚洲精品在线免费 | 日韩在线观看 | 91精品国产91久久久久久吃药 | 日韩精品成人在线 | 精品91久久 | www日韩 | 日韩国产一区二区三区 | 亚洲国产aⅴ成人精品无吗 欧美激情欧美激情在线五月 | 午夜精品一区 | 精久久久 | 中国av在线免费观看 | 亚洲国产精品一区二区三区 | 亚洲精品美女视频 | 欧美一区二区三区在线观看 | 精品视频在线免费观看 | 一区日韩|