日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

paj7620移植笔记1

發布時間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 paj7620移植笔记1 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從原子那買了一個手勢識別模塊,自己做了個東西。用的標準庫。

由于模塊自帶上拉電阻,所以沒有再外接,直接CON2用了一個插座。
PB6-SCL PB7-SDA 而INT沒有使用
單片機:STM32F103RCT6
首先是IIC底層程序,寫過很多IIC了,直接拿來使用:

void GS_i2c_init(void) //PB6-SCL PB7-SDA {GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能GPIOB時鐘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; //50Mhz速度GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //輸出高 } void GS_SDA_IN() //PB7 {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); } //產生IIC起始信號 static void GS_IIC_Start(void) {GS_SDA_OUT();//sda線輸出GS_IIC_SDA = 1; GS_IIC_SCL = 1;delay_us(4);GS_IIC_SDA = 0;//START:when CLK is high,DATA change form high to low delay_us(4);GS_IIC_SCL = 0;//鉗住I2C總線,準備發送或接收數據 }//產生IIC停止信號 static void GS_IIC_Stop(void) {GS_SDA_OUT();//sda線輸出GS_IIC_SCL = 0;GS_IIC_SDA = 0;//STOP:when CLK is high DATA change form low to highdelay_us(4);GS_IIC_SCL = 1; GS_IIC_SDA = 1;//發送I2C總線結束信號delay_us(4); }//等待應答信號到來 //返回值:1,接收應答失敗 // 0,接收應答成功 static u8 GS_IIC_Wait_Ack(void) {u8 ucErrTime = 0;GS_SDA_IN(); //SDA設置為輸入 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;//時鐘輸出0 return 0; }//產生ACK應答 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; }//不產生ACK應答 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; }//IIC發送一個字節 //返回從機有無應答 //1,有應答 //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);} } //讀1個字節,ack=1時,發送ACK,ack=0,發送nACK static u8 GS_IIC_Read_Byte(u8 ack) {u8 i,receive = 0;GS_SDA_IN();//SDA設置為輸入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();//發送nACKelseGS_IIC_Ack(); //發送ACK return receive; } 模塊的讀寫以及喚醒 //PAJ7620U2寫一個字節數據 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; }//PAJ7620U2讀一個字節數據 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; } //PAJ7620U2讀n個字節數據 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;} //PAJ7620喚醒 void GS_WakeUp(void) {GS_IIC_Start();GS_IIC_Send_Byte(PAJ7620_ID);//發寫命令GS_IIC_Stop();//釋放總線 }.h文件定義://BANK寄存器枚舉 typedef enum{BANK0 = 0, //BANK0寄存器BANK1, //BANK1寄存器 }bank_e;extern u8 change;#define PAJ7620_ID 0x73<<1 //設備地址 #define PAJ_REGITER_BANK_SEL 0XEF //BANK選擇寄存器 #define PAJ_BANK0 0X00 //BANK0 #define PAJ_BANK1 0X01 //BANK1//BANK0 寄存器組 #define PAJ_SUSPEND_CMD 0X03 //設置設備掛起 #define PAJ_SET_INT_FLAG1 0X41 //設置手勢檢測中斷寄存器1 #define PAJ_SET_INT_FLAG2 0X42 //設置手勢檢測中斷寄存器2 #define PAJ_GET_INT_FLAG1 0X43 //獲取手勢檢測中斷標志寄存器1(獲取手勢結果) #define PAJ_GET_INT_FLAG2 0X44 //獲取手勢檢測中斷標志寄存器2(獲取手勢結果) #define PAJ_GET_STATE 0X45 //獲取手勢檢測工作狀態 #define PAJ_SET_HIGH_THRESHOLD 0x69 //設置滯后高閥值(僅在接近檢測模式下) #define PAJ_SET_LOW_THRESEHOLD 0X6A //設置滯后低閥值 #define PAJ_GET_APPROACH_STATE 0X6B //獲取接近狀態 (1:PS data>= PS threshold ,0:PS data<= Low threshold) #define PAJ_GET_GESTURE_DATA 0X6C //獲取接近數據 #define PAJ_GET_OBJECT_BRIGHTNESS 0XB0 //獲取被照物體亮度(最大255) #define PAJ_GET_OBJECT_SIZE_1 0XB1 //獲取被照物體大小低八位(bit7:0)(最大900) #define PAJ_GET_OBJECT_SIZE_2 0XB2 //獲取被照物體大小高四位(bit3:0)//BANK1 寄存器組 #define PAJ_SET_PS_GAIN 0X44 //設置檢測增益大小 (0:1x gain 1:2x gain) #define PAJ_SET_IDLE_S1_STEP_0 0x67 //設置S1的響應因子 #define PAJ_SET_IDLE_S1_STEP_1 0x68 #define PAJ_SET_IDLE_S2_STEP_0 0X69 //設置S2的響應因子 #define PAJ_SET_IDLE_S2_STEP_1 0X6A #define PAJ_SET_OP_TO_S1_STEP_0 0X6B //設置OP到S1的過度時間 #define PAJ_SET_OP_TO_S1_STEP_1 0X6C #define PAJ_SET_S1_TO_S2_STEP_0 0X6D //設置S1到S2的過度時間 #define PAJ_SET_S1_TO_S2_STEP_1 0X6E #define PAJ_OPERATION_ENABLE 0X72 //設置PAJ7620U2使能寄存器//手勢識別效果 #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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。