#include "common.h"
#define HLINE_W 3000 // 每行的周期,3000
#define IMAGE_W 2496 // 采集图像水平像素宽度
#define IMAGE_H 2 // 光源开关,分别采集一行
unsigned short image_buffer[IMAGE_W*IMAGE_H]; // 图像缓冲区
short exposure_time =50; // CMOS传感器曝光时间,高电平有效
void gpio_init(void)
{
// TSCLK(PF6), FS1(PF9), FS2(PF10)
*pPORTF_FER |= PF0 | PF1 |PF2 | PF3 | PF6| PF9| PF10;
*pPORTF_MUX |= PF0 | PF1 |PF2 | PF3; // enable PPI_D8 - PPI_D11,CMOS 传感器12位数据
*pPORTG_FER |= PG8 | PG9 |PG10 | PG11 |PG12 | PG13 |PG14 | PG15; // enable peripheral
*pPORTG_MUX |= PG8 | PG9 |PG10 | PG11 |PG12 | PG13 |PG14 | PG15; // enable PPI_D0 - PPI_D7
}
volatile short cnt = 0;
void Process_Data(void)
{
cnt ++; // 处理代码以后添加
}
EX_INTERRUPT_HANDLER(DMA0_ISR)
{
Process_Data();
*pDMA0_IRQ_STATUS |= DMA_DONE;
}
void ppi_init(void)
{
*pDMA0_START_ADDR = image_buffer; //配置PPIDMA数据起始地址
*pDMA0_CONFIG = FLOW_AUTO|DI_EN|WDSIZE_16|DMA2D|WNR;//配置DMA工作模式
*pDMA0_X_COUNT = IMAGE_W; //配置DMA一行要传输多少次数据
*pDMA0_X_MODIFY = 2; //配置每次传输行地址的增量
*pDMA0_Y_COUNT = IMAGE_H; //配置要传输多少行数据
*pDMA0_Y_MODIFY = 2; //配置每次列数据地址的增量,12位数据占 2个字节
asm("ssync;");
register_handler(ik_ivg8, DMA0_ISR);
*pSIC_IMASK |= IRQ_DMA0;
*pTIMER0_PERIOD = HLINE_W; //配置行同步信号产生的周期
*pTIMER0_WIDTH = exposure_time; //配置行同步信号宽度
*pTIMER0_CONFIG = EMU_RUN|CLK_SEL |TIN_SEL| PERIOD_CNT |PULSE_HI| PWM_OUT;//配置行同步信号工作模式,上升沿开始
*pTIMER1_PERIOD = HLINE_W*IMAGE_H;// 采集两行的周期
*pTIMER1_WIDTH = exposure_time ; // 光源打开时间
*pTIMER1_CONFIG = EMU_RUN|CLK_SEL |TIN_SEL| PERIOD_CNT| PWM_OUT;//配置行同步信号工作模式,低电平打开光源
asm("ssync;");
*pPPI_CONTROL = POLS|DLEN_12|(0x10)|XFR_TYPE ; //配置PPI工作偶是 PORT_CFG=0010
*pPPI_DELAY = 22; //配置时钟延时为14(Sensor) + 7(ADC)
*pPPI_COUNT = IMAGE_W -1; //配置PPI每行要传输2496次
*pPPI_FRAME = IMAGE_H; //配置每帧图像有2行
asm("ssync;");
*pDMA0_CONFIG |= DMAEN; //使能DMA
asm("ssync;"); //系统同步
*pPPI_CONTROL |= PORT_EN; //使能PPI
asm("ssync;"); //系统同步
*pTIMER_ENABLE|= TIMEN0 | TIMEN1; //使能行场同步信号
asm("ssync;"); //系统同步
}
void SensorInit()
{
gpio_init();
ppi_init();
}