注册 登录
查看: 786|回复: 3

[鹰眼] 【求助】KL26驱动鹰眼,卡在while(ov7725_eagle_img_flag != IMG_FINISH)

[复制链接]
发表于 2014-6-9 01:08:53 | 显示全部楼层 |阅读模式
本帖最后由 ExiBQ 于 2014-6-9 01:14 编辑

首先谢谢大家帮助我了。。。

采用的是这种接线方式:

SCCB通过了,场中断和像素中断都改过来了,由于PTC、PTD端口中断开启和关闭是同的,
所以这样处理了:
enable_irq(PORTC_PORTD_IRQn);

问题出现了:

程序会一直卡在while(ov7725_eagle_img_flag != IMG_FINISH)
用live watch看ov7725_eagle_img_flag 也一直是IMG_START

【注】发帖之前搜了一下KL驱动鹰眼的帖子,听说需要中断接下拉电阻?
是KL一定要接么?因为之前试过K60不接电阻也可以。


附上改动后的代码,帮忙看看哪里改错了?(改动的地方用红色标出来了)
【FIRE_OV7725_Eagle.c】
#include "common.h"
#include "MKL_gpio.h"
#include "MKL_port.h"
#include "MKL_dma.h"
#include "FIRE_camera.h"

#define OV7725_EAGLE_Delay_ms(time)  DELAY_MS(time)

uint8   *ov7725_eagle_img_buff;


volatile IMG_STATUS_e      ov7725_eagle_img_flag = IMG_FINISH;   //图像状态


//内部函数声明
static uint8 ov7725_eagle_reg_init(void);
static void ov7725_eagle_port_init();

uint8 ov7725_eagle_init(uint8 *imgaddr)
{
    ov7725_eagle_img_buff = imgaddr;
    while(ov7725_eagle_reg_init() == 0);
    ov7725_eagle_port_init();
    return 0;
}

void ov7725_eagle_port_init()
{
    //DMA通道0初始化,PTA5触发源(默认上升沿),源地址为PTE_B2_IN,目的地址为:IMG_BUFF,每次传输1Byte
    dma_portx2buff_init(CAMERA_DMA_CH, (void *)&PTD_B0_IN, (void *)ov7725_eagle_img_buff, PTC16, DMA_BYTE1, CAMERA_DMA_NUM);


    DMA_DIS(CAMERA_DMA_CH);
    DMA_IRQ_DIS(CAMERA_DMA_CH);


    disable_irq(PORTC_PORTD_IRQn);                        //关闭PTA的中断


    port_init(PTC16, ALT1 | DMA_FALLING | PULLDOWN );         //PCLK


    port_init(PTC17, ALT1 | IRQ_RISING  | PULLDOWN | PF);     //场中断,上拉,上降沿触发中断,带滤波


}

void ov7725_eagle_vsync(void)
{


    //场中断需要判断是场结束还是场开始
    if(ov7725_eagle_img_flag == IMG_START)                   //需要开始采集图像
    {
        ov7725_eagle_img_flag = IMG_GATHER;                  //标记图像采集中
        disable_irq(PORTC_PORTD_IRQn);


        dma_repeat(CAMERA_DMA_CH, (void *)&PTD_B0_IN, (void *)ov7725_eagle_img_buff,CAMERA_DMA_NUM);
        DMA_IRQ_EN(CAMERA_DMA_CH);
    }
    else                                        //图像采集错误
    {
        disable_irq(PORTC_PORTD_IRQn);                        //关闭PTA的中断
        ov7725_eagle_img_flag = IMG_FAIL;                    //标记图像采集失败
    }
}

void ov7725_eagle_dma()
{
    DMA_IRQ_DIS(CAMERA_DMA_CH);
    ov7725_eagle_img_flag = IMG_FINISH ;
    DMA_IRQ_CLEAN(CAMERA_DMA_CH);
}

void ov7725_eagle_get_img()
{
    ov7725_eagle_img_flag = IMG_START;                   //开始采集图像
    PORTC_ISFR = ~0;                        //写1清中断标志位(必须的,不然回导致一开中断就马上触发中断)
    enable_irq(PORTC_PORTD_IRQn);                         //允许PTA的中断
    while(ov7725_eagle_img_flag != IMG_FINISH)           //等待图像采集完毕
    {
        if(ov7725_eagle_img_flag == IMG_FAIL)            //假如图像采集错误,则重新开始采集
        {
            ov7725_eagle_img_flag = IMG_START;           //开始采集图像
            PORTC_ISFR = ~0;                //写1清中断标志位(必须的,不然回导致一开中断就马上触发中断)
            enable_irq(PORTC_PORTD_IRQn);                 //允许PTA的中断
        }
    }
}

【main.c】
void  main(void)
{
    Site_t site     = {0, 0};                           //显示图像左上角位置
    Size_t imgsize  = {CAMERA_W, CAMERA_H};             //图像大小
    Size_t size;                   //显示区域图像大小


    //LCD_init();


    size.H = LCD_H;
    size.W = LCD_W;


    //初始化摄像头
    camera_init(imgbuff);


    //配置中断复位函数
    set_vector_handler(PORTC_PORTD_IRQn ,PORTC_IRQHandler);    //设置LPTMR的中断复位函数为 PORTA_IRQHandler
    set_vector_handler(DMA0_VECTORn ,DMA0_IRQHandler);      //设置LPTMR的中断复位函数为 PORTA_IRQHandler


    while(1)
    {
        //获取图像
        camera_get_img();                                   //摄像头获取图像


#if     ( CAMERA_COLOR == 1 )                                       //灰度摄像头
        LCD_Img_gray_Z       (site, size, imgbuff, imgsize);
#elif   ( CAMERA_COLOR == 0 )                                       //黑白摄像头
        LCD_Img_Binary_Z(site, size, imgbuff, imgsize);
#endif


        //解压图像
        img_extract(img, imgbuff,CAMERA_SIZE);


        //发送图像到上位机
        sendimg(img, CAMERA_W * CAMERA_H);                  //发送到上位机
    }
}

void PORTC_IRQHandler()
{
    uint8  n = 0;    //引脚号
    uint32 flag = PORTC_ISFR;
    PORTC_ISFR  = ~0;                                   //清中断标志位


    n = 17;                                              //场中断
    if(flag & (1 << 17))                                 //PTA6触发中断
    {
        camera_vsync();
    }
#if 0             //鹰眼直接全速采集,不需要行中断
    n = 5;
    if(flag & (1 << n))                                 //PTA5触发中断
    {
        camera_href();
    }
#endif
}

本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2014-6-9 12:46:52 | 显示全部楼层
KL26 是必须要接的,K60 可以不接,这是因为 KL26 抗干扰力 不如 K60 的好。

while(ov7725_eagle_img_flag != IMG_FINISH)  你看看 DMA 是否有采集到数据,能否正常触发场中断。
回复 支持 反对

使用道具 举报

发表于 2014-7-4 20:53:29 | 显示全部楼层
你这样差不多是进了场中断没进DMA。看看DMA接口,线有没有问题。才回来的数组有没有值。
回复 支持 反对

使用道具 举报

发表于 2014-7-5 17:29:28 | 显示全部楼层
山外メ雲ジ 发表于 2014-6-9 12:46
KL26 是必须要接的,K60 可以不接,这是因为 KL26 抗干扰力 不如 K60 的好。

while(ov7725_eagle_img_fl ...

请问KL26给鹰眼写SCCB需要,那两引脚需要上拉么?
回复 支持 反对

使用道具 举报

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

本版积分规则

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