OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10039|回复: 19

STM32F429接收SAA7113转换出的YUV422视频信号,数据能否完整接收到?

[复制链接]

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
发表于 2015-3-9 23:15:44 | 显示全部楼层 |阅读模式
5金钱
SAA7113是将PAL制式的模拟视频信号转换成标准ITU656数字信号(YUV422隔行扫描),数据输出时钟是27M,8bit并口输出。有行、场信号。我的目的是从SAA7113传出来的数据中提取出一帧完整的图像,就是不定时的拍一张照片(拍照时间间隔很长)。
请问利用STM32F4的DCMI和DMA能否实现数据 实时 接收并缓存到SDRAM中,这里接收数据时去判断是不是一帧完整的图像,缓存大概两张图像大,后期需要提取图片时从缓存中找出一帧完整的图像。我的想法是不是可行?有没有更好的方法读取一张完整的照片?

最佳答案

查看完整内容[请看2#楼]

回复【18楼】liuhuamin007: --------------------------------- 对数据是排线太长、太乱的原因。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-9 23:15:45 | 显示全部楼层
回复【18楼】liuhuamin007:
---------------------------------
对数据是排线太长、太乱的原因。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-3-9 23:21:12 | 显示全部楼层
当然可以的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-10 09:00:19 | 显示全部楼层
原子哥,我配置DCMI跟DMA,配置之后收不到数据。开行、场中断会进中断。然后关所有中断,在主循环里判断DCMI的FIFO是不是有数据,一直无有效数据。最后我把引脚配置成通用输入引脚,分别用PCLK、行、场、引脚中断,都可以进中断。下面是我的配置代码,是不是有问题啊?

[mw_shl_code=c,true]定义的接收地址及缓存,缓存放在SDRAM中,SDRAM测试过、读写数据没问题。 #define DCMI_DR_ADDRESS 0x50050028 #define FSMC_LCD_ADDRESS 0xD0000000//未用开启LCD控制器,这里用做SDRAM首地址 #define BUFFER_SIZE (40960) U32 YUV422BUF1[40960] __attribute__((at(FSMC_LCD_ADDRESS))); U32 YUV422BUF2[40960] __attribute__((at(FSMC_LCD_ADDRESS + (40960 * 4)))); 引脚配置: /*** Configures the DCMI GPIOs to interface with the OV2640 camera module ***/ /* Enable DCMI GPIOs clocks */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE); /* Connect DCMI pins to AF13 */ GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_DCMI);//DCMI_D0 GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_DCMI);//DCMI_D1 GPIO_PinAFConfig(GPIOC, GPIO_PinSource8, GPIO_AF_DCMI);//DCMI_D2 GPIO_PinAFConfig(GPIOC, GPIO_PinSource9, GPIO_AF_DCMI);//DCMI_D3 GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_DCMI);//DCMI_D4 GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_DCMI);//DCMI_D5 GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_DCMI);//DCMI_D6 GPIO_PinAFConfig(GPIOE, GPIO_PinSource6, GPIO_AF_DCMI);//DCMI_D7[/mw_shl_code] [mw_shl_code=c,true] GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_DCMI);//DCMI_VSYNC GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_DCMI);//DCMI_HSYNC GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_DCMI);//PCLK /* DCMI GPIO configuration */ /* D0..D4(PC6/7/8/9/11) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; // GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ; GPIO_Init(GPIOC, &GPIO_InitStructure); /* D5(PD3)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_Init(GPIOD, &GPIO_InitStructure); /* D6(PB8),VSYNC(PB7)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_7; GPIO_Init(GPIOB, &GPIO_InitStructure); /* D7(PD3)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_Init(GPIOE, &GPIO_InitStructure); /* HSYNC(PA4)*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_Init(GPIOA, &GPIO_InitStructure); /* PCLK(PA6) */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); DCMI跟DMA配置 /****************************************************/ DCMI_InitTypeDef DCMI_InitStructure; DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; //NVIC /*** Configures the DCMI to interface with the OV2640 camera module ***/ /* Enable DCMI clock */ RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); /* DCMI configuration */ DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; // DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_SnapShot; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling; // DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_Low; // DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_Low; DCMI_InitStructure.DCMI_VSPolarity = DCMI_VSPolarity_High; DCMI_InitStructure.DCMI_HSPolarity = DCMI_HSPolarity_High; DCMI_InitStructure.DCMI_CaptureRate = DCMI_CaptureRate_All_Frame; DCMI_InitStructure.DCMI_ExtendedDataMode = DCMI_ExtendedDataMode_8b; /* DCMI configuration */ DCMI_Init(&DCMI_InitStructure); [mw_shl_code=c,true] DCMI_ITConfig(DCMI_IT_FRAME, ENABLE);[/mw_shl_code] /* Configures the DMA2 to transfer Data from DCMI */ //Interrupt Init NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = DCMI_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Enable DMA2 clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); /* DMA2 Stream1 Configuration */ DMA_DeInit(DMA2_Stream1); DMA_InitStructure.DMA_Channel = DMA_Channel_1; DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS; // DMA_InitStructure.DMA_Memory0BaseAddr = FSMC_LCD_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)YUV422BUF1; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize = BUFFER_SIZE; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_DoubleBufferModeConfig(DMA2_Stream1,(uint32_t)&YUV422BUF2,DMA_Memory_0);//DMA_Memory_0; DMA_DoubleBufferModeCmd(DMA2_Stream1,ENABLE); DMA_ITConfig(DMA2_Stream1,DMA_IT_TC,ENABLE); DMA_Init(DMA2_Stream1, &DMA_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); int main(void) { [/mw_shl_code] [mw_shl_code=c,true]        unsigned int i; SDRAM_Init();//SDRAM[/mw_shl_code] [mw_shl_code=c,true]         for(i = 0;i < BUFFER_SIZE;i++)         {              YUV422BUF1 = i;             YUV422BUF2 = BUFFER_SIZE - i;         } [/mw_shl_code] [mw_shl_code=c,true] PORT_Init(); DCMIDMA_Init(); DCMI_Cmd(ENABLE); DMA_Cmd(DMA2_Stream1, ENABLE); while(1) { } }[/mw_shl_code]

回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-10 09:05:17 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
上面是我的配置代码跟SAA7113的时序,HREF是行信号、VREF是场信号
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-15
在线时间
0 小时
发表于 2015-3-10 16:51:27 | 显示全部楼层
是不是需要配置什么在pclk上升沿采集或者下降沿采集啊
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-10 17:12:01 | 显示全部楼层
回复【5楼】myopen_720:
---------------------------------
上升沿下降沿都试过了,效果一样,目前收不到数据,缓存里没数据。行、场、PCLK信号都已经送到单片机引脚,应该能收到数据,至于对不对再谈。还在找原因。
回复

使用道具 举报

4

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-15
在线时间
0 小时
发表于 2015-3-10 17:24:50 | 显示全部楼层
排除吧,你先用2640验证你的DMA,然后再配置你的芯片安照2640的时序输出
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-3-10 22:33:45 | 显示全部楼层
回复【4楼】ztzjl2010:
---------------------------------
这个只能慢慢调试了,呵呵
而且YUV422又不能直接显示在LCD上面,更不好确定是否正确.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-11 08:45:48 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
回复【7楼】myopen_720:
---------------------------------
找到原因了,未使能捕获,少了一句DCMI_CaptureCmd(ENABLE); 不够细心。感谢两位!
现在有其他问题了收到的数据不对,会丢数据。是不是收到数据后网SDRAM中写数据丢的数据?或者其他问题?待会上个截图。
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-3-11 09:23:54 | 显示全部楼层



数据截图,然后下面是7133输出的数据



收到的8010经常出错,然后一行开始标志和结束标志经常出错,截图是比较完整的FF 00 00 AB , FF 00 00 B6;中间没数据估计是摄像头信号没配置对,然后全部是消隐信号8010填充的,一行的开始跟结束之间没有数据。以上是猜测,还未来得及验证。后面的一行开始结束标志都会少一个两个数据,之间的8010也是不完整的。开始标志到下一个开始标志之间收到的数据也是长短不一。(我的板子飞线的,长度大概12厘米,然后再加上板子上的线,总长大概15-20厘米,飞线剪的是等长的,飞线会不会导致数据丢失,或者接收数据错误?)
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-12-29
在线时间
7 小时
发表于 2015-7-19 18:03:45 | 显示全部楼层
回复【10楼】ztzjl2010:
---------------------------------
8010是消隐区嘛,一般解码方式有两种,一种是使用潜入的数据:FF 00 00 XY,还有一种就是使用外部的行场信号来解码,前面那种要实际的数据不能和标志相同,楼主驱动了没,我也正想弄下DCMI采集SAA711系列
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-7-22 08:38:57 | 显示全部楼层
回复【11楼】cchwhk:
---------------------------------
数据收下来了,没有好的算法处理,有时候图像锯齿比较严重。还有就是采集的图像会丢数据,不知道是布线原因还是429本身的原因
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2013-12-29
在线时间
7 小时
发表于 2015-7-22 10:23:31 | 显示全部楼层
回复【12楼】ztzjl2010:
---------------------------------
哦,算法处理,你的意思是从YCbCr转到RGB??调试的时候可以尝试用Y信号来调试,Y信号就是灰度图
回复

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
 楼主| 发表于 2015-7-22 13:18:17 | 显示全部楼层
不是YCbCr转到RGB,隔行转逐行图片,摄像机有抖动会出现锯齿,需要一个插值算法去消抖动。
回复

使用道具 举报

29

主题

244

帖子

0

精华

高级会员

Rank: 4

积分
944
金钱
944
注册时间
2014-10-9
在线时间
93 小时
发表于 2015-9-9 18:04:35 | 显示全部楼层
回复【14楼】ztzjl2010:
---------------------------------
那接收到的YCbCr怎么显示在LCD上呢,LCD不识别YCbCr的呀
淘宝小店,没事可以点一下增加点流量http://shop69767205.taobao.com/
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-10-22
在线时间
0 小时
发表于 2015-10-22 11:02:30 | 显示全部楼层
回复【14楼】ztzjl2010:
------------------------------
应该可以设置7113的寄存器来改善吧(我猜的)
回复

使用道具 举报

11

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-17
在线时间
6 小时
发表于 2015-11-17 16:16:56 | 显示全部楼层
回复【15楼】yuanxinfei:
---------------------------------
我也迷茫中
回复

使用道具 举报

11

主题

110

帖子

0

精华

初级会员

Rank: 2

积分
187
金钱
187
注册时间
2015-11-17
在线时间
6 小时
发表于 2015-11-18 13:22:56 | 显示全部楼层
数据丢失应该是stm32的DMA只有64k限制。
回复

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2015-11-28
在线时间
10 小时
发表于 2016-1-20 21:27:16 | 显示全部楼层
朋友,我最近也在做有关SAA7113的项目,但是关于SAA7113的配置我有的地方还不是很明白,能不能把你的SAA7113的寄存器配置发给我一份,做个参考
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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