生活随笔
收集整理的這篇文章主要介紹了
                                
paj7620移植笔记1
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
 
                                
                            
                            
                            從原子那買了一個手勢識別模塊,自己做了個東西。用的標準庫。
 
 由于模塊自帶上拉電阻,所以沒有再外接,直接CON2用了一個插座。
 PB6-SCL PB7-SDA 而INT沒有使用
 單片機:STM32F103RCT6
 首先是IIC底層程序,寫過很多IIC了,直接拿來使用:
 
void GS_i2c_init(void)	
{GPIO_InitTypeDef GPIO_InitStructure
;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
, ENABLE
);		GPIO_InitStructure
.GPIO_Pin 
= GPIO_Pin_6
|GPIO_Pin_7
;  		GPIO_InitStructure
.GPIO_Mode 
= GPIO_Mode_Out_PP 
;       	GPIO_InitStructure
.GPIO_Speed 
= GPIO_Speed_50MHz
;      		GPIO_Init(GPIOB
, &GPIO_InitStructure
);GPIO_SetBits(GPIOB
,GPIO_Pin_6
|GPIO_Pin_7
);					
}
 
void GS_SDA_IN()	
{GPIO_InitTypeDef GPIO_InitStructure
;	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
, ENABLE
);	GPIO_InitStructure
.GPIO_Pin 
= GPIO_Pin_7
;GPIO_InitStructure
.GPIO_Mode 
= GPIO_Mode_IPU
;GPIO_InitStructure
.GPIO_Speed 
= GPIO_Speed_50MHz
;GPIO_Init(GPIOB
,&GPIO_InitStructure
);
}
 
void GS_SDA_OUT()
{GPIO_InitTypeDef GPIO_InitStructure
;	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB
, ENABLE
);	GPIO_InitStructure
.GPIO_Pin 
= GPIO_Pin_7
;GPIO_InitStructure
.GPIO_Mode 
= GPIO_Mode_Out_PP
;GPIO_InitStructure
.GPIO_Speed 
= GPIO_Speed_50MHz
;GPIO_Init(GPIOB
,&GPIO_InitStructure
);
}
 
