amobbs.com 阿莫电子技术论坛

标题: CDPnP 摄像头 CDCAM 升级,增加 fpga 读摄像头数据 [打印本页]

作者: dukelec    时间: 2023-4-30 18:59
标题: CDPnP 摄像头 CDCAM 升级,增加 fpga 读摄像头数据
本帖最后由 dukelec 于 2023-4-30 22:09 编辑

升级之前:
[attach]617159[/attach]

升级之后:
[attach]617160[/attach]

升级之前,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
作者: cetxuch    时间: 2023-4-30 19:54
感谢分析。如果能够附上前后性能测试对比就更棒了。

五一快乐!
作者: cne53102    时间: 2023-4-30 20:08
摄像头也不一样了呢
作者: liuzhijun2008    时间: 2023-4-30 22:03
用的是国产FPGA吗? 封装挺小的
作者: qtechzdh    时间: 2023-4-30 22:05
liuzhijun2008 发表于 2023-4-30 22:03
用的是国产FPGA吗? 封装挺小的
(引用自4楼)

这是Lattic的ICE40啊。
作者: dukelec    时间: 2023-4-30 22:13
cne53102 发表于 2023-4-30 20:08
摄像头也不一样了呢
(引用自3楼)

摄像头没变,CDPNP 用的一直都是第二个图的镜头,第一个图当时是拍照的时候觉的拍出来好看,才选它给 CDCAM 拍照
作者: dukelec    时间: 2023-4-30 22:16
liuzhijun2008 发表于 2023-4-30 22:03
用的是国产FPGA吗? 封装挺小的
(引用自4楼)


看到右下角的模组了没,2016 晶体上面的黑色方形芯片也是同系列同容量的 lattice 的 fpga,我之所以用大封装 fpga 收摄像头数据,是为了做 pcb 方便
作者: wxws    时间: 2023-5-1 04:47
可以用 rp2040 .一颗芯片解决了。
作者: dukelec    时间: 2023-5-1 09:59
本帖最后由 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 芯片上,学的知识其它芯片用不了
作者: codefish    时间: 2023-5-1 11:50
顶一下!!!
作者: wxws    时间: 2023-5-1 11:59
本帖最后由 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

作者: dukelec    时间: 2023-5-1 12:23
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
作者: qwe2231695    时间: 2023-5-1 12:45
上CSI接口,全局快门的sensor。搞一个SOC级别的采集前端CPU,压缩mjpeg,通过UVC或者UDP推送到PC。
作者: wxws    时间: 2023-5-1 12:49
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



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


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

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

这次时间比较赶,不想搞这么复杂
作者: dukelec    时间: 2023-5-1 13:32
wxws 发表于 2023-5-1 12:49
dma完成,可以自动启动下一个dma,做成一个环。
不知道你现在的模式下,pclk有多快。会不会丢就不好说了,但 ...

(引用自14楼)

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

pclk 我现在设置的是 2 MHz,这个摄相头一般可以到 20 多 MHz
作者: wxws    时间: 2023-5-1 18:50
只是2M呀,pio与dma速度肯定够.
2*8bit  要16M bps 了
就是不知道外发够不够


我的一个小玩意,也是卡在外发速度上?
作者: dukelec    时间: 2023-5-1 21:51
本帖最后由 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 的关系,的确可以单芯片实现我想要的功能,而且片子很便宜,但是片子可替代性有点差,我暂时也没时间学新的环境,等有时间可以试试
作者: wxws    时间: 2023-5-2 11:06
话说用rp的pio  实现cdbus好象没啥问题,
真正一颗ic搞定了。
作者: liandao    时间: 2023-5-2 13:01
本帖最后由 liandao 于 2023-5-2 13:03 编辑
wxws 发表于 2023-5-2 11:06
话说用rp的pio  实现cdbus好象没啥问题,
真正一颗ic搞定了。

(引用自19楼)


期待rpi2040实现的cdbus!




欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4