【DigiKey好物畅享】ST STEVAL-16GZMAI1照相机扩展板——和STM32N6连接

1、STEVAL-16GZMAI1的连接

STM32N6的CSI接口也是2Lan的差分线,ST的板子设计的十分优秀,虽然STEVAL-16GZMAI1没有这么多的引脚,但是FPC插座依然使用了22p,完全兼容N6和树莓派常见的2Lan CSI接口。

2、驱动移植思路

STM32N6570-DK开发套件自带一个照相机模块,具体型号是索尼的IMX335。ST的STM32Cube_FW_N6_V1.1.1包中提供了这款CSI照相机的驱动,移植驱动时可进行参考。STM32cubemx中可直接配置CSI的参数,但是在查看了大佬们的STM32N6570-DK开发板评测,发现cubemx的直接配置可能会无函数,因此直接手动移植来适配照相机。

驱动移植的大致逻辑:

——1、硬件复位和电源控制

——2、DCMIPP 和 CSI 初始化

——3、I2C 通信和传感器初始化

——4、VD16GZ 传感器配置

3、SDK移植实操

ST丰富的生态会十分帮助移植驱动,STSW-IMG504和STSW-IMG507提供了从PC到MCU/MPU再到照相机模块的全套驱动函数和文件。

例如VD16GZ_WriteReg16函数可指定I2C接口写入寄存器,来配置STEVAL-16GZMAI1照相机。

VD16GZ_ReadID已封装好了I2C接口和寄存器定义,可直接获取照相机的ID,判断连接的设备是否正确。

MX_DCMIPP_Init_VD16GZ是STM32N6配置CSI接口的函数,通过传入结构体参数,能一步步来配置CSI接口初始化,如配置失败或者参数不正确将不好返回HAL_OK。

作为CSI摄像头,高带宽带来高丰富度的数据和自定义的参数调节。VD16GX_StartStream()、VD16GX_StopStream()、VD16GX_SetResolution()这三个函数分别是开始捕获,停止捕获,设置分辨率,其中支持的分辨率达到九个,有1124 x 1364原生分辨率,还有1120 x 1360默认分辨率,最低可至320 x 240分辨率。

STM32N6 nucleo板卡可直接插入STSW-IMG504摄像头,两者的FPC插座兼容,一条0.5mm间距22p的FPC线即可完成连接。

依据STSW-IMG504和STSW-IMG507这两个SDK,移植修改了vd16gx_regs.h函数,STEVAL-16GZMAI1的相关寄存器都在此文件内。vd16gx.c是驱动实现的文件,包含VD16GZ_ReadID和VD16GX_StartStream()等函数,vd16gx.h对vd16gx.c中的函数进行声明,vd16gx_demo.c是一个简单的demo用来实现STM32N6和STEVAL-16GZMAI1的连接测试。

4、debug验证

计划将程序烧录到N6中,测试一下demo。但是我手中的N6 nucleo无法连接进入KEIL的debug模式,签名烧写外部flash后也无反应,可能是板子有问题了,毕竟已经吃灰了好几个月了。等我买个N6,后面再对demo和驱动代码做个测试,有了摄像头和高性能的MCU,后面就可以玩玩摄像头推流和拍照AI处理了。附件中添加了代码文件,也欢迎各位大佬提出意见!

5、经验总结

ST的软件生态是很丰富的,结合AI助手,可快速阅读代码了解结构,进而快速实现自己的功能。对于学习摄像头的使用来说,STEVAL-16GZMAI1是一款非常推荐的摄像头模组,可兼容MCU和MPU方便使用。最后感谢EE和Digikey举办的活动,后续如果能拿到新的N6板卡,再尝试下N6连接STEVAL-16GZMAI1的debug。