今天收到网上买的OV5640,卖家很贴心22元包邮还给带了2个连接器,测试通过后我马上给了卖家一个大大的好评。显示摄像头图像需要对sdk_env_v0.10.0\hpm_sdk\samples\drivers\cam例程做一些修改,主要是因为使我用了自己制作的LCD扩展板,和官方例程会有不同给先楫HPM6750EVKMINI画一个LCD扩展板(上电调试)。我的屏幕是使用SPI配置的,官方使用的是I2C配置,摄像头和LCD共用这2个I/O,原来测试屏幕时使用软件模拟SPI(因为对应引脚不支持硬件SPI只能软件模拟)配置完屏幕后需要将SCL和SDA引脚设置为输出高电平,否则 void board_i2c_bus_clear(I2C_Type *ptr)函数里会报错"CLK is low, please power cycle the board\n"。出来这个问题应该是即使执行过gpio_disable_pin_output,相应的GPIO还是会保留之前设置好的输出状态。
测试时发现一个不友好的问题,就是摄像头是在板子的一侧它拍摄的画面和显示屏是成90度的,而LCD和OV5640好像都只支持镜像和翻转,没法做90度调整所以测试起来会比较别扭。
情况大概下图这样。无论LCD和摄像头如何翻转或镜像都没法使LCD显示的图像和摄像头采集的图像匹配。我想到一个办法是让摄像头输出480*640的图像,然后在lcdc每一次读取图像后使用相应函数将图像做90度旋转再让LCD显示。不知道除此之外还没有更好的办法。不过即使这样也不算什么大问题。
另一个是比较严重的问题,我在测试时LCD显示的图像会存在偏移,我不确定是屏幕的问题还是例程的问题,我使用lcdc例程在设置为640*480后刷粉色背景是正常的。不过刷彩条就会看到图像偏移。
彩条红框处为偏移部分
当我在尝试以800*480显示时,没想到LCD屏幕比较不挑食,没对我的投喂做出过激反应,就这样它的图像竟然可以正常显示了,图像应该会有缺失。
OV5640的800*480图像也可以正常显示,不过这不是一个正确的解决办法,如果可能还希望厂家能帮忙分析一下原因,我尝试修改run_test_mode函数中的dummy_layer.position_x和在整个工程检索800关键字,并没有找到解决这个问题的方法。
另外还有2个小问题,一个是SEGGER Embedded Studio for RISC-V 6.10的编辑器里不能直接输入中文,粘贴中文显示起来也比较难看。另一个是通过运行start_cmd.cmd再定位到例程文件夹,然后通过generate_project -b hpm6750evkmini命令的方式创建工程会比较麻烦。我尝试过使用c#写一个控制start_cmd.cmd来自动生成工程的程序没成功。因为对cmd不是很了解,后来我又花了很长时间尝试在工程目录下创建另一个.cmd文件去调用start_cmd.cmd,自动生成一个当前例程对应的工程文件,都没有成功。有好几次cmd窗口反复弹窗像中毒一样导致我不得不强制关闭电脑。所以如果可能,希望厂家能实现一个类似的功能,一个类似generate_project_hpm6750evkmini.cmd文件,放到对应的例程目录下运行就可以自动生成相应的工程。我觉得对我这种不怎么使用命令行的人会方便一些。
屏幕偏移的问题找到了,是hsync的电平设置问题,需要将hsync设置为低有效,vsync设置为高有效。
不过屏幕的设置是vsync和hsync全是低电平有效,我用示波器测量了这两个信号的电平,HPM6750的设置和实际输出没有问题,问题还是出在屏幕上。我也可以通过修改屏幕的寄存器使图像正常输出,但是vsync的逻辑实际是反的,明天再换一块屏幕试试。