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 }
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 }
void clear_motion(void) { ON_CS(); SPI_Simu_RW(Motion_Clear+0x80); SPI_Simu_RW(0xff); //清除X Y数据 OFF_CS(); }
void clear_motion(void) { ON_CS(); SPI_SendReceive(Motion_Clear+0x80); SPI_SendReceive(0xff); //清除X Y数据 OFF_CS(); }
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_(); }
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); }
void writr_register(u8 adress,u8 vlue) { ON_CS(); SPI_SendReceive(adress+0x80); SPI_SendReceive(vlue); OFF_CS(); delay_us(51); }
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; }
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; }
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(); }
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; }
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; }
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; }
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; }
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; }
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); }
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(); }
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; }
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); }
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(); }
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(); }