Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: common_task.cpp
- Revision:
- 0:e7352f4f3dcb
- Child:
- 1:5060c8ea0ccd
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/common_task.cpp Thu Jun 18 12:36:05 2020 +0000 @@ -0,0 +1,349 @@ +#include "mbed.h" +#include "register_address.h" +#include "common_task.h" +#include "EthernetInterface.h" +#include "TCPServer.h" +#include "TCPSocket.h" + + +extern Serial pc; +extern DigitalOut led3; +extern DigitalOut led2; +extern SPI spi; // mosi, miso, sclk +extern DigitalOut SSN; + +extern InterruptIn button_capture; +extern InterruptIn irq_cis; + +extern DigitalOut RSTN; +extern DigitalOut SLEEPN; +extern DigitalOut CAPTURE; + +extern uint8_t DCMI_8b_mode; + +extern EthernetInterface eth; +extern TCPSocket cs; //com socket +extern char ServerIP[17]; +extern int portnumber; +extern int portnumber_com; + +char toprint[64]; + +int myprint(const char* mystring ){ + + int byte_sent=-1; + int status=0; + + pc.printf("%s",mystring); + byte_sent=cs.send(mystring, strlen(mystring)); + return byte_sent; + +} + + +void usage(void){ + + myprint("Usage\n\r"); + myprint("----------------------------------------\n\r"); + myprint("H -> help\n\r"); + myprint("--------------SPI--------------------------\n\r"); + myprint("spi -> test SPI\n\r"); + myprint("G -> get register configurations\n\r"); + myprint("--------------IMAGER--------------------------\n\r"); + myprint("F -> take frame 8b\n\r"); + myprint("FQ -> take frame ion QQVGA mode 8b\n\r"); + myprint("sp -> suspend frame\n\r"); + myprint("st -> stop frame\n\r"); + myprint("r -> resume frame\n\r"); + myprint("s -> send frame tp teraterm\n\r"); + myprint("e -> set exposure time SPI\n\r"); + myprint("m -> set mode via SPI\n\r"); + myprint("AG -> set analog gain SPI\n\r"); + myprint("A -> test all analog gain configurations SPI\n\r"); + myprint("CC -> set cclk value SPI\n\r"); + myprint("C -> auto calibration of cclk SPI\n\r"); + myprint("IO -> set IO SR and driving strength SPI\n\r"); + myprint("pclk -> set PCLK mode\n\r"); + myprint("pclkd -> set PCLK delay\n\r"); + myprint("md -> set motion detection cycle time delay\n\r"); + myprint("oen -> (dis)enable oen\n\r"); + myprint("pbp -> (dis)enable pbp\n\r"); + myprint("sleepn -> (dis)enable sleepn\n\r"); + + myprint("------------- ethernet-----------------------\n\r"); + myprint("si -> set ip server\n\r"); + myprint("gi -> get ip server\n\r"); + myprint("------------- DCMI-----------------------\n\r"); + myprint("gs -> get status DCMI\n\r"); + myprint("ge -> get error DCMI\n\r"); + myprint("gsd -> get status DMA\n\r"); + myprint("ged -> get error DMA\n\r"); + myprint("gl -> get nb line received on DCMI\n\r"); + myprint("gf -> get nb frame received on DCMI\n\r"); + myprint("------------- SCVR-----------------------\n\r"); + myprint("vdda -> set vdda register\n\r"); + myprint("vddd -> set vddd register\n\r"); + myprint("pm -> set power mode register\n\r"); + myprint("pma -> set pwd vddla low medium high register\n\r"); + myprint("pmd -> set pwd vddld low medium high register\n\r"); + myprint("----------------------------------------\n\r\n\r"); + +} + + +void CAPTURE_fall(){ + CAPTURE=0; +} + +void CAPTURE_rise(){ + CAPTURE=1; +} + +void TASK_INIT(){ + + // Enable reset + RSTN=0; //0 => reset OK + wait_us(5000); + + + //DEFAULT SIGNAL OUTPUT + // Output enable + + SLEEPN=0; //1 => active + CAPTURE=0; //0 => no capture + wait_us(5000); + + + // link interrupt + // capture interrupt + button_capture.enable_irq(); + button_capture.fall(&CAPTURE_fall); + button_capture.rise(&CAPTURE_rise); + + // Disable reset + RSTN=1; + wait_us(5000); + + + + +} + +void TASK_RSTN(){ + RSTN=0; + wait_us(2000); + RSTN=1; + wait_us(1000); + +} + + +void TASK_SPI_WRITE(int adr, int data){ + + //sprintf(toprint,"writing addr %d data %d\n\r",adr,data); + //sprintf(toprint,"sending addr %02X data %02X\n\r",adr,data); + //myprint(toprint); + + int packet = (adr<<8 | data); + SSN=0; + + spi.write(packet); + + wait_us(50); + SSN=1; + wait_us(100); + +} + +int TASK_SPI_READ(int adr){ + + //sprintf(toprint,"reading addr %d \n\r",adr); + //sprintf(toprint,"reading addr %02X \n\r",adr); + //myprint(toprint); + + int rx_buffer=0; + int packet = (adr|0x80)<<8; + + SSN=0; + rx_buffer=spi.write(packet); //--ok le spi repond mais je sais pas choper la data. + wait_us(50); + SSN=1; + wait_us(100); + + //sprintf(toprint,"read at add %d -> data %d \n\r",adr,rx_buffer); + //myprint(toprint); + return (int) rx_buffer; +} + +void TASK_TEST_SPI(){ + + uint8_t a; + + + myprint("**************\r\n"); + myprint("PING SPI\r\n"); + myprint("**************\r\n"); + + TASK_SPI_WRITE(test_add,0x55); + a=TASK_SPI_READ(test_add); + sprintf(toprint,"write 0x%02x at 0x%02x. read 0x%02x at 0x%02x\r\n",0x55,test_add,a,test_add); + myprint(toprint); + + TASK_SPI_WRITE(test_add,0xAA); + a=TASK_SPI_READ(test_add); + sprintf(toprint,"write 0x%02x at 0x%02x. read 0x%02x at 0x%02x\r\n",0xAA,test_add,a,test_add); + myprint(toprint); + + TASK_SPI_WRITE(test_add,0xFF); + a=TASK_SPI_READ(test_add); + sprintf(toprint,"write 0x%02x at 0x%02x. read 0x%02x at 0x%02x\r\n",0xFF,test_add,a,test_add); + myprint(toprint); + + TASK_SPI_WRITE(test_add,0x00); + a=TASK_SPI_READ(test_add); + sprintf(toprint,"write 0x%02x at 0x%02x. read 0x%02x at 0x%02x\r\n",0x00,test_add,a,test_add); + myprint(toprint); +} + + + +void TASK_ANALOG_CALIB(){ + + uint8_t a,b,c,e; + int d; + float average; + + myprint("**************\r\n"); + myprint("ANALOG CALIB\r\n"); + myprint("**************\r\n"); + + e=TASK_SPI_READ(analog_gain_add); + + TASK_SPI_WRITE(mode_add,0x02); //mode SO+calib + myprint("mode SO+calib\r\n"); + + for (int i=0;i<16;i++){ + + TASK_SPI_WRITE(analog_gain_add,i); + + TASK_SPI_WRITE(capture_add,0xff); //capture on + thread_sleep_for(1); + TASK_SPI_WRITE(capture_add,0x00); //capture off + thread_sleep_for(200); + + + a=TASK_SPI_READ(CAL_RAMP_COUNT_0_add); //read value LSB + b=TASK_SPI_READ(CAL_RAMP_COUNT_1_add); + c=TASK_SPI_READ(CAL_RAMP_COUNT_2_add); //MSB + + d=(int) c*256*256+b*256+a; + average=(float) d/480; + + sprintf(toprint,"ramp cal: %i -> %i\taverage %f\r\n",i,d,average); + myprint(toprint); + + wait_us(5000); + } + TASK_SPI_WRITE(mode_add,0x03); //mode DRS+calib + myprint("\r\nmode DRS+calib\r\n"); + + for (int i=0;i<16;i++){ + + TASK_SPI_WRITE(analog_gain_add,i); + + TASK_SPI_WRITE(capture_add,0xff); //capture on + wait_us(1000); + TASK_SPI_WRITE(capture_add,0x00); //capture off + wait_us(200000); + + + a=TASK_SPI_READ(CAL_RAMP_COUNT_0_add); //read value LSB + b=TASK_SPI_READ(CAL_RAMP_COUNT_1_add); + c=TASK_SPI_READ(CAL_RAMP_COUNT_2_add); //MSB + + d=(int) c*256*256+b*256+a; + average=(float) d/480; + + + sprintf(toprint,"ramp cal: %i -> %i\taverage %f\r\n",i,d,average); + myprint(toprint); + //wait_ms(50); + } + + TASK_SPI_WRITE(0x03,0x01); //mode drs + TASK_SPI_WRITE(analog_gain_add,e); + +} + + + + +void TASK_auto_ccal(){ + + uint8_t a,b; + uint8_t cclk=10; + uint8_t upper=255; + uint8_t lower=0; + int res; + int iter=0; + + int lb=1020; + int ub=1024; + + myprint("**************\r\n"); + myprint("AUTO CCLK CALIB\r\n"); + myprint("**************\r\n"); + TASK_SPI_WRITE(mode_add,0x05); //mode cclk calib + + + + TASK_SPI_WRITE(cclk_cal_add,cclk); //default value of cclk reg + TASK_SPI_WRITE(capture_add,0xff); //capture on + wait_us(100); + TASK_SPI_WRITE(capture_add,0x00); //capture off + wait_us(100); + a=TASK_SPI_READ(CAL_CLK_BUFF_0_add); //read value LSB + b=TASK_SPI_READ(CAL_CLK_BUFF_1_add); //MSB + res=(int) b*256+a; + + while( (res <lb || res > ub) && iter<8){ + + TASK_SPI_WRITE(cclk_cal_add,cclk); //default value of cclk reg + a=TASK_SPI_READ(cclk_cal_add); + //myprint("write 0x%02x at 0x%02x. read 0x%02x at 0x%02x\r\n",cclk,cclk_cal_add,a,cclk_cal_add); + + TASK_SPI_WRITE(capture_add,0xff); //capture on + wait_us(1000); + TASK_SPI_WRITE(capture_add,0x00); //capture off + wait_us(1000); + a=TASK_SPI_READ(CAL_CLK_BUFF_0_add); //read value LSB + b=TASK_SPI_READ(CAL_CLK_BUFF_1_add); //MSB + res=(int) b*256+ a; + + //myprint("cclk cal: %i -> cclk %i\r\n",cclk, b*256+a); + sprintf(toprint,"cclk cal: %i -> cclk %i\r\n",cclk,res); + myprint(toprint); + + //updated stuff + if(res<lb){ + //myprint("too low: %i %i %i %i",res,cclk,lower,upper); + lower=cclk; + cclk=(lower+upper)/2; + //myprint(" -> %i %i %i\r\n\r\n",cclk,lower,upper); + } else if(res>ub){ + //myprint("too high: %i %i %i %i",res,cclk,lower,upper); + upper=cclk; + cclk=(lower+upper)/2; + //myprint(" -> %i %i %i \r\n\r\n",cclk,lower,upper); + } else { + myprint("ok !!\r\n"); + } + iter++; + } + + sprintf(toprint,"cclk cal: %i -> cclk %i\r\n",cclk,res); + myprint(toprint); + TASK_SPI_WRITE(0x03,0x01); //mode drs + +} +