|
#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);
}
}
}
|
评分
-
查看全部评分
|