标题:
zigbee cc2530裸机模拟IIC接口程序 实现VL53L0X激光测距
[打印本页]
作者:
大只伟
时间:
2019-4-13 14:58
标题:
zigbee cc2530裸机模拟IIC接口程序 实现VL53L0X激光测距
采用IAR环境,实现普通模块测距,串口输出数据。
代码如下:
#include "VL53L0.h"
#include "myiic.h"
uint16_t bswap(u8 b[])
{
uint16_t val = ((b[0]<< 8) & b[1]);
return val;
}
uint16_t VL53L0X_decode_vcsel_period(short vcsel_period_reg)
{
uint16_t vcsel_period_pclks = (vcsel_period_reg + 1) <<1;
return vcsel_period_pclks;
}
uint16_t makeuint16(int lsb, int msb)
{
return ((msb & 0xFF) << 8) | (lsb & 0xFF);
}
//IIC连续写
//addr:器件地址
//reg:寄存器地址
//len:写入长度
//buf:数据区
//返回值:0,正常
// 其他,错误代码
u8 VL53L0X_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
u8 i;
IIC_Start();
IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
for(i=0;i<len;i++)
{
IIC_Send_Byte(buf[i]); //发送数据
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
return 1;
}
}
IIC_Stop();
return 0;
}
//IIC连续读
//addr:器件地址
//reg:要读取的寄存器地址
//len:要读取的长度
//buf:读取到的数据存储区
//返回值:0,正常
// 其他,错误代码
u8 VL53L0X_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
{
IIC_Start();
IIC_Send_Byte((addr<<1)|0);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Start();
IIC_Send_Byte((addr<<1)|1);//发送器件地址+读命令
IIC_Wait_Ack(); //等待应答
while(len)
{
if(len==1)*buf=IIC_Read_Byte(0);//读数据,发送nACK
else *buf=IIC_Read_Byte(1); //读数据,发送ACK
len--;
buf++;
}
IIC_Stop(); //产生一个停止条件
return 0;
}
//IIC写一个字节
//reg:寄存器地址
//data:数据
//返回值:0,正常
// 其他,错误代码
u8 VL53L0X_Write_Byte(u8 reg,u8 data)
{
IIC_Start();
IIC_Send_Byte((VL53L0X_Add<<1)|0);//发送器件地址+写命令
if(IIC_Wait_Ack()) //等待应答
{
IIC_Stop();
return 1;
}
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(data);//发送数据
if(IIC_Wait_Ack()) //等待ACK
{
IIC_Stop();
return 1;
}
IIC_Stop();
return 0;
}
//IIC读一个字节
//reg:寄存器地址
//返回值:读到的数据
u8 VL53L0X_Read_Byte(u8 reg)
{
u8 res;
IIC_Start();
//IIC_Send_Byte((VL53L0X_Add<<1)|0);//发送器件地址+写命令
IIC_Send_Byte(0x52);//发送器件地址+写命令
IIC_Wait_Ack(); //等待应答
IIC_Send_Byte(reg); //写寄存器地址
IIC_Wait_Ack(); //等待应答
IIC_Start();
IIC_Send_Byte(0x53 );//发送器件地址+读命令
IIC_Wait_Ack(); //等待应答
res=IIC_Read_Byte(0);//读取数据,发送nACK
IIC_Stop(); //产生一个停止条件
return res;
}
复制代码
附带芯片原理图、接线及ARDUINO原码。
0.png
(45.69 KB, 下载次数: 84)
下载附件
2019-4-13 16:13 上传
全部资料51hei下载地址:
裸机程序(new).zip
(1.04 MB, 下载次数: 126)
2019-4-13 14:58 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
大只伟
时间:
2019-4-13 15:01
由于CC2530是无IIC硬件支持的,所以写了一个,上面应该是采用普通测距模式,由于该芯片是不提供测距函数的,因此是根据ARDUINO的原码移植的。
作者:
大只伟
时间:
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);
}
}
作者:
YXDZGD5
时间:
2019-10-3 14:47
非常不错的资料,值得参考
作者:
YXDZGD5
时间:
2019-10-3 14:48
非常不错的资料,值得参考,谢谢啦
作者:
史蒂芬吴倩
时间:
2020-4-26 23:59
好资料
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1