1.DCMI的简介
DCMI (Digital Camera Interface) 是一种专用于采集摄像头数据的硬件接口,广泛应用于嵌入式系统中。DCMI 支持多种图像数据格式,包括黑白图像、YUV、RGB 以及压缩的 JPEG 数据流。它能够与多种摄像头模块兼容,适用于不同类型的图像传感器。
DCMI 的主要工作原理基于行同步信号 (HSYNC) 和帧同步信号 (VSYNC),这两个信号用于确保数据的有序接收和同步。DCMI 可以直接将摄像头捕获的图像数据传输到系统的内存中,而无需经过大量的外部处理。对于一些支持内置预处理功能的摄像头模块,如调整大小、滤波等,DCMI 可以直接接收预处理后的图像数据,简化系统设计。
由于 DCMI 接口提供了高效、低延迟的数据传输能力,且支持多种图像格式,因此它在嵌入式图像处理应用中,特别是在需要处理视频流或高分辨率图像的应用场景中,被广泛采用。
2.AD9283
- 低功耗:90 mW(100 MSPS)
- 片内基准电压源和采样保持
- 475 MHz模拟带宽
- 信噪比:
46.5 dB(100 MSPS,41 kHz输入频率) - 1 Vp-p模拟输入范围
- +3.0 V单电源供电(2.7 V 至 3.6 V)
- 省电模式:4.2 mW
AD9283 是一款高度集成的 8 位单芯片采样模数转换器 (ADC),内置片内采样保持电路,专门针对低成本、低功耗、小尺寸和易用性进行了优化。它在 100 MSPS(百万样本每秒)的高速转换速率下工作,能够在整个工作范围内保持优异的动态性能,使其非常适合对速度和精度要求较高的应用场景。
核心特性与优势:
-
低功耗设计:AD9283 仅需一个 3.0V 单电源(工作范围为 2.7V 至 3.6V),这使其在能源敏感的应用中非常实用。此外,该 ADC 还支持省电模式,在此模式下总功耗可以降至仅 4.2 mW,适合需要超低功耗的便携设备或电池供电系统。
-
片内参考电压源:该 ADC 在大多数应用中不需要外部参考电压源或驱动器件。这不仅简化了系统设计,减少了外围组件,还提升了整体系统的稳定性和可靠性。
-
数字输出兼容性:AD9283 的数字输出是 TTL/CMOS 兼容的,且具有单独的输出电源引脚,支持 3.3V 或 2.5V 逻辑接口。这意味着该芯片可以方便地与多种微控制器和数字电路集成,提供灵活的接口配置,适应不同系统的需求。
-
编码器输入兼容性:AD9283 的编码器输入同样是 TTL/CMOS 兼容的,确保与常见的时钟源和控制信号电路的兼容性,从而增强了设计的灵活性。
-
封装与温度范围:AD9283 采用 20 引脚表面贴装塑料封装 (SSOP),这种封装形式不仅节省了电路板空间,还增强了芯片的机械稳定性和热性能。它的工作温度范围广泛,涵盖了 -40°C 到 +85°C 的工业温度范围,确保其在各种环境条件下的可靠工作。
AD9283 由于其高性能和低功耗的特性,非常适合应用在诸如无线通信设备、便携式仪器、数据采集系统、成像设备、以及其他需要高采样率与精度的应用中。其小尺寸和易用性使得它在现代紧凑型电子设备中得到了广泛应用。
3.引脚
-
PWRDWN (引脚 1): 电源下降引脚,控制芯片的省电模式。当此引脚被拉低时,芯片进入省电模式,降低功耗。
-
VREFOUT (引脚 2): 内部参考电压输出引脚,用于输出片内产生的基准电压。如果不使用外部基准电压,可以使用这个输出作为其他电路的参考。
-
VREFIN (引脚 3): 参考电压输入引脚。用户可以选择外部参考电压通过这个引脚输入,以替代内部基准电压。
-
GND (引脚 4, 7, 10, 17): 地引脚,连接到电源地。
-
VD (引脚 5, 9): 模拟电源电压引脚,通常连接到3.0V的电源。为芯片的模拟部分提供电源。
-
AIN# (引脚 6): 差分模拟输入的反相信号。用于输入模拟信号的负极部分,在单端模式下可以接地。
-
AIN (引脚 8): 模拟输入引脚,接收待转换的模拟信号(正极)。
-
ENCODE (引脚 11): 时钟输入引脚,用于向ADC提供时钟信号,该时钟决定了ADC的采样速率。
-
D7 (引脚 12) 到 D0 (引脚 20): 这8个引脚(D0-D7)为数字输出引脚,用于输出转换后的数字数据,D7是最高有效位(MSB),D0是最低有效位(LSB)。
-
VDD (引脚 15): 数字电源电压引脚,为芯片的数字部分提供电源。
#include "ad9220_dcmi.h" uint32_t adc_convert_value[ADC_DMA_DATA_LENGTH]; void MCO1_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd (RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;//PA8 输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed; GPIO_Init(GPIOA, &GPIO_InitStructure); } void dcmi_gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd( DCMI_VSYNC_GPIO_CLK | DCMI_HSYNC_GPIO_CLK | DCMI_PIXCLK_GPIO_CLK| DCMI_D0_GPIO_CLK| DCMI_D1_GPIO_CLK| DCMI_D2_GPIO_CLK| DCMI_D3_GPIO_CLK| DCMI_D4_GPIO_CLK| DCMI_D5_GPIO_CLK| DCMI_D6_GPIO_CLK| DCMI_D7_GPIO_CLK| DCMI_D8_GPIO_CLK| DCMI_D9_GPIO_CLK| DCMI_D10_GPIO_CLK| DCMI_D11_GPIO_CLK, ENABLE); /*初始化控制/同步信号线*/ GPIO_InitStructure.GPIO_Pin = DCMI_VSYNC_GPIO_PIN;//初始化帧同步信号线 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_Init(DCMI_VSYNC_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_VSYNC_GPIO_PORT, DCMI_VSYNC_PINSOURCE, DCMI_VSYNC_AF); GPIO_InitStructure.GPIO_Pin = DCMI_HSYNC_GPIO_PIN ;//初始化行同步信号线 GPIO_Init(DCMI_HSYNC_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_HSYNC_GPIO_PORT, DCMI_HSYNC_PINSOURCE, DCMI_HSYNC_AF); GPIO_InitStructure.GPIO_Pin = DCMI_PIXCLK_GPIO_PIN ;//初始化像素时钟信号线 GPIO_Init(DCMI_PIXCLK_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_PIXCLK_GPIO_PORT, DCMI_PIXCLK_PINSOURCE, DCMI_PIXCLK_AF); /*初始化数据信号线*/ GPIO_InitStructure.GPIO_Pin = DCMI_D0_GPIO_PIN ; GPIO_Init(DCMI_D0_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D0_GPIO_PORT, DCMI_D0_PINSOURCE, DCMI_D0_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D1_GPIO_PIN ; GPIO_Init(DCMI_D1_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D1_GPIO_PORT, DCMI_D1_PINSOURCE, DCMI_D1_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D2_GPIO_PIN ; GPIO_Init(DCMI_D2_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D2_GPIO_PORT, DCMI_D2_PINSOURCE, DCMI_D2_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D3_GPIO_PIN ; GPIO_Init(DCMI_D3_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D3_GPIO_PORT, DCMI_D3_PINSOURCE, DCMI_D3_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D4_GPIO_PIN ; GPIO_Init(DCMI_D4_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D4_GPIO_PORT, DCMI_D4_PINSOURCE, DCMI_D4_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D5_GPIO_PIN ; GPIO_Init(DCMI_D5_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D5_GPIO_PORT, DCMI_D5_PINSOURCE, DCMI_D5_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D6_GPIO_PIN ; GPIO_Init(DCMI_D6_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D6_GPIO_PORT, DCMI_D6_PINSOURCE, DCMI_D6_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D7_GPIO_PIN ; GPIO_Init(DCMI_D7_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D7_GPIO_PORT, DCMI_D7_PINSOURCE, DCMI_D7_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D8_GPIO_PIN ; GPIO_Init(DCMI_D8_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D8_GPIO_PORT, DCMI_D8_PINSOURCE, DCMI_D8_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D9_GPIO_PIN ; GPIO_Init(DCMI_D9_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D9_GPIO_PORT, DCMI_D9_PINSOURCE, DCMI_D9_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D10_GPIO_PIN ; GPIO_Init(DCMI_D10_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D10_GPIO_PORT, DCMI_D10_PINSOURCE, DCMI_D10_AF); GPIO_InitStructure.GPIO_Pin = DCMI_D11_GPIO_PIN ; GPIO_Init(DCMI_D11_GPIO_PORT, &GPIO_InitStructure); GPIO_PinAFConfig(DCMI_D11_GPIO_PORT, DCMI_D11_PINSOURCE, DCMI_D11_AF); } void ad9220_dcmi_dma_init(void) { DCMI_InitTypeDef DCMI_InitStructure; DMA_InitTypeDef DMA_InitStructure; /*** 配置DCMI接口 ***/ /* 使能DCMI时钟 */ RCC_AHB2PeriphClockCmd(RCC_AHB2Periph_DCMI, ENABLE); /* DCMI 配置*/ DCMI_InitStructure.DCMI_CaptureMode = DCMI_CaptureMode_Continuous; DCMI_InitStructure.DCMI_SynchroMode = DCMI_SynchroMode_Hardware; DCMI_InitStructure.DCMI_PCKPolarity = DCMI_PCKPolarity_Falling; 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_12b; DCMI_Init(&DCMI_InitStructure); DMA_InitStructure.DMA_Channel = DMA_Channel_1; DMA_InitStructure.DMA_PeripheralBaseAddr = DCMI_DR_ADDRESS; DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&adc_convert_value; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory; DMA_InitStructure.DMA_BufferSize =ADC_DMA_DATA_LENGTH; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_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_Priority = DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_INC8; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream1, &DMA_InitStructure);/*DMA初始化 */ /* DMA2_Stream1 enable 开启 DMA */ DMA_Cmd(DMA2_Stream1,ENABLE); while(DMA_GetCmdStatus(DMA2_Stream1) != ENABLE){} /* 配置中断 */ //注:这里应使用DMA来做中断触发,不用DCMI中断 } void dcmi_capture_control(FunctionalState state) { DMA_Cmd(DMA2_Stream1, state); //DMA2,Stream1 DCMI_Cmd(state); //DCMI采集数据 DCMI_CaptureCmd(state); //DCMI捕获 } void dcmi_dma_nvic_init(void) { NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn; //DMA2 流 1 中断 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;//抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道 NVIC_Init(&NVIC_InitStructure);//配置 //配置 DMA2 stream1 中断 DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE); //DMA_IT_TC:传输完成中断; ENABLE:允许中断 } void HSYNC_VSYNC_init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;//LED0和LED1对应IO口 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIO GPIO_SetBits(GPIOE,GPIO_Pin_0 | GPIO_Pin_1);//GPIOE0,E1设置高 }
#ifndef __AD9220_DCMI_H #define __AD9220_DCMI_H #include "stm32f4xx.h" #define DCMI_DR_ADDRESS (uint32_t)&DCMI->DR //宏定义 DCMI 数据寄存器的地址 #define ADC_DMA_DATA_LENGTH 1024 //DMCI 接口相关 IO 宏定义 //VSYNC #define DCMI_VSYNC_GPIO_PORT GPIOB #define DCMI_VSYNC_GPIO_CLK RCC_AHB1Periph_GPIOB #define DCMI_VSYNC_GPIO_PIN GPIO_Pin_7 #define DCMI_VSYNC_PINSOURCE GPIO_PinSource7 #define DCMI_VSYNC_AF GPIO_AF_DCMI //HSYNC #define DCMI_HSYNC_GPIO_PORT GPIOA #define DCMI_HSYNC_GPIO_CLK RCC_AHB1Periph_GPIOA #define DCMI_HSYNC_GPIO_PIN GPIO_Pin_4 #define DCMI_HSYNC_PINSOURCE GPIO_PinSource4 #define DCMI_HSYNC_AF GPIO_AF_DCMI //PIXCLK #define DCMI_PIXCLK_GPIO_PORT GPIOA #define DCMI_PIXCLK_GPIO_CLK RCC_AHB1Periph_GPIOA #define DCMI_PIXCLK_GPIO_PIN GPIO_Pin_6 #define DCMI_PIXCLK_PINSOURCE GPIO_PinSource6 #define DCMI_PIXCLK_AF GPIO_AF_DCMI //数据信号线 D0-D11 #define DCMI_D0_GPIO_PORT GPIOC #define DCMI_D0_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D0_GPIO_PIN GPIO_Pin_6 #define DCMI_D0_PINSOURCE GPIO_PinSource6 #define DCMI_D0_AF GPIO_AF_DCMI #define DCMI_D1_GPIO_PORT GPIOC #define DCMI_D1_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D1_GPIO_PIN GPIO_Pin_7 #define DCMI_D1_PINSOURCE GPIO_PinSource7 #define DCMI_D1_AF GPIO_AF_DCMI #define DCMI_D2_GPIO_PORT GPIOC #define DCMI_D2_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D2_GPIO_PIN GPIO_Pin_8 #define DCMI_D2_PINSOURCE GPIO_PinSource8 #define DCMI_D2_AF GPIO_AF_DCMI #define DCMI_D3_GPIO_PORT GPIOC #define DCMI_D3_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D3_GPIO_PIN GPIO_Pin_9 #define DCMI_D3_PINSOURCE GPIO_PinSource9 #define DCMI_D3_AF GPIO_AF_DCMI #define DCMI_D4_GPIO_PORT GPIOE #define DCMI_D4_GPIO_CLK RCC_AHB1Periph_GPIOE #define DCMI_D4_GPIO_PIN GPIO_Pin_4 #define DCMI_D4_PINSOURCE GPIO_PinSource4 #define DCMI_D4_AF GPIO_AF_DCMI #define DCMI_D5_GPIO_PORT GPIOB #define DCMI_D5_GPIO_CLK RCC_AHB1Periph_GPIOB #define DCMI_D5_GPIO_PIN GPIO_Pin_6 #define DCMI_D5_PINSOURCE GPIO_PinSource6 #define DCMI_D5_AF GPIO_AF_DCMI #define DCMI_D6_GPIO_PORT GPIOE #define DCMI_D6_GPIO_CLK RCC_AHB1Periph_GPIOE #define DCMI_D6_GPIO_PIN GPIO_Pin_5 #define DCMI_D6_PINSOURCE GPIO_PinSource5 #define DCMI_D6_AF GPIO_AF_DCMI #define DCMI_D7_GPIO_PORT GPIOE #define DCMI_D7_GPIO_CLK RCC_AHB1Periph_GPIOE #define DCMI_D7_GPIO_PIN GPIO_Pin_6 #define DCMI_D7_PINSOURCE GPIO_PinSource6 #define DCMI_D7_AF GPIO_AF_DCMI #define DCMI_D8_GPIO_PORT GPIOC #define DCMI_D8_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D8_GPIO_PIN GPIO_Pin_10 #define DCMI_D8_PINSOURCE GPIO_PinSource10 #define DCMI_D8_AF GPIO_AF_DCMI #define DCMI_D9_GPIO_PORT GPIOC #define DCMI_D9_GPIO_CLK RCC_AHB1Periph_GPIOC #define DCMI_D9_GPIO_PIN GPIO_Pin_12 #define DCMI_D9_PINSOURCE GPIO_PinSource12 #define DCMI_D9_AF GPIO_AF_DCMI #define DCMI_D10_GPIO_PORT GPIOB #define DCMI_D10_GPIO_CLK RCC_AHB1Periph_GPIOB #define DCMI_D10_GPIO_PIN GPIO_Pin_5 #define DCMI_D10_PINSOURCE GPIO_PinSource5 #define DCMI_D10_AF GPIO_AF_DCMI #define DCMI_D11_GPIO_PORT GPIOD #define DCMI_D11_GPIO_CLK RCC_AHB1Periph_GPIOD #define DCMI_D11_GPIO_PIN GPIO_Pin_2 #define DCMI_D11_PINSOURCE GPIO_PinSource2 #define DCMI_D11_AF GPIO_AF_DCMI void MCO1_GPIO_Config(void);//配置 MCO1 输出 void dcmi_gpio_init(void);//初始化 DCMI 接口使用的 GPIO void ad9220_dcmi_dma_init(void);//配置 DCMI/DMA 接收 AD9220 数据 void dcmi_capture_control(FunctionalState state);//开启或关闭DCMI采集 void dcmi_dma_nvic_init(void);//配置 DMA 中断 void HSYNC_VSYNC_init(void); #endif /* __AD9220_DCMI_H */
4.实物图