搜索
bottom↓
回复: 19
打印 上一主题 下一主题

CDPnP 摄像头 CDCAM 升级,增加 fpga 读摄像头数据

[复制链接]

出615入1076汤圆

跳转到指定楼层
1
发表于 2023-4-30 18:59:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dukelec 于 2023-4-30 22:09 编辑

升级之前:


升级之后:


升级之前,stm32g0 通过摄像头的 pclk 接到 io 口中断,在中断函数取 8 位摄像头 io 口数据,pclk 只能跑 400khz 左右,再高中断忙不过来

升级之后,fpga 内部搞 8 个 256 字节的 page 做缓存,fpga 自动搬运摄像头 jpg 数据到缓存
然后 stm32g0 不停取 page 数据,pclk 速度不再有限制


fpga 固件有 60KBytes 左右,通过 lz4 算法压缩到 10KBytes 以内,放在 mcu flash 内部,mcu 每次上电通过 spi 给 fpga 配置固件,后面也是通过同一个 spi 传输图片数据

lz4 算法同样是从 linux kernel 代码取出来的,方便用于各种 mcu

代码已经更新到: https://github.com/dukelec/cdcam

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

2
发表于 2023-4-30 19:54:19 | 只看该作者
感谢分析。如果能够附上前后性能测试对比就更棒了。

五一快乐!

出330入1862汤圆

3
发表于 2023-4-30 20:08:44 | 只看该作者
摄像头也不一样了呢

出0入0汤圆

4
发表于 2023-4-30 22:03:03 来自手机 | 只看该作者
用的是国产FPGA吗? 封装挺小的

出10入18汤圆

5
发表于 2023-4-30 22:05:41 | 只看该作者
liuzhijun2008 发表于 2023-4-30 22:03
用的是国产FPGA吗? 封装挺小的
(引用自4楼)

这是Lattic的ICE40啊。

出615入1076汤圆

6
 楼主| 发表于 2023-4-30 22:13:20 来自手机 | 只看该作者
cne53102 发表于 2023-4-30 20:08
摄像头也不一样了呢
(引用自3楼)

摄像头没变,CDPNP 用的一直都是第二个图的镜头,第一个图当时是拍照的时候觉的拍出来好看,才选它给 CDCAM 拍照

出615入1076汤圆

7
 楼主| 发表于 2023-4-30 22:16:02 来自手机 | 只看该作者
liuzhijun2008 发表于 2023-4-30 22:03
用的是国产FPGA吗? 封装挺小的
(引用自4楼)


看到右下角的模组了没,2016 晶体上面的黑色方形芯片也是同系列同容量的 lattice 的 fpga,我之所以用大封装 fpga 收摄像头数据,是为了做 pcb 方便

出0入228汤圆

8
发表于 2023-5-1 04:47:04 来自手机 | 只看该作者
可以用 rp2040 .一颗芯片解决了。

出615入1076汤圆

9
 楼主| 发表于 2023-5-1 09:59:16 来自手机 | 只看该作者
本帖最后由 dukelec 于 2023-5-1 11:03 编辑
wxws 发表于 2023-5-1 04:47
可以用 rp2040 .一颗芯片解决了。
(引用自8楼)


我看 github 上面用 rp2040 驱动 ov2640 只支持到 352x288 像素

使用 pio 貌似也只能 让 pclk 受控于 href & vsync,不能实现:
dma 搬运 250 字节 camera 数据到指定 buffer,然后搬运后序字节到另一个 250 大小的 buffer

只有这样,我才能一边 dma 读摄像头数据,一边把数据通过 485 发送出去

这样摄相头画面大小不受 mcu 内存限制

而且我不喜欢 pio 要单独学一套 pio 的编程语言,且只能用在 rp 芯片上,学的知识其它芯片用不了

出0入0汤圆

10
发表于 2023-5-1 11:50:30 | 只看该作者
顶一下!!!

出0入228汤圆

11
发表于 2023-5-1 11:59:08 | 只看该作者
本帖最后由 wxws 于 2023-5-1 12:03 编辑

rp2040的pio,当然能够与自带的dma 交互

这个demo就用了这个功能。https://github.com/the6p4c/rp2040_ov2640

不过我没玩过ov2640,不知道这个为什么只用了352*288,当然也要考虑rp2040对外输出 速度。

多dma 交替也能实现。定义好dma数量 ,完成后中断,并启用另一个dma,
中断里就去发数据就行了。

我对ov2640不熟,不明白你的 :“使用 pio 貌似也只能 让 pclk 受控于 href & vsync,"
pclk不是由ov2640自已输出的吗?


只是最近2040搞得多,建议而已。 Pio 还是值得花点时间的。

哦,替代是指用2040,替换你这方案里的fpga+stm32

出615入1076汤圆

12
 楼主| 发表于 2023-5-1 12:23:38 来自手机 | 只看该作者
wxws 发表于 2023-5-1 11:59
rp2040的pio,当然能够与自带的dma 交互

这个demo就用了这个功能。https://github.com/the6p4c/rp2040_ov2 ...

(引用自11楼)

“让 pclk 受控于 href & vsync” 我指的是接收方式,href 和 vsync 都是有效的时候,pclk 才生效,data 数据才在 pclk 跳变的时候被采集

“定义好dma数量 ,完成后中断,并启用另一个dma”

