void clear_motion(void) { ON_CS(); SPI_SendReceive(Motion_Clear+0x80); SPI_SendReceive(0xff); //清除X Y数据 OFF_CS(); }
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_SendReceive(adress+0x00); //读 delay_us(75); temp=SPI_SendReceive(0xff); //提供时钟信号_读 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_SendReceive(Extended_Config+0x00); delay_us(75); temp=SPI_SendReceive(0xff); temp&=0x80; 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 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; }
unsigned char read(unsigned char reg) { unsigned int scrold = SCR11; unsigned char buff[2]; buff[0] = reg<<3 | 0x80; buff[1] = 0; // wait for the SPI to free up. //while(SPI_IsBusy(4)); // spiTransferComplete=0; SCR11 = 0xf007; ST1 |= _0002_SAU_CH1_STOP_TRG_ON; /* disable CSI21 */ SOE1 &= ~_0002_SAU_CH1_OUTPUT_ENABLE; /* disable CSI21 output */ SO1 &= ~_0200_SAU_CH1_CLOCK_OUTPUT_1; /* CSI21 clock initial level */ SOE1 |= _0002_SAU_CH1_OUTPUT_ENABLE; /* enable CSI21 output */ SS1 |= _0002_SAU_CH1_START_TRG_ON; /* enable CSI21 */ SPI_SendReceive(3,buff,2,buff); SCR11 = scrold; ST1 |= _0002_SAU_CH1_STOP_TRG_ON; /* disable CSI21 */ SOE1 &= ~_0002_SAU_CH1_OUTPUT_ENABLE; /* disable CSI21 output */ SO1 |= _0200_SAU_CH1_CLOCK_OUTPUT_1; /* CSI21 clock initial level */ SOE1 |= _0002_SAU_CH1_OUTPUT_ENABLE; /* enable CSI21 output */ SS1 |= _0002_SAU_CH1_START_TRG_ON; /* enable CSI21 */ //SPI_Transfer(4, 2, buff, buff, SPI_TransferComplete); //while(spiTransferComplete==0); // MSTimerDelay(250); return buff[1]; }
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 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(); }
uint8_t WIFI_ReceiveByte(char* buf) { uint8_t WIFI_Idle_Char; //G_WIFI_BufferIndex = 0; if((P7 & (1<<7))) { WIFI_Idle_Char = SPI_CHAR_IDLE; SPI_CS_Start(SPI_WIFI); SPI_SendReceive(SPI_WIFI, (uint8_t *)&WIFI_Idle_Char, 1, (uint8_t *)buf); SPI_CS_End(SPI_WIFI); return true; } else return false; }
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(); }
INT32U SPI_Receive ( SPI_Type *SPIx, INT8U *buff, INT32U len ) { while(len-- != 0) *buff++ = SPI_SendReceive ( SPIx, 0xFF); return (len); }
INT32U SPI_Send ( SPI_Type *SPIx, INT8U *buff, INT32U len ) { while(len-- != 0) SPI_SendReceive ( SPIx, *buff++); return (len); }