你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【NUCLEO-H533RE评测】+07 IIC调试

[复制链接]
〃聪聪哥哥 发布时间:2024-8-5 14:23

软件配置:keil5.38a

硬件:STM32H533主板,STM32H533拓展版,IIC模块:PAJ7620U2

一:模块资料介绍:PAJ7620U2 Gesture Sensor是一款基于PAJ7620U2的手势识别模块,可直接识别9种基本手势,支持I2C接口,兼容3.3V/5V电平。这里为了方式调试,我使用的是STM32硬件的IIC驱动代码,也加深了自己对IIC通讯的理解;(由于自己手头上没能找到I3C的设备,等以后找到了设备再回来测试I3C,或者是有小伙伴测试了I3C的话,麻烦告知一声)

模块资料:

电源电压 : 3.3V/5V

工作原理:光学数组式环境亮度传感检测

通讯接口:I²C 接口,400Khz(Max)

识别速度:240Hz

工作环境光:<100K Lux(抗灯光干扰)

有效探测距离:5~15cm

检测角度范围:60°~180°

手势识别种类:内置 9 个手势类型:(上、下、左、右、前、后、顺时针旋转、逆时针旋转、挥动)

功耗:3~10mA(待机功耗电流 15uA)

PAJ7620U2传感器的工作原理

图片1.png

我们可以看到PAJ7620U2传感器内部自带 LED 驱动器(可发射红外线信号),内置有传感器感应阵列、目标信息提取阵列和手势识别阵列。另外,PAJ7620U2作为一种光学数组式传感器,其内置LED驱动器集成了环境光和光源抑制滤波器,模块基本不受环境光干扰。

红外LED手势识别原理:传感器工作时通过内部 LED 驱动器,驱动红外 LED 向外发射红外线信号,当传感器阵列在有效的距离中探测到物体时,目标信息提取阵列会对探测目标进行特征原始数据的获取,采集到的数据被保存在寄存器中,同时手势识别阵列会对原始数据进行识别处理,最后将手势结果存到寄存器中。

根据 PAJ7620U2传感器数据手册,用户可通过I²C接口总线采集信号并迅速识别出UP、Down、Right、Left等9种常用手势。另外PAJ7620U2还提供内置的接近检测功能,用于检测物体的接近或离开。

二:学习,了解IIC通讯

2.1:硬件连接方式:I²C的两根线:SCL时钟线和SDA数据线。

SCL时钟线:是为整个通信过程提供了时钟信号

SDA数据线:在每一个周期里发送0或者1,用这些0和1传输数据

软件传输:

数据线SDA以时钟线SCL作为参照。

开始信号:当SCL为高电平时,SDA由高电平向低电平跳变时,开始传输数据。

结束信号:当SCL为高电平时,SDA由低电平向高电平跳变时,停止传输数据。

应答信号:接收数据的IC 在接收完8个bit的数据之后,返回应答ack指令,表示数据已被签收。

三:实际硬件连接

1脚 GND  供电负极

2脚 VCC  供电正极 这里我设计的是5V

3脚 SDA  IIC的数据线   PB6    

4脚 SCL  IIC的时钟线 PB7 

电路图:

图片2.png

STM32cube的配置图:

图片3.png

然后配置好之后,

图片4.png

点击生成软件代码即可。

查看生成的IIC底层驱动是否正确:

/ 用户代码开始 0 /

/ 用户代码结束 0 /

I2C_HandleTypeDef Hi2C1;

/ I2C1 初始化函数 /

void MX_I2C1_Init(void)

{

/ 用户代码开始 I2C1_Init 0 /

/ 用户代码结束 I2C1_Init 0 /

/ 用户代码开始 I2C1_Init 1 /

/ 用户代码结束 I2C1_Init 1 /

Hi2C1 中。实例 = I2C1;

Hi2C1 中。初始化计时 = 0x60808CD3;

Hi2C1 中。Init.OwnAddress1 = 0;

Hi2C1 中。Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;

Hi2C1 中。Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;

Hi2C1 中。Init.OwnAddress2 = 0;

Hi2C1 中。Init.OwnAddress2Masks = I2C_OA2_NOMASK;

Hi2C1 中。Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;

Hi2C1 中。Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;

if (HAL_I2C_Init(&hi2c1) != HAL_OK)

{

Error_Handler(); }

/** 配置模拟滤波器

*/

if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK)

