生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。