freedomhit

计步器通讯程序

0
阅读(3107)

 

#include
#include"IIC.h"
#include "OCM12864.h"
#define slave 0xA6
#define  time  10000
#define count 5			   //读取字节数=count+1;
int i ;
unsigned char Aspeed[6];		   //从ADXL345寄存器中读出来的6个值组成的数组
extern unsigned int ValueX,ValueY,ValueZ;	  //	 对取出的数重新组合,为绝对值	
extern int XAPP,YAPP,ZAPP;	//处理后的加速度值
extern int Xavarage,Yavarage,Zavarage;
void delay(int lengh)
{
	while(lengh>0)
	lengh--;
}
void write(unsigned char slvadd,unsigned char subadd,char data)
{
	I2C1MTX=subadd;						  //		装载子地址
	I2C1ADR=slvadd;							//		装载从机地址
	while((I2C1FSTA&0X30)!=0X00){}			//		等待FIFO发送成功
							//
	I2C1MTX=data;							//		向子地址中装载数据
	while((I2C1FSTA&0X30)!=0X00){}			//		等待FIFO发送完成
	delay(time);							 //
	I2C1CCNT=0X80;							  //	 停止信号
}
void read(unsigned char slvadd,unsigned char subadd)
{
	I2C1MTX=subadd;							 //		   装载子地址
	I2C1ADR=slvadd;							  //	   装载从机地址
	while((I2C1FSTA & 0X30)!= 0x00)	{}			  //	   等待FIFO发送成功
	delay(4000);							  //	   长延时
	I2C1CNT=count;							  //	   在从机中一次读出的字节数   (默认值为0,表示一个字节)
	I2C1ADR=slvadd+1;						  //	   装载从机地址(LSB=1,主机读)
//	while((I2C1FSTA&0XC0)!=0X80){}			  //	   等待数据接收完成
//	I2C1CCNT=0X80;							  //		停止信号
}
void Init_ADXL345()
{
   write(slave,0x31,0x0B);   //测量范围,正负16g,13位模式
   write(slave,0x2C,0x08);   //选择低功耗模式,速率设定为12.5 参考pdf13页	  //
 //  write(slave,0x25,0x20);														//
  // write(slave,0x25,0x20);														  //
   
   write(slave,0x2D,0x38);   //选择电源模式   参考pdf24页					//
   write(slave,0x2E,0x80);   //使能 DATA_READY 中断
   write(slave,0x1E,0x00);   //X 偏移量 根据测试传感器的状态写入pdf29页
   write(slave,0x1F,0x00);   //Y 偏移量 根据测试传感器的状态写入pdf29页
   write(slave,0x20,0x05);   //Z 偏移量 根据测试传感器的状态写入pdf29页

 //  write(slave,0x27,0x70); //开活动检测
 //  write(slave,0x24,0x16); //设置活动检测为500mg
} 
void Init_IIC(void)
{

	GP1CON=0X2200; //配置P1.2,P1.3 为SCL和SDA;
	I2C1DIV=0X3232;//配置串行时钟的速率为100kHz
					//400k 0x3232
	I2C1CFG=0X82;//使能主机并且使能主机时钟	
	Init_ADXL345();
}
/*void Value_ADXL345()

{	 
   // delay(10000);
    read(slave,0x32); 
	for(i=0;i<6;i++)
	{
		while((I2C1FSTA&0XC0)!=0X80){}
		Aspeed[i]=I2C1MRX;	
	//	delay(400);导致出错
	}  // GP4DAT=0X04000000;

	 ValueX=((Aspeed[1]<<8))|Aspeed[0] ;
	 if(ValueX&0x1000)
	 {
		 ValueX=ValueX-0xffff-1;
	
	 }
	

     ValueY=((Aspeed[3]<<8))|Aspeed[2] ;
	if(ValueY&0x1000)
	 {
		 ValueY=ValueY-0xffff-1;
		
	 }
	
	 ValueZ=((Aspeed[5]<<8))|Aspeed[4] ;
	 if(ValueZ&0x1000)
	 {
		 ValueZ=ValueZ-0xffff-1;
	
	 }	
	
//	 XAPP=ValueX*3.9; 	
//YAPP=ValueY*3.9; 
//	 ZAPP=ValueZ*3.9; 
}*/
void  AVERAGE()
{
	int X[50],Y[50],Z[50];
	int Xmax,Xmin,Ymax,Ymin,Zmax,Zmin;
	for(i=0;i<50;i++)
	{	int m;
		read(slave,0x32); 
		for(m=0;m<6;m++)
		{
		while((I2C1FSTA&0XC0)!=0X80){}
		Aspeed[i]=I2C1MRX;	
	//	delay(400);导致出错
		} 
		
		X[i]= ((Aspeed[1]<<8))|Aspeed[0] ;	
	    Y[i]=((Aspeed[3]<<8))|Aspeed[2] ;
    	Z[i]=((Aspeed[5]<<8))|Aspeed[4] ;

	}
	for(i=0;i<50;i++)
	{	
		int m;
		for(m=i+1;m<50;m++)
		{
			if(X[i]X[m])
			{Xmin=X[m];}
			if(Y[i]>Y[m])
			{Ymin=Y[m];}
			if(Z[i]>Z[m])
			{Zmin=Z[m];}
		}
		
	}
		Xavarage=(Xmax+Xmin)/2;
		Yavarage=(Ymax+Ymin)/2;
		Zavarage=(Zmax+Zmin)/2;

}