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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6103|回復: 5
打印 上一主題 下一主題
收起左側

zigbee cc2530裸機模擬IIC接口程序 實現VL53L0X激光測距

[復制鏈接]
跳轉到指定樓層
樓主
采用IAR環境,實現普通模塊測距,串口輸出數據。


代碼如下:
  1. #include "VL53L0.h"
  2. #include "myiic.h"


  3. uint16_t bswap(u8 b[])
  4. {
  5.         uint16_t val = ((b[0]<< 8) & b[1]);
  6.         return val;
  7. }

  8. uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg)
  9. {
  10.         uint16_t vcsel_period_pclks = (vcsel_period_reg + 1) <<1;
  11.         return vcsel_period_pclks;
  12. }

  13. uint16_t makeuint16(int lsb, int msb)
  14. {
  15.     return ((msb & 0xFF) << 8) | (lsb & 0xFF);
  16. }

  17. //IIC連續寫
  18. //addr:器件地址
  19. //reg:寄存器地址
  20. //len:寫入長度
  21. //buf:數據區
  22. //返回值:0,正常
  23. //    其他,錯誤代碼
  24. u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  25. {
  26.         u8 i;
  27.     IIC_Start();
  28.         IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令        
  29.         if(IIC_Wait_Ack())        //等待應答
  30.         {
  31.                 IIC_Stop();                 
  32.                 return 1;               
  33.         }
  34.     IIC_Send_Byte(reg);        //寫寄存器地址
  35.     IIC_Wait_Ack();                //等待應答
  36.         for(i=0;i<len;i++)
  37.         {
  38.                 IIC_Send_Byte(buf[i]);        //發送數據
  39.                 if(IIC_Wait_Ack())                //等待ACK
  40.                 {
  41.                         IIC_Stop();         
  42.                         return 1;                 
  43.                 }               
  44.         }   
  45.     IIC_Stop();         
  46.         return 0;        
  47. }
  48. //IIC連續讀
  49. //addr:器件地址
  50. //reg:要讀取的寄存器地址
  51. //len:要讀取的長度
  52. //buf:讀取到的數據存儲區
  53. //返回值:0,正常
  54. //    其他,錯誤代碼
  55. u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
  56. {
  57.          IIC_Start();
  58.         IIC_Send_Byte((addr<<1)|0);//發送器件地址+寫命令        
  59.         if(IIC_Wait_Ack())        //等待應答
  60.         {
  61.                 IIC_Stop();                 
  62.                 return 1;               
  63.         }
  64.     IIC_Send_Byte(reg);        //寫寄存器地址
  65.     IIC_Wait_Ack();                //等待應答
  66.     IIC_Start();
  67.         IIC_Send_Byte((addr<<1)|1);//發送器件地址+讀命令        
  68.     IIC_Wait_Ack();                //等待應答
  69.         while(len)
  70.         {
  71.                 if(len==1)*buf=IIC_Read_Byte(0);//讀數據,發送nACK
  72.                 else *buf=IIC_Read_Byte(1);                //讀數據,發送ACK  
  73.                 len--;
  74.                 buf++;
  75.         }   
  76.     IIC_Stop();        //產生一個停止條件
  77.         return 0;        
  78. }
  79. //IIC寫一個字節
  80. //reg:寄存器地址
  81. //data:數據
  82. //返回值:0,正常
  83. //    其他,錯誤代碼
  84. u8 VL53L0X_Write_Byte(u8 reg,u8 data)                                 
  85. {
  86.   IIC_Start();
  87.         IIC_Send_Byte((VL53L0X_Add<<1)|0);//發送器件地址+寫命令        
  88.         if(IIC_Wait_Ack())        //等待應答
  89.         {
  90.                 IIC_Stop();                 
  91.                 return 1;               
  92.         }
  93.     IIC_Send_Byte(reg);        //寫寄存器地址
  94.     IIC_Wait_Ack();                //等待應答
  95.         IIC_Send_Byte(data);//發送數據
  96.         if(IIC_Wait_Ack())        //等待ACK
  97.         {
  98.                 IIC_Stop();         
  99.                 return 1;                 
  100.         }                 
  101.     IIC_Stop();         
  102.         return 0;
  103. }
  104. //IIC讀一個字節
  105. //reg:寄存器地址
  106. //返回值:讀到的數據
  107. u8 VL53L0X_Read_Byte(u8 reg)
  108. {
  109.         u8 res;
  110.     IIC_Start();
  111.         //IIC_Send_Byte((VL53L0X_Add<<1)|0);//發送器件地址+寫命令        
  112.         IIC_Send_Byte(0x52);//發送器件地址+寫命令        
  113.         IIC_Wait_Ack();                //等待應答
  114.     IIC_Send_Byte(reg);        //寫寄存器地址
  115.     IIC_Wait_Ack();                //等待應答
  116.     IIC_Start();
  117.         IIC_Send_Byte(0x53 );//發送器件地址+讀命令        
  118.     IIC_Wait_Ack();                //等待應答
  119.         res=IIC_Read_Byte(0);//讀取數據,發送nACK
  120.     IIC_Stop();                        //產生一個停止條件
  121.         return res;               
  122. }
