//////////////////////////////////////////////////////////////////////////// ///@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_debug.h" #include "bsp_func.h" #include "bsp_power.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" TS_P_rf433 TS_paer_value= { 0xaa,///vU8 ha; // 0xaa,///vU8 hb; 0xad, 0x0123, // 0x00,///U16 paperNum:12; //12bit纸张数据 ///U8 cameraIndex:2; //摄像头编号 ///U8 cameraWorking:1; //是否正常工作 ///U8 reserved: 1; //保留 0x56,///U8 cameraBoardPower; //电量 0xcc//, 0xaa///vU8 hc; }; void GC032A_port_init(void) { ///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(); D_cam_AVDD_on(); } ////>>>>>>>>>>>>>>>>>>>>>_s_task_GC032A_>>>>>>>>>>>>>>>>>>>>>> struct _s_task_GC032A_ s_task_GC032A; void L2_task_GC032A_init(void) { L0_cam_isr_init(); L1_task_init(&s_task_GC032A.task); ///L3_task_s_go(s_task_GC032A,D_task_init); s_task_GC032A.next_line = D_clear; s_task_GC032A.run = D_run; s_task_GC032A.line_get = D_clear; s_task_GC032A.cal_ok = D_clear; s_task_GC032A.frames = 0; s_task_GC032A.vs_ok = D_clear; s_task_GC032A.line_en = D_ON; s_task_GC032A.cal_en = D_OFF; /// D_HSYNCS_open();//BITN_1(INT_CLKO, INT_EX2);//使能INT2中断 } #if 10 ///// get void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) { TTSS_Task_init(); //PWDN引脚拉低(0 -- 正常工作,1 -- 休眠) L0_GC032A_standby(); L0_uart0_uc('2'); 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(); // L0_uart0_uc('3'); 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(); L0_uart0_uc('4'); L2_task_go(D_task_GC032A_init_pwdn); TTSS_Task_step(D_task_GC032A_init_pwdn); //提供032A系统频率 /// L0_MCLKO_init(D_ON); //L0_uart0_uc('n'); //PWDN引脚拉高,延时,拉低 L0_GC032A_standby();DL0_WDT();// 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('5');/// Lc_delay_ms(20); gRccUs03 = 0; // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// L2_task_go(D_task_GC032A_write_reg); //L2_task_go(0); L1_task_Tdelay(D_Tdelay_10ms); TTSS_Task_step(D_task_GC032A_write_reg); //设置摄像头参数 大约2s时间 if(0 != GC6133_init_reg_tbl[gRccUs03][0]) { //GC032a_L0_uart0_uc('k'); L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// gRccUs03 ++; }else { L2_task_go(D_task_GC032A_div); ///L1_task_Tdelay(D_Tdelay_500ms); L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa } TTSS_Task_step(D_task_GC032A_div); //L0_GC032A_write(0xfc,0x02); //复位?? L0_GC032A_write(0xf8,0x03);/// 恢复分频 L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// GC032a_L0_uart0_uc('6'); L2_task_go(D_task_GC032A_start_time); ///------------------------------------------------------cam init over ///------------------------------------------------------cam init over ///------------------------------------------------------cam init over ////等待 其他任务的启动后才工作 TTSS_Task_step(D_task_GC032A_start_time); D_cam_led_on();D_VSYNCS_open(); L1_GC032A_sleep(D_wakeup); GC032a_L0_uart0_uc('7'); /// s->one_line_ok = D_clear;D_ledb_OFF(); L2_task_go(D_task_GC032A_led); TTSS_Task_step(D_task_GC032A_led); ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ ///cam_led ```````````\_________________________________________________________/`````````````````\____ if(D_ready == s->vs_ok)///为了关灯 { s_task_GC032A.vs_ok = D_clear; D_cam_led_off(); GC032a_L0_uart0_uc('D'); L2_task_go(D_task_GC032A_wait); } TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- ///捕获到需要的行 if(D_ready == s->line_get) {DL0_WDT();// s->line_get = D_clear; /// 1.standby /// D_cam_led_off(); if(D_ON == s->line_en) { GC032a_L0_uart0_uc(0xfe); GC032a_L0_uart0_uc(0xfd); D_send_us(DR_pclk_n); //D_send_us(s->lines); L2_task_go(D_task_GC032A_send_line); }else { L2_task_go(D_task_GC032A_cal); } L1_task_Tdelay(D_Tdelay_10ms); } TTSS_Task_step(D_task_GC032A_send_line); if(D_uart0_free()) { L0_uart0_sendArraylong(s->buf,0,199); L2_task_go(D_task_GC032A_send2); } TTSS_Task_step(D_task_GC032A_send2); if(D_uart0_free()) { L0_uart0_sendArraylong(s->buf,200,399); L2_task_go(D_task_GC032A_send3); } TTSS_Task_step(D_task_GC032A_send3); if(D_uart0_free()) { L0_uart0_sendArraylong(s->buf,400,599); L2_task_go(D_task_GC032A_send4); } TTSS_Task_step(D_task_GC032A_send4); if(D_uart0_free()) { L0_uart0_sendArraylong(s->buf,600,639); L2_task_go(D_task_GC032A_send5); } TTSS_Task_step(D_task_GC032A_send5); if(D_uart0_free()) { // 'fe','fd','fd','fc' // GC032a_L0_uart0_uc(0xfd); // GC032a_L0_uart0_uc(0xfc); L2_task_go(D_task_GC032A_line1); //L2_task_go(D_task_GC032A_sleep); } TTSS_Task_step(D_task_GC032A_line1) for(gRccUs03 = 1;gRccUs03 < 568;gRccUs03 ++) { if((s->buf[gRccUs03 - 1] == 0)&& (s->buf[gRccUs03] == 1))//// _/``上升沿 { if(s->buf[gRccUs03 + 1] == 0) {//_/`\_ 尖峰需要过滤 }else {// ___/````上升沿开始高电平 s->up_point = gRccUs03; } }else if((s->buf[gRccUs03 - 1] == 1)&& (s->buf[gRccUs03] == 0))//// ``\_ 下降沿 { s->down_point = gRccUs03; }else { } } L2_task_go(D_task_GC032A_line2); TTSS_Task_step(D_task_GC032A_line2) D_send_us(s->up_point); D_send_us(s->down_point); D_send_us(s->down_point - s->up_point); // DR_pdata_n =0; // 'fe','fd','fd','fc' GC032a_L0_uart0_uc(0xfd); GC032a_L0_uart0_uc(0xfc); if(D_ON == s->cal_en) { L2_task_go(D_task_GC032A_cal); }else { L2_task_go(D_task_GC032A_sleep); } TTSS_Task_step(D_task_GC032A_cal) GC032a_L0_uart0_uc('8');//2.1ms L2_task_go(D_task_GC032A_sleep); TTSS_Task_step(D_task_GC032A_sample); ///20181007本想调试成 分段的led 不通过vs 关断 但是发现不好调整 ///采样的时候led打开照亮 D_cam_led_on();GC032a_L0_uart0_uc('`'); L2_task_go(D_task_GC032A_sleep); // L1_task_Tdelay(D_Tdelay_500ms+6); TTSS_Task_step(D_task_GC032A_sleep); /// 收到外部命令run后 决定进入睡眠状态 ,低功耗处理 ////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms /////1160-10 - 20 = 1130ms /// GC032a_L0_uart0_uc(0x88); if(D_run == s->run) { GC032a_L0_uart0_uc('9');//2.1ms L2_task_go(D_task_GC032A_led); L1_task_Tdelay(D_Tdelay_10ms); }else { D_cam_led_off(); L1_GC032A_sleep(D_sleep); L2_task_go(0); } ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TTSS_Task_end(); } #else ///// get void L2_task_GC032A_handle(struct _s_task_GC032A_ *s) { TTSS_Task_init(); //PWDN引脚拉低(0 -- 正常工作,1 -- 休眠) L0_GC032A_standby(); L0_uart0_uc('2'); 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(); // L0_uart0_uc('3'); 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(); L0_uart0_uc('4'); L2_task_go(D_task_GC032A_init_pwdn); TTSS_Task_step(D_task_GC032A_init_pwdn); //提供032A系统频率 /// L0_MCLKO_init(D_ON); //L0_uart0_uc('n'); //PWDN引脚拉高,延时,拉低 L0_GC032A_standby();DL0_WDT();// 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('5');/// Lc_delay_ms(20); gRccUs03 = 0; // L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// L2_task_go(D_task_GC032A_write_reg); //L2_task_go(0); L1_task_Tdelay(D_Tdelay_10ms); TTSS_Task_step(D_task_GC032A_write_reg); //设置摄像头参数 大约2s时间 if(0 != GC6133_init_reg_tbl[gRccUs03][0]) { //GC032a_L0_uart0_uc('k'); L0_GC032A_write(GC6133_init_reg_tbl[gRccUs03][0],GC6133_init_reg_tbl[gRccUs03][1]);/// gRccUs03 ++; }else { L2_task_go(D_task_GC032A_div); ///L1_task_Tdelay(D_Tdelay_500ms); L1_task_Tdelay(D_Tdelay_1s);///重要 这个时间很关键aaaaaa } TTSS_Task_step(D_task_GC032A_div); //L0_GC032A_write(0xfc,0x02); //复位?? L0_GC032A_write(0xf8,0x03);/// 恢复分频 L0_GC032A_write(0xfa,D_0xfa);DL0_WDT();// GC032a_L0_uart0_uc('6'); L2_task_go(D_task_GC032A_start_time); ///------------------------------------------------------cam init over ///------------------------------------------------------cam init over ///------------------------------------------------------cam init over ////等待 其他任务的启动后才工作 TTSS_Task_step(D_task_GC032A_start_time); D_cam_led_on();D_VSYNCS_open(); L1_GC032A_sleep(D_wakeup); GC032a_L0_uart0_uc('7'); /// s->one_line_ok = D_clear;D_ledb_OFF(); L2_task_go(D_task_GC032A_led); TTSS_Task_step(D_task_GC032A_led); ///vs /```24.8ms````\__________________________..1.16s...____________________________/````````\___________ ///cam_led ```````````\_________________________________________________________/`````````````````\____ if(D_ready == s->vs_ok)///为了关灯 { s_task_GC032A.vs_ok = D_clear; D_cam_led_off(); GC032a_L0_uart0_uc('_'); L2_task_go(D_task_GC032A_wait); } TTSS_Task_step(D_task_GC032A_wait);////>>>>>>>>>>>>>>>>>>>>>>>--- ///捕获到需要的行 if(1 == s->line_get) {DL0_WDT();// s->line_get = 0; L2_task_go(D_task_GC032A_cal);//// 单行计算 } TTSS_Task_step(D_task_GC032A_cal); ///计算一个 line的数据 ///D_txd4_wakeup(); ///GC032a_L0_uart0_uc(0xd); GC032a_L0_uart0_uc(0xa);// s->buf[D_pclk_per_hs + 1] =s->buf[30]; ///GC032a_L0_uart0_uchex(s->buf[D_pclk_per_hs + 1]); gRccUs04 = 0; for(gRccUs03 = 0;gRccUs03 < D_pclk_per_hs_2;gRccUs03 ++) { //s->buf[gRccUs03] = 0x10; //debug 开关 显示当前收到的数据 //L0_uart0_uc(s->buf[gRccUs03]); if(s->buf[gRccUs03] >= 0x10) { s->buf[gRccUs03] -= 0x10; } s->buf[gRccUs03] >>= 1; gRccUs04 += s->buf[gRccUs03]; } gRccUs04 >>= 2;//gRccUs04 >>= 4; TS_paer_value.r123.paperNum = gRccUs04; ///GC032a_L0_uart0_uchex((unsigned char)(gRccUs04>>8)); s_task_GC032A.cal_ok = D_ready; L2_task_go(D_task_GC032A_sample);/// 发送完成延时后开始采样, L1_task_Tdelay(D_Tdelay_300ms); //700=1a 600=1e 500 21 400 25 300 26 TTSS_Task_step(D_task_GC032A_sample); ///20181007本想调试成 分段的led 不通过vs 关断 但是发现不好调整 ///采样的时候led打开照亮 D_cam_led_on();GC032a_L0_uart0_uc('`'); L2_task_go(D_task_GC032A_sleep); // L1_task_Tdelay(D_Tdelay_500ms+6); TTSS_Task_step(D_task_GC032A_sleep); /// 收到外部命令run后 决定进入睡眠状态 ,低功耗处理 ////CAL 10MS 433 10MS 总共20ms / 1160ms/vs 取行数消耗10ms /////1160-10 - 20 = 1130ms /// GC032a_L0_uart0_uc(0x88); if(D_run == s->run) { GC032a_L0_uart0_uc('r');//2.1ms L2_task_go(D_task_GC032A_led); }else { D_cam_led_off(); L1_GC032A_sleep(D_sleep); L2_task_go(0); } ///<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< TTSS_Task_end(); } #endif void L1_GC032A_sleep(unsigned char onf) {///FE 15 Fd 33 44//standby ///FE 05 Fd 33 44//wakeup if(D_sleep == onf) { GC032a_L0_uart0_uc('L'); /// 进入standby: L0_GC032A_write(0xfc,0x03); L0_GC032A_write(0xf7,0x00); L0_GC032A_write(0xf9,0xcf); L0_GC032A_write(0xf3,0x00); Lc_delay_nop(30); Lc_delay_nop(30); /// D_cam_AVDD_off(); // D_cam_led_off(); }else { GC032a_L0_uart0_uc('X'); /// 退出standby: L0_GC032A_write(0xfc,0x02); L0_GC032A_write(0xf7,0x01); L0_GC032A_write(0xf9,0xce); L0_GC032A_write(0xf3,0xff); /// D_cam_led_on(); } } #if 10 void L3_GC032A_fun(U8 *pPara) { } #else //// fe 01 reg data 0cx /// Ac 01 02 03 ocr ---bsp_debug.c /// p.cmd p.R2 p.R3 p.ocr ///Ac 00 03 01 00/// ACC_X[13:6] void L3_GC032A_fun(U8 *pPara) { U8 i,val[2]; // unsigned short j; TS_P_debug *p = pPara; switch(p->cmd) { case 0x01: ///AE 01 FE 33 44 // L0_GC032A_read(0xFE,&i,1); 读取当前页面 ///AE 01 F0 33 44 // L0_GC032A_read(0xF0,&i,1); 读取id i= 0x23 L0_GC032A_read(p->R2,&i,1); L0_uart0_uc(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); L0_uart0_uc(p->R2); L0_uart0_uc(p->R3); break; //启动摄像头进行拍照; case 0x03:/// sysreg FE 03 03 04 05 //设置是否发送一line数据(数据分为一帧=640Line = 640line*480pclk ) ///AE 03 01 33 44 //s_task_GC032A.line_onf = 01 ///AE 03 00 33 44 //s_task_GC032A.line_onf = 00 s_task_GC032A.line_onf = p->R2; L0_uart0_uc(0x30|s_task_GC032A.line_onf); break; case 0x05: ///AE 05 01 33 44 //进入 standby ///AE 05 00 33 44 //退出 standby L1_GC032A_sleep(p->R2); L0_uart0_uc(0x30|s_task_GC032A.line_onf); break; case 6:///AE 06 22 33 44 D_cam_led_off(); break; case 7:///AE 07 22 33 44 D_cam_led_on(); break; /******************* case 0x00: L0_GC032A_read(p->R2,val,p->R3); L0_uart0_uc(p->cmd); L0_uart0_uc(p->R2); L0_uart0_uc(p->R3); L0_uart0_uc('G'); for(i = 0;i < p->R3;i++) { L0_uart0_uc(val[i]); } break; //读取摄像头配置参数 case 0x35: L0_GC032A_standby();// led 17.1-16.9ma standby 6.2ma L0_uart0_uc(0x31); break; case 0x36: /// 退出standby: L0_GC032A_work(); L0_uart0_uc(0x30); break; ****************************/ default: break; }; } #endif #if 0 FE 02 88 15 10 13 11 15 11 16 12 14 11 15 12 16 12 16 14 17 13 17 13 16 13 16 12 16 13 16 12 18 14 15 12 15 13 15 12 16 14 15 13 15 12 15 13 16 14 18 14 17 13 16 10 16 15 1A 15 22 2D 3A 3F 47 41 53 5E 63 65 69 6C 6F 71 7A 72 73 75 7A 7B 7E 7D 82 85 8B 8F 90 8F 93 96 9A 9D 9A 97 98 96 99 9A 9B 9A 9C 9E 9F 9F 9D 9A 9A 99 9C 9B 9B 9A 9A 9B 9C 9D 9F 9F A0 A1 A2 A3 A2 A2 A3 A1 A3 A4 A4 A4 A4 A3 A3 A2 A2 A3 A5 A6 A7 A8 A7 A6 A6 A5 A6 A6 A8 AA AA AA AA AA AB AB AB AC AC AB AC AC AD AF AE AD AD AC AC AB AC AC AD AD AE AE AE AF AD AE AE AD AE AE AE AE AE AF AF AF AF AF AF B0 B1 B1 B1 B2 B1 B1 B1 B1 B1 B1 B2 B2 B2 B3 B2 B2 B2 B3 B3 B3 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B4 B5 B4 B5 B6 B5 B5 B4 B4 B4 B3 B4 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B5 B6 B6 B5 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B6 B7 B6 B6 B7 B6 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B8 B7 B7 B8 B8 B7 B8 B8 B7 B8 B9 B8 B8 B8 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B7 B8 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B7 B7 B7 B7 B8 B8 B9 B8 B9 B8 B8 B8 B8 B7 B7 B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B9 B8 B8 B8 B8 B9 BA B8 B8 B8 B7 B8 B8 B8 B8 B8 B8 B8 B9 B8 B7 B7 B7 B7 B7 B7 B6 B6 B7 B7 B7 B7 B7 B7 B7 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B9 B8 B9 B8 B8 B9 BA B9 B8 B8 B8 B8 B9 B8 B9 B8 B8 B8 B8 B8 B9 B9 B8 B9 B9 B9 B9 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B8 B9 B9 B8 B9 B9 B9 B9 B9 B9 BA B9 B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B8 B9 B9 B9 B9 B9 B9 B9 B9 B9 BB B9 B9 B9 B9 B9 B9 B9 BA BA BB B9 B8 B8 B8 B8 B8 B9 B9 BA BA B9 BA B9 B9 B9 B9 B9 B8 B8 B8 B8 B9 B9 B9 B9 BA BA BB B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 B9 BA B9 B9 B9 B9 BA BA BB BB BA BB BA B9 B9 B9 B9 B9 B9 B9 BA BB BA BA BA BA B9 B8 B8 B8 B8 B8 B9 B9 BA BB BB BB BA BA B9 B9 B9 B9 B9 BA fd fc #endif