//////////////////////////////////////////////////////////////////////////// ///@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