void Read_Data_burst(void) //读取平面位移 { static int SumX; static int SumY; int sum_x,sum_y; unsigned char move=0; int x=0; //表示相对上一次定位信息输出时刻的位移增量 int y=0; //burst读。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 //Spi_Change_To_ADNS3080_(); ON_CS(); SPI_Simu_RW(Motion_Burst); //爆发方式读 delay_us(75); move=SPI_Simu_RW(0xFF); x=SPI_Simu_RW(0xFF); y=SPI_Simu_RW(0xFF); if(x&0x80) { //x的二补码转换 x -= 1; //*******************************************************// x = ~x; // x=(-1)*x; // 这里得注意,读取的detal_x,detal_y是8位有符号的,而定义的x,y是16位整型有符号 x-=256; //所以,转换得注意 } // if(y&0x80) //********************************************************// { //y的二补码转换 y -= 1; y = ~y; y=(-1)*y; y-=256; } SumX=SumX+x; //累加X读入的移动数据 SumY=SumY+y; //累加Y读入的移动数据 OFF_CS(); delay_us(4); //必须延时4um来退出motion mode模式 OFF_CS(); sum_x=(25.4*(float)SumX *H_OBJ)/(H_PIX*1600);//距离=d_x*(25.4/1600)*n 其中成像倍率n=像高:物高=8毫米:物长 sum_y=(25.4*(float)SumY *H_OBJ)/(H_PIX*1600); if((move&0x10)!=1) //若没有溢出 { if(move&0x80) //若有数据可以读出来 { Data_Filter(sum_x,sum_y);//滑动滤波 printf("%d,%d\n",sum_filter_x,sum_filter_y); //x,y } } else { x=0; y=0; } x=0; y=0; //Spi_Change_To_nRF24L01_(); }
/********************************************************************* ** @fn : ** ** @brief : ** ** @param : ** ** @return : *********************************************************************/ static u16_t Task_Heart(u8_t ucTaskID,u16_t usEvent) { u8_t ucStartAddr = 0; u8_t aucTempBuff[TEMP_BUFF_SIZE]; u8_t ucLen; u8_t flag = 0; switch(usEvent) { case EVENT_LOCALDATA: Read_Buff(BUFF_LOCAL,aucTempBuff,&ucLen); flag = Data_Filter(aucTempBuff,ucLen); break; case EVENT_NWKDATA: SET_TASK_EVENT(g_ucTaskGPRSID,EVENT_REV_DATA) break; default: break; } switch(flag) { case DATA_GPS_REQUEST: SET_TASK_EVENT(g_ucTaskGPSID,EVENT_GPS_ACTIVE); break; case DATA_GPRS_CFG: SET_TASK_EVENT(g_ucTaskGPRSID,EVENT_GPRS_CFG); break; case DATA_Frame_DESCRIBLE: break; case DATA_NET_FRAME: break; default: break; } if(GPRS_NWK_TCP == g_gprsCB.ucNWKStatus) { SET_TASK_EVENT(g_ucTaskGPRSID,EVENT_PANG); } }