可能不太行,因为高分辨率的时候 pclk 频率很高,中断的时候可能已经丢掉好几个有效的 pclk 了

更高阶的 cpu 支持队列 dma,硬件完成一个 dma 任务后会立即开启队列中下一个 dma 任务,无需中断 cpu

不过,这种高阶的 cpu 内存也很大,不需要使用 dma 的队列功能,譬如 x1600 这样的内置 ddr 内存可以跑 linux 的 cpu

出105入79汤圆

13
发表于 2023-5-1 12:45:44 | 只看该作者
上CSI接口,全局快门的sensor。搞一个SOC级别的采集前端CPU,压缩mjpeg,通过UVC或者UDP推送到PC。

出0入228汤圆

14
发表于 2023-5-1 12:49:33 | 只看该作者
dma完成,可以自动启动下一个dma,做成一个环。
不知道你现在的模式下,pclk有多快。会不会丢就不好说了,但应该不会丢,Pio有fifo的,dma采的不会丢 。

我说的中断,只是说有了数据后去处理发送,但事实上,完全也可以由pio来实现发送过程,由dma来触发

几个介绍 pio应用的文章,还是可以看看:
做个频率计  https://rjk.codes/post/building-a-frequency-counter/
驱动EL屏 https://www.youtube.com/watch?v=dN7OhS3jSVg
驱动VGA显示器  https://vanhunteradams.com/Pico/VGA/VGA.html


出615入1076汤圆

15
 楼主| 发表于 2023-5-1 13:08:17 来自手机 | 只看该作者
qwe2231695 发表于 2023-5-1 12:45
上CSI接口,全局快门的sensor。搞一个SOC级别的采集前端CPU,压缩mjpeg,通过UVC或者UDP推送到PC。 ...
(引用自13楼)


我之前有考虑直接用 x1600 cpu,自带 cdbus 高速 485 控制器

上 cpu 可以直接压成视频传输了

这次时间比较赶,不想搞这么复杂

出615入1076汤圆

16
 楼主| 发表于 2023-5-1 13:32:27 来自手机 | 只看该作者
wxws 发表于 2023-5-1 12:49
dma完成,可以自动启动下一个dma,做成一个环。
不知道你现在的模式下,pclk有多快。会不会丢就不好说了,但 ...

(引用自14楼)

配置两个 dma 任务,第一个 dma 结束,硬件自动启动下一个 dma,这样倒是可以。
常用的 mcu 只有 rp 有这样的功能吗?stm32 的 dma 有这样的功能吗?

pclk 我现在设置的是 2 MHz,这个摄相头一般可以到 20 多 MHz

出0入228汤圆

17
发表于 2023-5-1 18:50:46 来自手机 | 只看该作者
只是2M呀,pio与dma速度肯定够.
2*8bit  要16M bps 了
就是不知道外发够不够


我的一个小玩意,也是卡在外发速度上?

出615入1076汤圆

18
 楼主| 发表于 2023-5-1 21:51:14 来自手机 | 只看该作者
本帖最后由 dukelec 于 2023-5-1 22:03 编辑
wxws 发表于 2023-5-1 18:50
只是2M呀,pio与dma速度肯定够.
2*8bit  要16M bps 了
就是不知道外发够不够

(引用自17楼)


外发倒是没这么快

它 pclk 2M 的时候,大多数时间 href 是没使能的
偶尔连续出数据,mcu 也有缓存空间,虽然也不是很大

外发数据量主要看帧率和 jpeg 图片大小(和所拍内容有关)

我现在用的是 1M+10M 双速率 rs485,1M 速率阶段,默认空 3 字节(可以减少),加 1 字节源地址总共 4 字节,等效 10M 速率的 40 字节,再加 4 字节 cdbus 头尾和 2 字节 cdnet 头的开销,总共 46 字节,有效数据 250 字节,有效数据按字节算占:250 / (250 + 46) ≈ 84.4% (空 1 字节 + 1 bit 则是 90%)

也就是说,当前总线配置跑满传图片文件的速度是 10Mbps x 84.4% = 1MBytes x 84.4% = 0.84 MBytes / sec,目前 800x600 一张图基本不到 100 KBytes

之前有想过用 stm32 dma 环形 buffer 接收摄相头数据,然后多 copy 一次:把环形 buffer 数据拷贝到外发的数据 buffer

环形 buffer 也要改用 dma 支持 gpio 的 stm32g431,外面再加一个门电路芯片,mcu 内存反而变小,芯片贵很多,还不如 stm32g0 加一个便宜的 fpga

你上面说的 rp 芯片,支持 dma chain,又有 pio 可以调理 href vsync 和 pclk 的关系,的确可以单芯片实现我想要的功能,而且片子很便宜,但是片子可替代性有点差,我暂时也没时间学新的环境,等有时间可以试试

出0入228汤圆

19
发表于 2023-5-2 11:06:59 | 只看该作者
话说用rp的pio  实现cdbus好象没啥问题,
真正一颗ic搞定了。

出0入0汤圆

20
发表于 2023-5-2 13:01:26 来自手机 | 只看该作者
本帖最后由 liandao 于 2023-5-2 13:03 编辑
wxws 发表于 2023-5-2 11:06
话说用rp的pio  实现cdbus好象没啥问题,
真正一颗ic搞定了。

(引用自19楼)


期待rpi2040实现的cdbus!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-29 11:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表