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 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(); }
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_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 read_pixel(void) { u8 i,j ,regValue, pixelValue,test=1; writr_register(Frame_Capture,0x83); delay_us(1010);//等待3帧 (1/3000)*1000000*3+10 =1010us //显示数据 30*30=900 for(i=0;i<30;i++)//列 { for(j=0;j<30;j++) //行 { regValue=read_register(Frame_Capture); //读像素 if( test && ((regValue&0x40)==0)) //找不到第一个像素 { // Sys_Printf(Printf_USART,"Read pixel fail"); } test=0; pixelValue =(regValue<<2); while(!(USART1->SR&(1<<6))); USART1->DR=pixelValue; delay_us(50); } } ADNS3080_reset();//重启运行 }