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.
 
 
 
 

485 lines
14 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
//////////////////////////////////////////////////////////////////////////////
///#include "bsp_drv.h"
///#include "bsp_func.h"
#include "bsp_cam_isr.h"
#include "bsp_cam.h"
#include "msp_uart1.h"
#include "msp_iicMx.h"
////#include "cw63xx.h"
#include "c_lib.h"
#include "c_bit.h"
#include "debug_drv.h"
#include "TTSS_time_stc.h"
TS_clk_ data ts_clk;
/************
TS_P_rf TS_paer_value=
{
0xad,
0x0123,
// 0x00,///U16 paperNum:12; //12bit纸张数据
///U8 cameraIndex:2; //摄像头编号
///U8 cameraWorking:1; //是否正常工作
///U8 reserved: 1; //保留
0x56,///U8 cameraBoardPower; //电量
0xcc
};
void L0_p_send(void)
{
unsigned char *p;
TS_paer_value.r123.cameraBoardPower = 0;
TS_paer_value.filter1 = 0x0a;
// TS_paer_value.r123.paperNum = 0x1234;
p = (unsigned char *)&TS_paer_value.r123;
TS_paer_value.ocr = *p;
p ++;
TS_paer_value.ocr += *p;
p ++;
TS_paer_value.ocr += *p;
//TS_paer_value.ocr = 0x88;
/// L0_Uart0_Init4800();
L0_uart0_sendArray( (unsigned char *)&TS_paer_value,5);
//L0_uart0_init();
}
********/
//// mclk out init 系统时钟输出配置,可以提供给其他外设作为时钟
void L0_MCLKO_init(void)
{
BITN_1(P_SW2,EAXFR);
CLKSEL = CLKSET_IRC;
MCLKOCR = MCLKOCR_P54|MCLKOCR_DIV;
D_stdIO_P5(BITN4);///BITN_0(P5M1,BITN4);BITN_1(P5M0,BITN4);/// 01 推挽
/// BITN_0(P_SW2,EAXFR);// P_SW2 = 0x80;
}
void GC032A_port_init(void)
{
/***** volatile unsigned short j;
for(j = 0;j < D_row_max;j ++)
{
ts_task_GC032a.buf[j] = 0;
}
*****/
///00 准双向口 灌电流20mA 拉电流270-150uS
///01 推挽输出 20mA 加限流
///10 高阻
///11 开漏 open-Drain 内部上拉电阻断开 开漏模式既可以度外部状态也可以对外输出高低电平
//p3.6 --HSYNC
// BITN_0(P3M1,BITN6);BITN_0(P3M0,BITN6);
///P3.7 -- VSYNC
// BITN_0(P3M1,BITN7);BITN_0(P3M0,BITN7);
L0_GC032A_standby();
}
////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>>
TS_task_GC032A_ ts_task_GC032a;
void L2_task_GC032A_init(void)
{
L1_task_init(&ts_task_GC032a.task);
L3_task_s_go(ts_task_GC032a,D_task_init);
//L3_task_s_go(ts_task_GC032a,0);
/// ts_task_GC032a.line_onf = 1;
ts_task_GC032a.fisrt = 0; //发送完成一次有效数据后,时钟开始分频
ts_clk.pclk_n = 0;
ts_task_GC032a.HS_n = 0;
ts_task_GC032a.m = 0;
D_CAM_IO_INIT();
L0_cam_INT_init();
L0_IICMx_INIT(D_iicch_gc032a,1);
ts_iicm.t0[D_iicch_gc032a]= 0;///模拟iic的时候低电平和高电平的时间经常不确定
ts_iicm.t1[D_iicch_gc032a]= 1;///使用iic前需要配置iic的速率 根据规格书的要求
/********
while(0)
{
Lc_delay_ms(400);
L2_IICMx_Read1Reg1D(D_iicch_gc032a,D_i2c_addr_gc032A,0xf6);
}*******/
}
///L2_task_GC032A_handle(&ts_task_GC032a);
#if 1
#define GC032a_L0_uart0_uc L1_uartD_senduc
///#define GC032a_L0_uart0_uc(x);
#define L0_uart0_sendArraylong(x,y,z) L1_uartD_sendArrayLong(x,y,z)
#define GC032a_L0_uart0_sendArray(x,Y) L1_uartD_sendArray(x,Y)
#else
#define GC032a_L0_uart0_uc(x);
#define GC032a_L0_uart0_sendArray(x,Y)
#endif
#define D_task_GC032A_line1 0x81
#define D_task_GC032A_line2 0x82
#define D_task_GC032A_line3 0x83
#define D_paper_gate 0x20//0x10+
///20221112_184132 CCmodify 只有在打印的时候使用
#define D_send_us(x) DR_pdata_n = x;GC032a_L0_uart0_uc(DR_pdata_n_H);GC032a_L0_uart0_uc(DR_pdata_n_L);
#define D_uart0_free() (0 == ts_uart[0].now)
#define D_uart0_busy() (0 != ts_uart[0].now)
static unsigned char GC032A_init_flag = 1;
////L2_task_GC032A_handle(&ts_task_GC032a);
vU16 data gdataUs02,gdataUs03,gdataUs05;///
///////
////gRccUs03;
/*************/
void L2_task_GC032A_handle(TS_task_GC032A_ *s)
{
vU16 i = 0;
TTSS_Task_init():
//PWDN引脚拉低(0 -- 正常工作,1 -- 休眠)
L0_GC032A_standby();
D_cam_DVDD_off();
GC032a_L0_uart0_uc(0x31);
printf("TTSS_Task_init");
L2_task_go(D_task_GC032A_init_DVDD);
TTSS_Task_step(D_task_GC032A_init_DVDD):
L0_GC032A_work();
//IOVDD上电,并延时50us以上;
D_cam_DVDD_on();
for(i = 0;i < 640;i ++)
{
ts_task_GC032a.buf[1][i] = 0x20;
}
//L1_uartD_senduc(0x39);
L2_task_go(D_task_GC032A_init_AVDD);
//L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_AVDD):
//AVDD28上电,并延时0us以上
D_cam_AVDD_on();
L2_task_go(D_task_GC032A_init_pwdn);
TTSS_Task_step(D_task_GC032A_init_pwdn):
//提供032A系统频率
L0_MCLKO_init();
//PWDN引脚拉高,延时,拉低
L0_GC032A_standby();
L2_task_go(D_task_GC032A_init_pwdn_wait);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_init_pwdn_wait):
L0_GC032A_work();
GC032a_L0_uart0_uc('r');
printf(" L0_GC032A_work ");
gRccUs03 = 0;
D_cam_led_on();
L2_task_go(D_task_GC032A_write_reg);
L1_task_Tdelay(D_Tdelay_10ms);
//while(9);
TTSS_Task_step(D_task_GC032A_write_reg):
//设置摄像头参数
if(0 != GC6133_init_reg_tbl[gRccUs03][0])
{
L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);
gRccUs03 ++;
/// printf("\r\n gRccUs03 = %d (%X)= %x ",gRccUs03,(int)GC6133_init_reg_tbl[gRccUs03][0],(int)GC6133_init_reg_tbl[gRccUs03][1]);
/// printf("\r\n%d:(%2X)= %2X ",gRccUs03,(int)GC6133_init_reg_tbl[gRccUs03][0],(int)GC6133_init_reg_tbl[gRccUs03][1]);
///L1_uartD_senduc(s->usN);
L2_task_go(D_task_GC032A_write_reg);
L1_task_Cdelay(D_Cdelay_200us);
}else
{
L2_task_go(D_task_GC032A_div);
//L1_task_Tdelay(D_Tdelay_1s);
L1_task_Tdelay(250);
}
TTSS_Task_step(D_task_GC032A_div):
if(0 == s->fisrt)
{
s->fisrt = 1;
GC032a_L0_uart0_uc(0x3c);
D_VSYNCS_open();
///D_HSYNCS_open();
L0_GC032A_write(0xfa,D_0xfa);
}
L2_task_go(D_task_GC032A_start_time);
TTSS_Task_step(D_task_GC032A_start_time):
D_cam_led_on();
GC032a_L0_uart0_uc(0x3D);
printf(" D_task_GC032A_start_time ");
GC032A_init_flag = 0;
s->status = 0;
L2_task_go(D_task_GC032A_wait);
L1_task_Tdelay(D_Tdelay_10ms);
TTSS_Task_step(D_task_GC032A_wait):
if(1 == s->vs_ok)
{
s->vs_ok = 0;///s->m
printf("\r\nf\r\n ----------------------------------------------------------------- \r\n\r\n\r\n");
}
if(1 == s->hs_ok)
{
s->hs_ok = 0;///s->m
///DR_Hs_count --;
if((ts_clk.hs_n-1)%D_480_div == s->m)
{
///D_HSYNCS_close();
///printf("\r\n%x ",s->pclk_max);//,DR_Hs_count
printf("\r\nU%5d %3d %3X %d",ts_task_GC032a.VS_max,ts_clk.hs_n-1,s->pclk_max,(int)s->m);//,DR_Hs_count
s->pclk_max = 0;
//ts_task_GC032a.buf[0][ts_task_GC032a.pclk_n]
// L1_uartD_sendArrayhex(ts_task_GC032a.buf[0],100);///
/// ////hex /// ///
L1_uartD_sendArray(ts_task_GC032a.buf[0],640);////////
// L1_uartD_sendArray(ts_task_GC032a.buf[1],640);
///
D_HSYNCS_open();
}
////printf("\r\n%d %d %d",DR_Hs_count,s->pclk_max,s->pclk_n);
/// s->pclk_n = 0;
/***
0D 0A 20 32 34 09 32 30 37 09 32 38 31 09 13 21 13 20 15 21 16 25 1B 2F 25 4E 45 84 5B 97 62 98 61 A0 69 A5 66 A6 64 A0 5F 87 38 3C 1E 2A 1B 28 1B 28 1D 29 1E 29 1D 2A 1E 2B 20 2A 1E 2B 20 2E 1F 2F 21 30 21 30 22 32 23 31 21 31 23 37 2B 5A 6D C3 89 C0 7E B8 77 AF 6B A3 5A 7E 4B 75 2E 4F 2E 5C 2C 5D 43 79 40 75 39 58 20 37 20 2F 28 34 29 31 26 2B 27 2A 1B 2A 32 74 42 4C 2B 3C 29 38 25 32 1F 2A 1E 2E 20 33 23 34 26 34 25 39 28 3B 29 3F 2A 41 2C 41 2D 44 30 46 2D 44 2C 42 2D 47 2E 46 2E 4A 30 47 30 49 2F 4A 2E 48 2F 47 2F 49 32 4A 31 49 32 4B 30 4A 30 48 31 4B 34 50 3D 77 61 9E 69 9F 6C A6 71 BA 7E BD 7B BB 7F BC 78 A4 64 96 59 81 57 87 57 82 4D 74 42 5F 3B 61 38 4E 2F 47 2B 47 2B 43 2A 40 2A 3F 29 40 2A 41 28 3E 27 3B 26 38 26 3F 29 3E 24 2B 16 21 16 23 16 27 25 42 2A 47 2D 47 2A 42 2F 51 31 4B 30 48 2D 3E 2B 41 31 51 3E 5E 41 5E 40 5B 37 53 3A 58 3F 6B 47 6C 48 6D 48 72 47 71 49 72 4A 70 4B 73 4B 70 46 6E 46 65 41 66 45 6D 44 63 40 61 47 6F 46 64 42 5E 3C 5B 3B 5B 3D 5B 3D 59 3D 5A 3D 5C 3C 58 3A 58 3A 57 39 59 3D 59 5B 3B 5D 3A 5B 3A 59 39 5A 3A 59 39 5B 38 5A 3A 58 3A 59 3A 57 39 5B 3C 59 39 5B 3C 59 3A 5A 3D 5A 3B 5A 3D 59 3B 59 3B 5B 3D 5A 3C 5B 3D 5B 3D 5B 3D 59 3D 59 3B 5B 3D 5C 3B 59 3B 5C 3E 5A 3C 5C 3E 5A 3D 5B 3C 5A 3D 5C 3C 5A 3E 5A 3C 5C 3E 5D 3F 5D 3E 5F 3D 5A 3E 5B 3E 5D 3C 5B 3F 5C 3E 5D 3E 5D 40 5E 3D 5C 3D 5A 3D 5B 3E 5C 3D 5B 3E 5E 3C 5E 41 5C 3C 5D 3E 5D 3D 5B 3B 59 3E 5B 40 5B 3E 59 3F 5F 3D 5D 40 5A 3E 5A 3C 5D 3E 5C 41 59 3C 5A 3E 5B 3D 5C 40 5E 3C 5A 3C 5B 3E 5A 3B 5C 3D 5D 3C 5A 3B 5A 3A 59 3A 5D 3D 59 3C 5D 3C 5A 3C 58 3C 5A 3F 58 3A 58 3B 5A 3B 59 3D 59 3C 57 3B 58 3B 55 3B 58 3C 56 39 55 3A 54 3B 54 3B 56 38 56 3A 54 3A 54 39 53 38 54 3B 54 3A 55 3B 54 3A 55 3A 57 38 54 3B 53 38 4F 39 51 38 51 38 50 39 54 38 51 37 54 37 4F 37 4E 38 50 36 4E 38 50 35 51 38 4C 37 51 37 4E 37 4B 36 4F 34 4D 35 4E 35 4D 35 4D 36 50 34 4E 35 4F 36 4C 33 4F 32 4C 33 4E 36 4B 33 4C 35 4F 36 52 37 4B 36 4B 34 4A 35 4C 35 4D 34
printf("\r\nclk= %d \r\n",s->pclk_max);
printf("\r\n22clk= %d \r\n",s->pclk_n);s->pclk_n = 0;
/// L1_uartD_sendArrayhex(ts_task_GC032a.buf,s->pclk_max);
printf("\r\nHS= %d \r\n",s->HS_max);
/// L1_uartD_ushexArray(ts_task_GC032a.HS,s->HS_max);
/// L1_uartD_ushexArray(ts_task_GC032a.HS,12);
**/
}
TTSS_Task_step(D_task_GC032A_send1):
TTSS_Task_step(D_task_GC032A_sleep):
////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms
/////1160-10 - 20 = 1130ms
D_cam_led_on();//printf("\r\n D_task_GC032A_sleep ");
L2_task_go(D_task_GC032A_wait);
TTSS_Task_end();
}
void L1_GC032A_sleep(unsigned char onf)
{
if(onf)
{
/// 进入standby:
L0_GC032A_write(0xfc,0x03);
L0_GC032A_write(0xf7,0x00);
L0_GC032A_write(0xf9,0xcf);
L0_GC032A_write(0xf3,0x00);
}else
{
/// 退出standby:
L0_GC032A_write(0xfc,0x02);
L0_GC032A_write(0xf7,0x01);
L0_GC032A_write(0xf9,0xce);
L0_GC032A_write(0xf3,0xff);
}
}
void L3_GC032A_debug(u8 filter)
{
U8 i,val[16];
if(filter == ts_debug_rec.filter)
{///filter num d1 d2 d3 ....dn
//// FD 08 11 22 33 44 55 66 77 88 Lc_delay_ms(1);
/// L1_uartD_sendArrayhex(TS_s2b_debug.sp,TS_debug_rec.R1);
printf("\r\n GC032A ok");
switch (ts_debug_rec.ocr)
{
case 0x11:
//// FI R1 R2 R3 OCR
///// FC 11 F6 04 11
/// r2 寄存器 R3 数量 ,val
L0_GC032A_read(ts_debug_rec.R2,val,ts_debug_rec.R3);
Lc_delay_ms(400);
L2_IICMx_Read1Reg1D(D_iicch_gc032a,D_i2c_addr_gc032A,0xf6);
printf("\r\n GC032A_read reg(%2X) num= %d ",(int)ts_debug_rec.R2,(int)ts_debug_rec.R3);
L1_uartD_sendArrayhex(val, ts_debug_rec.R3);
break;
//读取摄像头配置参数
//1/ 2 3 4 5 6 7 8 9 10 11 12 13
break;
case 0x12:
//设置当前页面01
L0_GC032A_write(ts_debug_rec.R2,ts_debug_rec.R3);
L1_uartD_senduc(ts_debug_rec.R2);
L1_uartD_senduc(ts_debug_rec.R3);
//1 2 3 4 5 6 7 8 9 10 11 12 13
break;
case 0x05:
L1_uartD_senduc(0x81);
///1.standby
L1_GC032A_sleep(0);
break;
case 0x15:
L1_GC032A_sleep(1);///standby
L1_uartD_senduc(0x80);
break;
case 0x35:
L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma
L1_uartD_senduc(0x31);
break;
case 0x36:
/// 退出standby:
L0_GC032A_work();
L1_uartD_senduc(0x30);
break;
case 6:
D_cam_led_off();
break;
case 7:
D_cam_led_on();
break;
default:
printf(" pp error\r\n ");
break;
};
printf("333");
}
}
#if 0
//// fe 01 reg data 0cx
void L3_GC032A_fun(U8 *pPara)
{
U8 i,val[2];
TS_pp_debug_ *p = pPara;
switch(p->ocr)
{
case 0x00:
L0_GC032A_read(p->R2,val,p->R3);
/// L1_uartD_senduc(p->cmd);
L1_uartD_senduc(p->R2);
L1_uartD_senduc(p->R3);
L1_uartD_senduc('G');
for(i = 0;i < p->R3;i++)
{
L1_uartD_senduc(val[i]);
}
break;
//读取摄像头配置参数
case 0x01:
/// sysreg FE 01 FE 33 44 //读取当前页面
/// sysreg FE 01 F0 33 44 //读取id = 0x23
L0_GC032A_read(p->R2,&i,1);
L1_uartD_senduc(i);
break;
//修改摄像头配置参数
case 0x02:
/// fe 02 r2 r3 xx 设置寄存器(r2) = r3
/// sysreg FE 02 FE 01 44 //设置当前页面01
L0_GC032A_write(p->R2,p->R3);
L1_uartD_senduc(p->R2);
L1_uartD_senduc(p->R3);
break;
//启动摄像头进行拍照;
case 0x03:/// sysreg FE 03 03 04 05 //设置是否发送一line数据(数据分为一帧=640Line = 640line*480pclk )
///ts_task_GC032a.task.sh = D_task_GC032A_start_time;
if(1== ts_task_GC032a.line_onf)
{
ts_task_GC032a.line_onf = 0;
L1_uartD_senduc(0x30|ts_task_GC032a.line_onf);Lc_delay_ms(2);
}else
{
ts_task_GC032a.line_onf = 1;
L1_uartD_senduc(0x30|ts_task_GC032a.line_onf);Lc_delay_ms(2);
}
L1_uartD_senduc(0x30|ts_task_GC032a.line_onf);
break;
case 0x05:
L1_uartD_senduc(0x81);
///1.standby
L1_GC032A_sleep(0);
break;
case 0x15:
L1_GC032A_sleep(1);///standby
L1_uartD_senduc(0x80);
break;
case 0x35:
L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma
L1_uartD_senduc(0x31);
break;
case 0x36:
/// 退出standby:
L0_GC032A_work();
L1_uartD_senduc(0x30);
break;
case 6:
D_cam_led_off();
break;
case 7:
D_cam_led_on();
break;
default:
break;
};
}
#endif