forked from ccsens_hardware/stc_ttss_868
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
7.3 KiB
218 lines
7.3 KiB
////////////////////////////////////////////////////////////////////////////
|
|
///@copyright Copyright (c) 2018, 传控科技 All rights reserved.
|
|
///-------------------------------------------------------------------------
|
|
/// @file bsp_gc6133.c.c
|
|
/// @brief bsp @ driver config
|
|
///-------------------------------------------------------------------------
|
|
/// @version 1.0
|
|
/// @author CC
|
|
/// @date 20180331
|
|
/// @note cc_AS_stc02
|
|
///-------------------------------------------------------------------------
|
|
/// @version 1.2
|
|
/// @author CC
|
|
/// @date 20180703
|
|
/// @note cc_AS_stc02
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
//#include "Bsp_debug.h"
|
|
#include "bsp_func.h"
|
|
#include "bsp_cam_isr.h"
|
|
#include "bsp_cam.h"
|
|
#include "../msp/uart0.h"
|
|
#include "cw63xx.h"
|
|
#include "../clib/Clib.h"
|
|
#include "../clib/bit.h"
|
|
#include "../msp/time.h"
|
|
#define D_pclk_div_hs 1 ///D_pclk_per_hs*D_pclk_div_hs < 680
|
|
|
|
///vs p3.7 int3
|
|
///hs p3.6 int2
|
|
///pclk p3.2 int0
|
|
/// row line确可以表示一条线 一行的意思.而column则形象的表示一个纵向的“列
|
|
|
|
#define D_line_get 10
|
|
#define D_row_get2 4
|
|
#ifdef doc_98989
|
|
vs /```24.8ms````\_______________________________..1.16s..._____________________________________________/```````````\__________
|
|
hs /\————————/\_2.14MS_/\____/\____/\____ ...... __/\____/\____/\__480个__/\____/\____/\____/\————————/\
|
|
|
|
hs /``\________________________hs______________________/``\
|
|
pclk |||||||||||||||||||||||||||||||||||||||||||||||640
|
|
|
|
|
|
Line0 L1 L2 L1 L1 L1 L1 L1 L1 L480
|
|
----------------------------------------------------------------------
|
|
1 1 1 1 1 1 1 1 1 --- --- 1
|
|
2 2 2 2 2 2 2 2 2 --- --- 2
|
|
3 3 3 3 3 3 3 3 3 --- --- 3
|
|
4 4 4 4 4 4 4 4 4 --- --- 4
|
|
5 5 5 5 5 5 5 5 5 --- --- 5
|
|
6 6 6 6 6 6 6 6 6 --- --- 6
|
|
7 7 7 7 7 7 7 7 7 --- --- 7
|
|
8 8 8 8 8 8 8 8 8 --- --- 8
|
|
9 9 9 9 9 9 9 9 9 --- --- 9
|
|
10 10 10 10 10 10 10 10 10 --- --- 10
|
|
11 11 11 11 11 11 11 11 11 --- --- 11
|
|
12 12 12 12 12 12 12 12 12 --- --- 12
|
|
13 13 13 13 13 13 13 13 13 --- --- 13
|
|
14 14 14 14 14 14 14 14 14 --- --- 14
|
|
. . . . . . . . . --- --- .
|
|
. . . . . . . . . --- --- .
|
|
. . . . . . . . . --- --- .
|
|
. . . . . . . . . --- --- .
|
|
640 640 640 640 640 640 640 640 640 --- --- 640
|
|
|
|
#endif ///doc_98989
|
|
|
|
|
|
void L0_cam_isr_init(void)
|
|
{
|
|
IT0 = 1;///int0 下降沿触发 = 0 上下沿均可触发
|
|
/// IT0 = 0;////int0 下降沿触发 = 0 上下沿均可触发
|
|
/// L0_INT0_OPEN();
|
|
D_HSYNCS_close();
|
|
D_VSYNCS_open();
|
|
D_PCLK_close();
|
|
|
|
}
|
|
|
|
#if(MODE_CAM_LINE == MODE_CAM)
|
|
|
|
|
|
#if 0
|
|
//////////
|
|
/////一帧数据的开始
|
|
void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿
|
|
{////找到一帧数据的开头:第一行
|
|
L0_INT3_CLEAR();
|
|
///s_task_GC032A.usHs_count = 0;
|
|
DR_line_n = 0;
|
|
/// s_task_GC032A.next_line = D_ready;///启动第一行 这样确保帧头是第一行,对齐的///
|
|
/// s_task_GC032A.one_line_ok = D_clear;
|
|
s_task_GC032A.line_get = D_clear;
|
|
s_task_GC032A.vs_ok = D_ready;
|
|
//s_task_GC032A.frames ++;
|
|
//if(s_task_GC032A.frames > 10)
|
|
{/// 时间溢出
|
|
///s_task_GC032A.frames = 0;
|
|
}
|
|
D_ledb_OFF();
|
|
/// D_leda_ON();
|
|
D_HSYNCS_open();
|
|
}
|
|
|
|
/////一行line row数据的开始
|
|
void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿
|
|
{///hs 下沿有效
|
|
L0_INT2_CLEAR();
|
|
//// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表
|
|
//// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据
|
|
///if(D_ready == s_task_GC032A.next_line)
|
|
{///D_P33_REV();
|
|
//D_leda_OFF();
|
|
/// s_task_GC032A.next_line = D_clear;///因为接收一行数据的时间远远小于发送的时间
|
|
///因此添加这个为了提高可靠性
|
|
///发送完了后由“gc032a任务”启动
|
|
s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过
|
|
////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了
|
|
///0 24 58 94 129 165 200 236 271 307 342 378
|
|
D_PCLK_open();
|
|
//D_P35_REV() ;
|
|
DR_pclk_n = 0;
|
|
if(DR_line_n >= D_line_get)
|
|
{
|
|
s_task_GC032A.line_get = D_ready;
|
|
D_HSYNCS_close();D_PCLK_close();
|
|
}
|
|
}
|
|
DR_line_n ++;///当前行数增加
|
|
}
|
|
|
|
////s_task_GC032A.buf 存放的是一行的数据
|
|
//// pclk int0 每个点的采样
|
|
void L0_PCLK_Isr(void) interrupt D_ISR_int0 /// using 10///
|
|
{///PCLK
|
|
// D_P34_REV();
|
|
DR_Dat = P1;
|
|
s_task_GC032A.buf[DR_pclk_n] = DR_Dat; // s_task_GC032A.buf[DR_pclk_n] = 0xaa;//P1&0xf0; //s_task_GC032A.buf[s_task_GC032A.usN] = s_task_GC032A.usN;
|
|
DR_pclk_n++;// D_P34_REV();
|
|
if(DR_pclk_n > D_pclk_per_hs)////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据
|
|
{
|
|
D_PCLK_close();
|
|
|
|
//D_ledb_REV() ;
|
|
DR_pclk_n = D_pclk_per_hs; ///fixme
|
|
DR_pclk_n = 0;
|
|
/// s_task_GC032A.one_line_ok = D_ready;////给“gc032a任务”传递消息 可以开始计算或者发送了
|
|
D_ledb_ON();
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#elif(MODE_CAM_FRAME == MODE_CAM)
|
|
|
|
#elif(MODE_CAM_TEST == MODE_CAM)
|
|
/////连续发送
|
|
void L0_VSYNCS_Isr (void) interrupt D_ISR_int3////下降沿
|
|
{////找到一帧数据的开头:第一行
|
|
///s_task_GC032A.usHs_count = 0;
|
|
DR_line_n = 0;
|
|
s_task_GC032A.next_line = 1;///启动第一行 这样确保帧头是第一行,对齐的///
|
|
s_task_GC032A.vs_ok = D_ready;
|
|
}
|
|
|
|
/////一行line row数据的开始
|
|
void L0_HSYNCS_Isr(void) interrupt D_ISR_int2/// using 1 /下降沿
|
|
{///hs 下沿有效
|
|
//// hs信号的计数在vs有效的时候清零,这样usHs_count=D_row_get就代表
|
|
//// 当前一帧画面里面的第D_row_get个hs,也就是一个画面中的第几行数据
|
|
if(s_task_GC032A.next_line)
|
|
{///D_P33_REV();
|
|
s_task_GC032A.next_line = 0;///因为接收一行数据的时间远远小于发送的时间
|
|
///因此添加这个为了提高可靠性
|
|
///发送完了后由“gc032a任务”启动
|
|
s_task_GC032A.lines = DR_line_n;////保存当前的行号到缓存中,因为行号变化的速度超过
|
|
////发送的速度,当在"gc032A任务"中使用的时候DR_line_n 已经变化了
|
|
///0 24 58 94 129 165 200 236 271 307 342 378
|
|
|
|
/*****
|
|
if(D_line_get == DR_line_n)
|
|
{
|
|
s_task_GC032A.line_get = 1;
|
|
}
|
|
******/
|
|
D_PCLK_open();///启动记录下一行数据
|
|
DR_pclk_n = 0;
|
|
}
|
|
DR_line_n ++;///当前行数增加
|
|
}
|
|
|
|
////s_task_GC032A.buf 存放的是一行的数据
|
|
//// pclk int0 每个点的采样
|
|
void L0_PCLK_Isr(void) interrupt D_ISR_int0 //// using 10///
|
|
{///PCLK
|
|
// D_P34_REV();
|
|
//// DR_Dat = P1; s_task_GC032A.buf[DR_pclk_n] = DR_Dat;
|
|
s_task_GC032A.buf[DR_pclk_n] = P1;
|
|
|
|
|
|
////s_task_GC032A.buf[DR_pclk_n] = 0xcc;
|
|
///s_task_GC032A.buf[DR_pclk_n] = DR_pclk_n;
|
|
DR_pclk_n++;// D_P34_REV();
|
|
if(DR_pclk_n > D_pclk_per_hs) ////一行的有效数据接收完成 采样了 D_pclk_per_hs个固定数据
|
|
{
|
|
D_PCLK_close();
|
|
DR_pclk_n = D_pclk_per_hs; ///fixme
|
|
|
|
s_task_GC032A.line_ok = 1; ////给“gc032a任务”传递消息 可以开始计算或者发送了
|
|
}
|
|
}
|
|
|
|
|
|
////收到 next_line 记录当前第几行lines,启动 pclk,采集数据到buf中,然后line_ok
|
|
///// send buf, set next_line after send buf over
|
|
|
|
#endif
|
|
|
|
|
|
|