计步器通讯程序
0赞
发表于 6/26/2012 9:56:56 AM
阅读(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; }
