Exemple #1
0
void Write_srom(void)
{
 int i;
 ON_CS(); 
 writr_register(0x20,0x44);
 delay_us(51);
 writr_register(0x23,0x07);
  delay_us(51);
 writr_register(0x24,0x88);
 delay_us(51);
  OFF_CS();  //突发_写模式
  delay_us(340);//等待大于1帧时间
  ON_CS(); 
  writr_register(SROM_Enable,0x18);
  OFF_CS();  //突发_写模式
 delay_us(41);//  >40us
  ON_CS();
  for(i=0;i<=1985;i++)
  {
     writr_register(0x60,SROM[i]);
     delay_us(11);// >10us
  }
 OFF_CS();
 delay_us(105);	//>104us
}
Exemple #2
0
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_();
	
}
Exemple #3
0
void Write_srom(void)                     //烧固件
{
 int i;
 ON_CS(); 
 writr_register(0x20,0x44);               //****************************************//
 delay_us(51);                            //
 writr_register(0x23,0x07);               //				这三个寄存器,手册上没有,但说了具体步骤
  delay_us(51);                           //
 writr_register(0x24,0x88);               //******************************************//
 delay_us(51);
  OFF_CS();  //突发_写模式
  delay_us(340);//等待大于1帧时间  ??每秒3000帧,则340us>1/3000=334us
  ON_CS(); 
  writr_register(SROM_Enable,0x18);
  OFF_CS();  //突发_写模式
 delay_us(41);//  >40us
  ON_CS();
  for(i=0;i<=1985;i++)
  {
     writr_register(0x60,SROM[i]);
     delay_us(11);// >10us  ,t_load时间
  }
 OFF_CS();
 delay_us(105);	//>104us
}
Exemple #4
0
void Read_Data_burst(void)
{
	extern u16 Alt_ultrasonic;
  static int SumX;
  static int SumY;

  unsigned char move=0;
  int  x=0;
  int  y=0;
//burst读。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
ON_CS();
SPI_SendReceive(0x50);   
delay_us(75);
move=SPI_SendReceive(0xFF);             
x=SPI_SendReceive(0xFF);
y=SPI_SendReceive(0xFF);
	if(x&0x80)
	  {
	  //x的二补码转换	
	  x -= 1;
	  x = ~x;	
	  x=(-1)*x;
	  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);
	OFF_CS();
sum_x=(25.4*(float)SumX *Alt_ultrasonic)/(12*1600);//距离=d_x*(25.4/1600)*n   其中n=像高:物高=8毫米:物长
sum_y=(25.4*(float)SumY *Alt_ultrasonic)/(12*1600);
  if(move&0x10!=1)
	if(move&0x80)
	{
	  Sys_Printf(Printf_USART,"%d,%d\n",sum_x,sum_y);
	}
		else
		{
			x=0;
			y=0;
		}
x=0;
y=0;
}
Exemple #5
0
void clear_motion(void)
{
ON_CS();
 SPI_SendReceive(Motion_Clear+0x80);
 SPI_SendReceive(0xff);	//清除X Y数据
OFF_CS();
}
Exemple #6
0
void clear_motion(void)
{
	ON_CS();
	 SPI_Simu_RW(Motion_Clear+0x80);
	 SPI_Simu_RW(0xff);	//清除X Y数据
	OFF_CS();
}
Exemple #7
0
void writr_register(u8 adress,u8 vlue)
{
	ON_CS();
	 SPI_Simu_RW(adress+0x80);   //加上0x80表示写,最高位为1:写,最高位为0:读
	 SPI_Simu_RW(vlue);
	OFF_CS();
	delay_us(51);
}
Exemple #8
0
void writr_register(u8 adress,u8 vlue)
{
ON_CS();
 SPI_SendReceive(adress+0x80);
 SPI_SendReceive(vlue);
OFF_CS();
delay_us(51);
}
Exemple #9
0
u8 read_register(u8 adress)
{
u8 temp;
ON_CS();
temp=SPI_SendReceive(adress+0x00);	//读
delay_us(75);
temp=SPI_SendReceive(0xff);	//提供时钟信号_读
OFF_CS();
return temp;
}
Exemple #10
0
void ADNS_Configuration(void)
{
  ON_CS(); 
  writr_register(Configuration_bits,0x10);   //设置分辨率 1600  //若Bit 4为0,则为400点每英寸
  delay_ms(3);
  writr_register(Extended_Config,0x01);
  delay_ms(3);
  if(read_busy()!=1) {//设为3000帧每秒
    OFF_CS();  //突发_写模式
    delay_ms(2);
    ON_CS();  
    SPI_SendReceive(Frame_Period_Max_Bound_Lower+0x80); //设置帧率 //先写低位再写高位
    SPI_SendReceive(0x40); //   C0 5000帧率    
    SPI_SendReceive(Frame_Period_Max_Bound_Upper+0x80);
    SPI_SendReceive(0x1f);   // 12
  } 
  clear_motion();
  OFF_CS();
}
Exemple #11
0
u8 read_register(u8 adress)
{
	u8 temp;
	ON_CS();
	temp=SPI_Simu_RW(adress+0x00);	//读  ,后面必须有延迟才能读数据
	delay_us(75);
	temp=SPI_Simu_RW(0xff);	//提供时钟信号_读
	OFF_CS();
	return temp;
}
Exemple #12
0
u8  read_Maximum_pixel(void)	  //读最大像素
{
  u8 temp;
  ON_CS();
  temp=SPI_Simu_RW(Maximum_Pixel);
  delay_us(76);
  temp=SPI_Simu_RW(0xff);       //temp最大为63              
  OFF_CS();
  return temp;
}
Exemple #13
0
float  read_average_pixel(void)	  //读平均像素
{
  float temp;
  ON_CS();
  temp=SPI_SendReceive(Pixel_Sum);
  delay_us(76);
  temp=SPI_SendReceive(0xff);
  temp=temp*256/900;
  OFF_CS();
  return temp;
}
Exemple #14
0
u8 read_busy(void)//写帧率的判忙  ==1忙
{
	u8 temp;
	ON_CS();
	temp=SPI_Simu_RW(Extended_Config+0x00);   //8位中的最高位
	delay_us(75);
	temp=SPI_Simu_RW(0xff);
	temp&=0x80;
	OFF_CS();
	return temp;
}
Exemple #15
0
u8 read_busy(void)//写帧率的判忙  ==1忙
{
u8 temp;
ON_CS();
temp=SPI_SendReceive(Extended_Config+0x00);
delay_us(75);
temp=SPI_SendReceive(0xff);
temp&=0x80;
OFF_CS();
return temp;
}
Exemple #16
0
float  read_average_pixel(void)	  //读平均像素
{
  float temp;
  ON_CS();
  temp=SPI_Simu_RW(Pixel_Sum);
  delay_us(76);
  temp=SPI_Simu_RW(0xff);         //此处读出的值最大为221
  temp=temp*256/900;                  //temp最大为63
  OFF_CS();
  return temp;
}
Exemple #17
0
u16 read_zhenlv(void) //读帧率
{
  u16 Frame_Period_Max_Bound_Lower1,Frame_Period_Max_Bound_Upper1;
  ON_CS();
  Frame_Period_Max_Bound_Upper1=SPI_SendReceive(Frame_Period_Uppe+0x00);
  Frame_Period_Max_Bound_Upper1=SPI_SendReceive(0xff);//接收高位的帧率
  delay_ms(5);
  Frame_Period_Max_Bound_Lower1=SPI_SendReceive(Frame_Period_Lower+0x00);
  Frame_Period_Max_Bound_Lower1=SPI_SendReceive(0xff); //接收低位的帧率
  OFF_CS();
  return ((Frame_Period_Max_Bound_Upper1 << 8) | Frame_Period_Max_Bound_Lower1);
}
Exemple #18
0
void ADNS_Configuration(void)
{
	 ON_CS(); 
	 writr_register(Configuration_bits,0x10);		//设置分辨率 1600	 //若Bit 4为0,则为400点每英寸
	 delay_ms(3);
	 writr_register(Extended_Config,0x01);      //设置为固定帧率,其值在Frame_Period_Max_Bound寄存器中
	 delay_ms(3);
	 if(read_busy()!=1)
	 {  							      //设为3000帧每秒,3000=24MHz/0x1f40,0x1f40=8000
			OFF_CS();  //突发_写模式
			delay_ms(2);
			ON_CS();	
			SPI_Simu_RW(Frame_Period_Max_Bound_Lower+0x80);	//设置帧率 //先写低位再写高位,若是读的话先读高位再读低位
			SPI_Simu_RW(0x40); //   C0, 5000帧率	   
		 // delay_us(75);
			SPI_Simu_RW(Frame_Period_Max_Bound_Upper+0x80);
			SPI_Simu_RW(0x1f);	 // 12
	 } 
	 clear_motion();
	 OFF_CS();
}
Exemple #19
0
void read_pixel_burst(void)//爆发读图像
{
int i,j;
writr_register(Frame_Capture,0x83); 
delay_us(1010);//等待3帧 (1/3000)*1000000*3+10 =1010us
//开始burst读
ON_CS();
SPI_SendReceive(0x40);   
delay_us(75);
for(i=0;i<30;i++)
{
	for(j=0;j<30;j++)
	{
	while(!(USART1->SR&(1<<6)));
	USART1->DR=(SPI_SendReceive(0xFF)<<2); 
    //delay_us(10);
	}
} 
OFF_CS();
delay_us(4);
OFF_CS();            
}
Exemple #20
0
u16 read_zhenlv(void) //读帧率
{  
  u16 Frame_Period_Max_Bound_Lower1,Frame_Period_Max_Bound_Upper1;
  ON_CS();
  Frame_Period_Max_Bound_Upper1=SPI_Simu_RW(Frame_Period_Uppe+0x00);
	delay_us(51);        //这个延时很重要,否则读出的数据不正确
  Frame_Period_Max_Bound_Upper1=SPI_Simu_RW(0xff);//接收高位的帧率
  //delay_ms(5);      //这个时间可要可不要
  Frame_Period_Max_Bound_Lower1=SPI_Simu_RW(Frame_Period_Lower+0x00);
	delay_us(51);      //这个延时很重要,否则读出的数据不正确
  Frame_Period_Max_Bound_Lower1=SPI_Simu_RW(0xff); //接收低位的帧率
  OFF_CS();
  return ((Frame_Period_Max_Bound_Upper1 << 8) | Frame_Period_Max_Bound_Lower1);
}
Exemple #21
0
void ADNS3080_Read(void)
{
  unsigned char move=0;
  int dx,dy;
  ON_CS();
  SPI_SendReceive(0x50);   
  delay_us(75);
  move=SPI_SendReceive(0xFF);             
  dx=SPI_SendReceive(0xFF);
  dy=SPI_SendReceive(0xFF);
  surface_quality=SPI_SendReceive(0xFF);
  if(move&0x10==1 || !move&0x80) {
    dx=0;
    dy=0;
  }else{
    if(dx&0x80) {
      //x的二补码转换 
      dx -= 1;
      dx = ~dx; 
      dx=(-1)*dx;
      dx-=256;
    }
    if(dy&0x80) {
      //y的二补码转换 
      dy -= 1;
      dy = ~dy; 
      dy=(-1)*dy;
      dy-=256;
    } 
  }
  rdx=(float)dx*avg_height*CONV_FACTOR;
  rdy=(float)dy*avg_height*CONV_FACTOR;
  X=X+rdx;             //累加X读入的移动数据
  Y=Y+rdy;       //累加Y读入的移动数据
  OFF_CS();
}