firmware for the SOLID Slow Control Module for SM1

Dependencies:   S_SCTRL_SMlib adc_ad9249 mbed sscm_comm AD5384 SWSPI T_adt7320

Committer:
wbeaumont
Date:
Wed Sep 24 10:31:28 2014 +0000
Revision:
0:dcd70d1b89b1
Child:
1:f792767b2223
Initial firmware version SOLID Slow Contrl Module for SM1 ; "working " for ADC communication, not tested with DEIMOS board

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wbeaumont 0:dcd70d1b89b1 1 #include "mbed.h"
wbeaumont 0:dcd70d1b89b1 2
wbeaumont 0:dcd70d1b89b1 3
wbeaumont 0:dcd70d1b89b1 4 #include "SWSPI_BI.h"
wbeaumont 0:dcd70d1b89b1 5
wbeaumont 0:dcd70d1b89b1 6 #include "AD9249.h"
wbeaumont 0:dcd70d1b89b1 7 #include "solid_sctrl_def.h"
wbeaumont 0:dcd70d1b89b1 8 #include "S_SCTRL_SM1_PinDef.h"
wbeaumont 0:dcd70d1b89b1 9 #include "S_SCTRL_SM1_hwfunct.h"
wbeaumont 0:dcd70d1b89b1 10
wbeaumont 0:dcd70d1b89b1 11 #define VERSION "1.07"
wbeaumont 0:dcd70d1b89b1 12
wbeaumont 0:dcd70d1b89b1 13 #define DEBUGPF(x) printf((x));
wbeaumont 0:dcd70d1b89b1 14
wbeaumont 0:dcd70d1b89b1 15
wbeaumont 0:dcd70d1b89b1 16 #define MAXCMDLLENGTH 256
wbeaumont 0:dcd70d1b89b1 17
wbeaumont 0:dcd70d1b89b1 18 #include "sscm_comm.h"
wbeaumont 0:dcd70d1b89b1 19 using namespace sscm_comm ;
wbeaumont 0:dcd70d1b89b1 20
wbeaumont 0:dcd70d1b89b1 21
wbeaumont 0:dcd70d1b89b1 22
wbeaumont 0:dcd70d1b89b1 23 Serial pc(USBTX,USBRX);
wbeaumont 0:dcd70d1b89b1 24
wbeaumont 0:dcd70d1b89b1 25
wbeaumont 0:dcd70d1b89b1 26 char cmdin[MAXCMDLLENGTH];
wbeaumont 0:dcd70d1b89b1 27 u8 cmdready;
wbeaumont 0:dcd70d1b89b1 28 bool cmdstart=false;
wbeaumont 0:dcd70d1b89b1 29
wbeaumont 0:dcd70d1b89b1 30
wbeaumont 0:dcd70d1b89b1 31
wbeaumont 0:dcd70d1b89b1 32
wbeaumont 0:dcd70d1b89b1 33 void pc_callback() {
wbeaumont 0:dcd70d1b89b1 34 // Note: you need to actually read from the serial to clear the RX interrupt
wbeaumont 0:dcd70d1b89b1 35 static unsigned char cnt;
wbeaumont 0:dcd70d1b89b1 36
wbeaumont 0:dcd70d1b89b1 37 char c;
wbeaumont 0:dcd70d1b89b1 38 c=pc.getc();
wbeaumont 0:dcd70d1b89b1 39 if( c== CMDSTART && !cmdready ) { cnt=0; cmdstart=true; cmdready=false; }
wbeaumont 0:dcd70d1b89b1 40 if ( cmdstart) {
wbeaumont 0:dcd70d1b89b1 41 cmdin[cnt]=c; cnt++;
wbeaumont 0:dcd70d1b89b1 42 if (c== CMDSTOP ) { cmdready=true;}
wbeaumont 0:dcd70d1b89b1 43 }
wbeaumont 0:dcd70d1b89b1 44
wbeaumont 0:dcd70d1b89b1 45
wbeaumont 0:dcd70d1b89b1 46
wbeaumont 0:dcd70d1b89b1 47 //printf("%c:",c );
wbeaumont 0:dcd70d1b89b1 48 }
wbeaumont 0:dcd70d1b89b1 49
wbeaumont 0:dcd70d1b89b1 50
wbeaumont 0:dcd70d1b89b1 51
wbeaumont 0:dcd70d1b89b1 52
wbeaumont 0:dcd70d1b89b1 53 int main() {
wbeaumont 0:dcd70d1b89b1 54 pc.attach(pc_callback);
wbeaumont 0:dcd70d1b89b1 55 ssc_cmd cmd;
wbeaumont 0:dcd70d1b89b1 56 int i = 0;
wbeaumont 0:dcd70d1b89b1 57 HWlines hwl ;
wbeaumont 0:dcd70d1b89b1 58 assignports( &hwl );
wbeaumont 0:dcd70d1b89b1 59 setdefault(hwl );
wbeaumont 0:dcd70d1b89b1 60
wbeaumont 0:dcd70d1b89b1 61
wbeaumont 0:dcd70d1b89b1 62 SWSPI_BI spi_adc(hwl.msio[0],hwl.direction[0],hwl.stio_mo[0] ,hwl.sclk[0]); // msio, dir , sclk
wbeaumont 0:dcd70d1b89b1 63 SWSPI_BI spi_adc2(hwl.msio[1],hwl.direction[1],hwl.stio_mo[1],hwl.sclk[1]); // msio, dir , sclk
wbeaumont 0:dcd70d1b89b1 64 // initalize ADC classes
wbeaumont 0:dcd70d1b89b1 65 AD9249 adc[2][2]={AD9249( &spi_adc,hwl.csb1[0]), AD9249( &spi_adc,hwl.csb2[0]),
wbeaumont 0:dcd70d1b89b1 66 AD9249( &spi_adc2,hwl.csb1[1]), AD9249 ( &spi_adc2,hwl.csb2[1])};
wbeaumont 0:dcd70d1b89b1 67
wbeaumont 0:dcd70d1b89b1 68
wbeaumont 0:dcd70d1b89b1 69
wbeaumont 0:dcd70d1b89b1 70
wbeaumont 0:dcd70d1b89b1 71
wbeaumont 0:dcd70d1b89b1 72
wbeaumont 0:dcd70d1b89b1 73
wbeaumont 0:dcd70d1b89b1 74 pc.printf("\nSOLID SLOW CONTROL for SM1 version %s %s %s \n\r",VERSION,__DATE__,__TIME__ );
wbeaumont 0:dcd70d1b89b1 75 cmdready=false;
wbeaumont 0:dcd70d1b89b1 76 while (1) {
wbeaumont 0:dcd70d1b89b1 77 wait(0.5);
wbeaumont 0:dcd70d1b89b1 78 if (cmdready) {
wbeaumont 0:dcd70d1b89b1 79 cmdready=false;
wbeaumont 0:dcd70d1b89b1 80 int decresult=decode_cmd(cmdin,&cmd);
wbeaumont 0:dcd70d1b89b1 81 printf("decode result = %d \n\r" ,decresult);
wbeaumont 0:dcd70d1b89b1 82 if( decresult){ continue; }
wbeaumont 0:dcd70d1b89b1 83 ;
wbeaumont 0:dcd70d1b89b1 84 char cmdoutstr[100];
wbeaumont 0:dcd70d1b89b1 85
wbeaumont 0:dcd70d1b89b1 86 u8 do8; // dataout
wbeaumont 0:dcd70d1b89b1 87 u16 do16;
wbeaumont 0:dcd70d1b89b1 88 cmd.dataout=0xFFFF; // use it for the moment as error handling ,
wbeaumont 0:dcd70d1b89b1 89 if ( cmd.dev == DAC ) {} ;
wbeaumont 0:dcd70d1b89b1 90 if (cmd.dev == ADC) {
wbeaumont 0:dcd70d1b89b1 91 pc.printf("ADC cmd = %s \n\r",cmd.cmd);
wbeaumont 0:dcd70d1b89b1 92 pc.printf("check now ranges %d %d \n\r",cmd.con, cmd.devnr);
wbeaumont 0:dcd70d1b89b1 93 if (!strcmp( cmd.cmd, "spa1")) { adc[cmd.con-1][cmd.devnr-1].setPattern1(cmd.datain);cmd.dataout=cmd.datain;}
wbeaumont 0:dcd70d1b89b1 94 if (!strcmp( cmd.cmd, "spa2")) { adc[cmd.con-1][cmd.devnr-1].setPattern2(cmd.datain);cmd.dataout=cmd.datain;}
wbeaumont 0:dcd70d1b89b1 95 if (!strcmp( cmd.cmd, "rpa1")) { adc[cmd.con-1][cmd.devnr-1].readPattern1(do16 ); cmd.dataout=(u32)do16; }
wbeaumont 0:dcd70d1b89b1 96 if (!strcmp( cmd.cmd, "rr08")) {adc[cmd.con-1][cmd.devnr-1].readReg8(cmd.ch,do8 ); cmd.dataout=(u32)do8; }
wbeaumont 0:dcd70d1b89b1 97 if (!strcmp( cmd.cmd, "rr16")) {adc[cmd.con-1][cmd.devnr-1].readReg16(cmd.ch,do16 ); cmd.dataout=(u32)do16; }
wbeaumont 0:dcd70d1b89b1 98 if (!strcmp( cmd.cmd, "sr08")) { adc[cmd.con-1][cmd.devnr-1].setReg8(cmd.ch, (u8)cmd.dataout ); cmd.dataout=cmd.datain; }
wbeaumont 0:dcd70d1b89b1 99 if (!strcmp( cmd.cmd, "sr16")) { adc[cmd.con-1][cmd.devnr-1].setReg16(cmd.ch, (u16)cmd.dataout ); cmd.dataout=cmd.datain; }
wbeaumont 0:dcd70d1b89b1 100 } // end if ADC
wbeaumont 0:dcd70d1b89b1 101 encode_cmd ( cmdoutstr, &cmd);
wbeaumont 0:dcd70d1b89b1 102 pc.printf( "%s", cmdoutstr);
wbeaumont 0:dcd70d1b89b1 103 }//end if cmdready
wbeaumont 0:dcd70d1b89b1 104 else {
wbeaumont 0:dcd70d1b89b1 105 printf( "%s\n\r",cmdin);
wbeaumont 0:dcd70d1b89b1 106 }
wbeaumont 0:dcd70d1b89b1 107 }// end while
wbeaumont 0:dcd70d1b89b1 108
wbeaumont 0:dcd70d1b89b1 109 }