#include "znz.h"
#include "delay.h"
#include "oled.h"
#include "math.h"
u8 BUF[8];
double angle1,angle2;
int X,Y,Z;
void Init_znz(void)
{
IIC_Init();
Write_znz(0x00, 0x31); //连续测量模式
}
void Write_znz(u8 add, u8 da)
{
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack(); //应答
IIC_Send_Byte(add); //内部寄存器地址,请参考中文pdf
IIC_Wait_Ack(); //应答
IIC_Send_Byte(da); //内部寄存器数据,请参考中文pdf
IIC_Wait_Ack(); //应答
IIC_Stop(); //发送停止信号
}
u8 Read_znz(u8 REG_Address)
{
u8 REG_data;
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack(); //应答
IIC_Send_Byte(REG_Address); //发送存储单元地址,从0开始
IIC_Wait_Ack(); //应答
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress+1); //发送设备地址+读信号
IIC_Wait_Ack(); //应答
REG_data=IIC_Read_Byte(0); //读出寄存器数据
IIC_Stop(); //停止信号
return REG_data;
}
//******************************************************
//
//连续读出指南针内部角度数据,地址范围
//
//******************************************************
void Multiple_read_znz(u8*BUF)
{ u8 i;
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack(); //应答
IIC_Send_Byte(0x00); //发送存储单元地址,从0x3开始
IIC_Wait_Ack(); //应答
IIC_Send_Byte(0x31);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(55);
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress); //发送设备地址+写信号
IIC_Wait_Ack(); //应答
IIC_Send_Byte(0x00); //发送存储单元地址,从
IIC_Wait_Ack(); //应答
IIC_Send_Byte(0x35);
IIC_Wait_Ack();
IIC_Stop();
delay_ms(30);
IIC_Start(); //起始信号
IIC_Send_Byte(SlaveAddress);
IIC_Wait_Ack();
IIC_Send_Byte(0x00);
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(SlaveAddress+1); //发送设备地址+读信号
IIC_Wait_Ack(); //应答
for (i=0; i<8; i++) //连续读取个地址数据,存储中BUF
{
if (i == 7)
{
BUF[i] = IIC_Read_Byte(0); //最后一个数据需要回NOACK
}
else
{
BUF[i] = IIC_Read_Byte(1); //返回ACK
}
}
IIC_Stop(); //停止信号
delay_ms(50);
}
void get_angle()
{
Multiple_read_znz(BUF);
X=BUF[1] << 8 |BUF[2] ; //Combine MSB and LSB of X Data output register
Z=BUF[3] << 8 | BUF[4]; //Combine MSB and LSB of Z Data output register
Y=BUF[7];
/* if(X>32768)
X = -(0xFFFF - X + 1);
if(Z>32768)
Z = -(0xFFFF - Z + 1);
if(Y>32768)
Y = -(0xFFFF - Y + 1); */
// angle1= (atan2((double)Y,(double)X) * (180 / 3.14159265) + 180); // angle in degrees
// angle=angle*10;
// conversion(angle); //????
delay_ms(10);
}
void display_angle()
{
OLED_ShowNum(80,52,X,3,12);
// OLED_ShowNum(30,20,angle2,4,12);
OLED_Refresh_Gram();
}
|