找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5554|回复: 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 单片机教程网

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