static void GS_IIC_Start(void)
{GS_SDA_OUT();GS_IIC_SDA 
= 1;	  	  GS_IIC_SCL 
= 1;delay_us(4);GS_IIC_SDA 
= 0;delay_us(4);GS_IIC_SCL 
= 0;
}
static void GS_IIC_Stop(void)
{GS_SDA_OUT();GS_IIC_SCL 
= 0;GS_IIC_SDA 
= 0;delay_us(4);GS_IIC_SCL 
= 1; GS_IIC_SDA 
= 1;delay_us(4);							   	
}
static u8 
GS_IIC_Wait_Ack(void)
{u8 ucErrTime 
= 0;GS_SDA_IN();  GS_IIC_SDA 
= 1;delay_us(3);	   GS_IIC_SCL 
= 1;delay_us(3);	 while(GS_READ_SDA
){ucErrTime
++;if(ucErrTime 
> 250){GS_IIC_Stop();return 1;}}GS_IIC_SCL 
= 0;return 0;  
}
static void GS_IIC_Ack(void)
{GS_IIC_SCL 
= 0;GS_SDA_OUT();GS_IIC_SDA 
= 0;delay_us(3);GS_IIC_SCL 
= 1;delay_us(3);GS_IIC_SCL 
= 0;
}
static void GS_IIC_NAck(void)
{GS_IIC_SCL 
= 0;GS_SDA_OUT();GS_IIC_SDA 
= 1;delay_us(2);GS_IIC_SCL 
= 1;delay_us(2);GS_IIC_SCL 
= 0;
}
static void GS_IIC_Send_Byte(u8 txd
)
{                        u8 t
;   GS_SDA_OUT(); 	    GS_IIC_SCL 
= 0;for(t
=0;t
<8;t
++){              if((txd 
& 0x80) >> 7)GS_IIC_SDA 
= 1;elseGS_IIC_SDA 
= 0;txd 
<<= 1; 	  delay_us(5);  GS_IIC_SCL 
= 1;delay_us(5); GS_IIC_SCL 
= 0;	delay_us(5);}	 
} 
static u8 
GS_IIC_Read_Byte(u8 ack
)
{u8 i
,receive 
= 0;GS_SDA_IN();for(i 
= 0;i 
< 8;i
++ ){GS_IIC_SCL 
= 0; delay_us(4);GS_IIC_SCL 
= 1;receive 
<<= 1;if(GS_READ_SDA
)receive
++;   delay_us(4); }					 if (!ack
)GS_IIC_NAck();elseGS_IIC_Ack(); return receive
;
}
模塊的讀寫以及喚醒
u8 
GS_Write_Byte(u8 REG_Address
,u8 REG_data
)
{GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID
);if(GS_IIC_Wait_Ack()){GS_IIC_Stop();return 1;}GS_IIC_Send_Byte(REG_Address
);GS_IIC_Wait_Ack();	GS_IIC_Send_Byte(REG_data
);GS_IIC_Wait_Ack();	GS_IIC_Stop();return 0;
}
u8 
GS_Read_Byte(u8 REG_Address
)
{u8 REG_data
;GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID
);if(GS_IIC_Wait_Ack()){GS_IIC_Stop();return 0;}		GS_IIC_Send_Byte(REG_Address
);GS_IIC_Wait_Ack();GS_IIC_Start(); GS_IIC_Send_Byte(PAJ7620_ID
|0x01);GS_IIC_Wait_Ack();REG_data 
= GS_IIC_Read_Byte(0);GS_IIC_Stop();return REG_data
;
}
u8 
GS_Read_nByte(u8 REG_Address
,u16 len
,u8 
*buf
)
{GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID
);if(GS_IIC_Wait_Ack()) {GS_IIC_Stop();return 1;}GS_IIC_Send_Byte(REG_Address
);GS_IIC_Wait_Ack();GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID
|0x01);GS_IIC_Wait_Ack();while(len
){if(len
==1){*buf 
= GS_IIC_Read_Byte(0);}else{*buf 
= GS_IIC_Read_Byte(1);}buf
++;len
--;}GS_IIC_Stop();return 0;}
void GS_WakeUp(void)
{GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID
);GS_IIC_Stop();
}.h文件定義:
typedef enum{BANK0 
= 0, BANK1
,     
}bank_e
;extern u8 change
;#define PAJ7620_ID           0x73<<1 
#define PAJ_REGITER_BANK_SEL 0XEF    
#define PAJ_BANK0            0X00    
#define PAJ_BANK1            0X01    
#define PAJ_SUSPEND_CMD            0X03 
#define PAJ_SET_INT_FLAG1          0X41 
#define PAJ_SET_INT_FLAG2          0X42 
#define PAJ_GET_INT_FLAG1          0X43 
#define PAJ_GET_INT_FLAG2          0X44 
#define PAJ_GET_STATE              0X45 
#define PAJ_SET_HIGH_THRESHOLD     0x69 
#define PAJ_SET_LOW_THRESEHOLD     0X6A 
#define PAJ_GET_APPROACH_STATE     0X6B 
#define PAJ_GET_GESTURE_DATA       0X6C 
#define PAJ_GET_OBJECT_BRIGHTNESS  0XB0 
#define PAJ_GET_OBJECT_SIZE_1      0XB1 
#define PAJ_GET_OBJECT_SIZE_2      0XB2 
#define PAJ_SET_PS_GAIN         0X44 
#define PAJ_SET_IDLE_S1_STEP_0  0x67 
#define PAJ_SET_IDLE_S1_STEP_1  0x68 
#define PAJ_SET_IDLE_S2_STEP_0  0X69 
#define PAJ_SET_IDLE_S2_STEP_1  0X6A 
#define PAJ_SET_OP_TO_S1_STEP_0 0X6B 
#define PAJ_SET_OP_TO_S1_STEP_1 0X6C
#define PAJ_SET_S1_TO_S2_STEP_0 0X6D 
#define PAJ_SET_S1_TO_S2_STEP_1 0X6E
#define PAJ_OPERATION_ENABLE    0X72 
#define BIT(x) 1<<(x)#define GES_UP              BIT(0) 
#define GES_DOWM            BIT(1) 
#define GES_LEFT            BIT(2) 
#define GES_RIGHT           BIT(3) 
#define GES_FORWARD         BIT(4) 
#define GES_BACKWARD        BIT(5) 
#define GES_CLOCKWISE       BIT(6) 
#define GES_COUNT_CLOCKWISE BIT(7) 
#define GES_WAVE            BIT(8) extern u8 printfbuff
[40];
extern u8 printlen
;
extern u8 change_mu
;void paj7620u2_selectBank(bank_e bank
);
u8 
paj7620u2_wakeup(void);
void Gesture_test(void);
void Gesture_test_mu(void);
u8 
paj7620u2_init(void);
                            總結
                            
                                以上是生活随笔為你收集整理的paj7620移植笔记1的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。