復制代碼


附帶芯片原理圖、接線及ARDUINO原碼。


全部資料51hei下載地址:
裸機程序(new).zip (1.04 MB, 下載次數: 126)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:471057 發表于 2019-4-13 15:01 | 只看該作者
由于CC2530是無IIC硬件支持的,所以寫了一個,上面應該是采用普通測距模式,由于該芯片是不提供測距函數的,因此是根據ARDUINO的原碼移植的。
回復

使用道具 舉報

板凳
ID:471057 發表于 2019-4-13 15:03 | 只看該作者
這個才是 main.c

/**************************************/
/*           WeBee團隊                */
/*         Zigbee學習例程             */
/*例程名稱:                         */
/*建立時間:2012/04/18               */
/*描述:main
**************************************/
#include <ioCC2530.h>
#include "type.h"
#include "clock.h"
#include "uart.h"
#include "VL53L0.h"
#include "myiic.h"
#include "delay.h"

void main(void)
{   
  clockInit();
  uartInit();
  IIC_Init();
  u8 val = 0;
  u8 gbuf[16];
  uint32_t cnt = 0;
//  uint16_t count[3];
  
  while(1)
  {
    VL53L0X_Write_Byte(VL53L0X_REG_SYSRANGE_START, 0x01);//啟動檢測
    while(cnt < 100)//當檢測完成,即讀取距離值
    {
      delay_ms(10);
      val = VL53L0X_Read_Byte(VL53L0X_REG_RESULT_RANGE_STATUS);
      if( val & 0x01) break;
      cnt++;
    }
//    if( val & 0x01)
//      uartSendString("\r\n readey \r\n",12);
//    else
//      uartSendString("\r\n NOT readey \r\n",16);
    VL53L0X_Read_Len(VL53L0X_Add, 0x14 , 12, gbuf);//讀取數據
//    count[0] = makeuint16(gbuf[7], gbuf[6]);//ambient count
//    count[1] = makeuint16(gbuf[9], gbuf[8]);//signal count
//    count[2] = makeuint16(gbuf[11], gbuf[10]);//距離
//    DeviceRangeStatusInternal = ((gbuf[0] & 0x78) >> 3);//status
   
    //打印距離值
    uartPutInt16(makeuint16(gbuf[11], gbuf[10]));
    delay_ms(500);
  }
}
回復

使用道具 舉報

地板
ID:140706 發表于 2019-10-3 14:47 | 只看該作者
非常不錯的資料,值得參考
回復

使用道具 舉報

5#
ID:140706 發表于 2019-10-3 14:48 | 只看該作者
非常不錯的資料,值得參考,謝謝啦
回復

使用道具 舉報

6#
ID:735263 發表于 2020-4-26 23:59 | 只看該作者
好資料
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人av观看 | 99成人| 久草精品视频 | 亚洲精品久久久一区二区三区 | 欧美日韩精品久久久免费观看 | 亚洲精品乱码久久久久久按摩观 | 精品亚洲永久免费精品 | 欧美一区二区三区视频在线播放 | 国产亚洲精品精品国产亚洲综合 | 一级黄色片网址 | 久久久久久久一区 | 日韩中文字幕网 | 一区二区三 | 97国产精品视频人人做人人爱 | 夏同学福利网 | 中文字幕日韩欧美一区二区三区 | 午夜在线视频 | 国产熟熟 | 亚洲成人av在线播放 | 欧美成人第一页 | 亚洲另类自拍 | 中文字幕av亚洲精品一部二部 | 日韩一三区 | 欧美极品在线 | 欧美四虎| 亚洲综合色自拍一区 | 亚洲一av | 一区二区三区久久久 | 日本韩国欧美在线观看 | av在线一区二区三区 | 91成人午夜性a一级毛片 | 日韩一区二区三区在线看 | 国产午夜精品理论片a大结局 | 亚洲精品黄色 | 久久久片 | 日韩在线视频一区二区三区 | 九九热在线观看 | 日日射影院 | 欧美视频二区 | 五月网婷婷 | 亚洲精品久久久久久久久久久久久 |