{

Error_Handler(); }

/** 配置数字滤波器

*/

if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK)

{

Error_Handler(); }

/ 用户代码开始 I2C1_Init 2 /

/ 用户代码结束 I2C1_Init 2 /

}

void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};

if(i2cHandle->实例==I2C1)

{

/ 用户代码开始 I2C1_MspInit 0 /

/ 用户代码结束 I2C1_MspInit 0 /

/** 初始化外设时钟

*/

PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_I2C1;

PeriphClkInitStruct.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1;

if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)

{

Error_Handler();

}

__HAL_RCC_GPIOB_CLK_ENABLE();

/**I2C1 GPIO配置

PB6 ------> I2C1_SCL

PB7 ------> I2C1_SDA

*/

GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7;

GPIO_InitStruct.模式=GPIO_MODE_AF_OD;

GPIO_InitStruct.拉=GPIO_PULLUP;

GPIO_InitStruct.速度=GPIO_SPEED_FREQ_HIGH;

GPIO_InitStruct.备用 = GPIO_AF4_I2C1;

HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

/ I2C1 时钟使能 /

__HAL_RCC_I2C1_CLK_ENABLE(); / 用户代码开始 I2C1_MspInit 1 /

/ 用户代码结束 I2C1_MspInit 1 /

}

}

void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle)

{

if(i2cHandle->实例==I2C1)

{

/ 用户代码开始 I2C1_MspDeInit 0 /

/ 用户代码结束 I2C1_MspDeInit 0 /

/ 外设时钟禁用 /

__HAL_RCC_I2C1_CLK_DISABLE();

/**I2C1 GPIO配置

PB6 ------> I2C1_SCL

PB7 ------> I2C1_SDA

*/

HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6);

HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); / 用户代码开始 I2C1_MspDeInit 1 /

/ 用户代码结束 I2C1_MspDeInit 1 /

}

}

确保配置引脚与实际接线保持一致,这里我设置的IIC的通讯速率是100KHZ;

手势模块驱动函数如下:这里我封装到了一个c文件里面,方便再次移植;

主函数程序如下:

uint8_t rxBuffer[9] ;

int 接收指数 = 0 ;

int Fredata = 10000 ;

int Dutydata = 5 ;

define VDDA_APPLI (3300U)

/ 用户代码结束 0 /

/**

  • @brief 应用程序入口点。
  • @retval int

*/

int main(void)

{

/ 用户代码开始 1 /

/ 用户代码结束 1 /

/ 单片机配置--------------------------------------------------------/

/ 重置所有外设,初始化 Flash 接口和 Systick。/

HAL_Init();

/ 用户代码开始初始化 /

/ 用户代码结束初始化 /

/ 配置系统时钟 /

SystemClock_Config();

/ 用户代码开始 SysInit /

/ 用户代码结束 SysInit /

/ 初始化所有配置的外设 /

MX_GPIO_Init();

MX_ICACHE_Init();

MX_USART1_UART_Init();

MX_USART2_UART_Init();

MX_TIM2_Init();

MX_ADC1_Init();

MX_I2C1_Init();

/ 用户代码开始 2 /

HAL_TIM_PWM_Start_IT(&htim2,TIM_CHANNEL_1);

printf("autor by congconggege\r\n"); HAL_Delay(1000);

printf(“PAJ7620U2手势传感器测试程序 ...\r\n”);

PAJ7620_Init();

printf(“PAJ7620U2手势传感器正常 \r\n”); / 用户代码结束 2 /

/ 无限循环 /

/ 用户代码开始时 /

而 (1)

{

/ 用户代码结束时 /

/ 用户代码开始 3 /

GetCurrentGesture();//

HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_5);

HAL_Delay(500); }

/ 用户代码结束 3 /

}

实物图片如下:

图片6.png

试验效果:向上(Up)、向下(Dowm)、向左(Left)、向右(Right)、向前(Forward)、向后(Backward)、顺时针(Clockwise)、逆时针(Counterclockwise)、和挥动(Wave)。当识别到正确的手势,手势类型会打印在串口2,测试截图

图片5.png

图片6.png
图片5.png
图片8.png
图片5.png
图片8.png
收藏 评论0 发布时间:2024-8-5 14:23

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版