C Library for mbedWSE project based single board computer for hardware peripherals

Fork of mbedWSEsbc by Joseph Bradshaw

Revision:
0:dbd8b5c35d0f
Child:
1:85cd6d500385
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbedWSEsbc.h	Fri Sep 12 16:10:10 2014 +0000
@@ -0,0 +1,368 @@
+// C Library for the WSE-PROJ-SBC
+// J Bradshaw
+// 20140912
+
+//=============================================================================
+// Four commands for the Instruction Register (B7,B6) - LS7366
+//=============================================================================
+#define CLR     0x00    //Clear Instruction
+#define RD      0x01    //Read Instruction
+#define WR      0x02    //Write Instruction
+#define LOAD    0x03    //Load Instruction
+
+//=============================================================================
+// Register to Select from the Instruction Register (B5,B4,B3) - LS7366
+//=============================================================================
+#define NONE        0x00    //No Register Selected
+#define MDR0        0x01    //Mode Register 0
+#define MDR1        0x02    //Mode Register 1
+#define DTR         0x03    //Data Transfer Register
+#define CNTR        0x04    //Software Configurable Counter Register
+#define OTR         0x05    //Output Transfer Register
+#define STR         0x06    //Status Register
+#define NONE_REG    0x07    //No Register Selected
+
+// Set-up hardwired IO
+SPI spi_max1270(p5, p6, p7);
+SPI spi(p5, p6, p7);
+DigitalOut max1270_cs(p8);  //MAX1270 ADC CS
+DigitalOut max522_cs(p11);  //MAX522 DAC CS
+
+DigitalOut ls7166_cs1(p19);    //CS for LS7366
+DigitalOut ls7166_cs2(p20);    //CS for LS7366
+
+DigitalOut mot1_ph1(p21);
+DigitalOut mot1_ph2(p22);
+PwmOut mot_en1(p23);
+
+DigitalOut mot2_ph1(p24);
+DigitalOut mot2_ph2(p25);
+PwmOut mot_en2(p26);
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);
+
+Serial pc(USBTX, USBRX); // tx, rx for serial USB interface to pc
+Serial xbee(p13, p14); // tx, rx for Xbee
+Timer t; // create timer instance
+
+// ------ Prototypes -----------
+int read_max1270(int chan, int range, int bipol);
+float read_max1270_volts(int chan, int range, int bipol);
+void mot_control(int drv_num, float dc);
+void LS7366_cmd(int inst,  int reg);
+long LS7366_read_counter(int chan_num);
+void LS7366_quad_mode_x4(int chan_num);
+void LS7366_reset_counter(int chan_num);
+void LS7366_write_DTR(int chan_num,long enc_value);
+void write_max522(int chan, float volts);
+
+//---- Function Listing -------------------------------
+int read_max1270(int chan, int range, int bipol){
+    int cword=0x80;     //set the start bit
+    
+    spi_max1270.frequency(10000000);
+    spi_max1270.format(8, 0);   // 8 data bits, CPOL0, and CPHA0 (datasheet Digital Interface)
+        
+    cword |= (chan << 4);   //shift channel
+    cword |= (range << 3);
+    cword |= (bipol << 2);
+            
+    max1270_cs = 0;
+           
+    spi_max1270.write(cword);
+    wait_us(15);    //15us
+    spi_max1270.format(12, 3);
+    
+    int result = spi_max1270.write(0);
+    
+    max1270_cs = 1;
+    spi_max1270.format(8, 0);
+    return result;
+}
+
+float read_max1270_volts(int chan, int range, int bipol){
+    float rangevolts=0.0;
+    float volts=0.0;
+    int adc_res;
+
+    //read the ADC converter
+    adc_res = read_max1270(chan, range, bipol) & 0xFFF;
+        
+   //Determine the voltage range
+   if(range)  //RNG bit 
+     rangevolts=10.0;
+   else
+     rangevolts=5.0;
+             
+   //bi-polar input range
+   if(bipol){ //BIP is set, input is +/-
+     if(adc_res < 0x800){ //if result was positive
+      volts = ((float)adc_res/0x7FF) * rangevolts;      
+     }       
+     else{  //result was negative
+      volts = -(-((float)adc_res/0x7FF) * rangevolts) - (rangevolts * 2.0); 
+     }
+   }
+   else{  //input is positive polarity only
+      volts = ((float)adc_res/0xFFF) * rangevolts;   
+   }
+   
+   return volts;     
+}
+    
+//Motor control routine for PWM on 5 pin motor driver header
+// drv_num is 1 or 2 (defaults to 1, anything but 2)
+// dc is signed duty cycle (+/-1.0)
+
+void mot_control(int drv_num, float dc){        
+    if(dc>1.0)
+        dc=1.0;
+    if(dc<-1.0)
+        dc=-1.0;
+    
+    if(drv_num != 2){           
+        if(dc > 0.0){
+            mot1_ph2 = 0;
+            mot1_ph1 = 1;
+            mot_en1 = dc;
+        }
+        else if(dc < -0.0){
+            mot1_ph1 = 0;
+            mot1_ph2 = 1;
+            mot_en1 = abs(dc);
+        }
+        else{
+            mot1_ph1 = 0;
+            mot1_ph2 = 0;
+            mot_en1 = 0.0;
+        }
+    }                
+    else{
+        if(dc > 0.0){
+            mot2_ph2 = 0;
+            mot2_ph1 = 1;
+            mot_en2 = dc;
+        }
+        else if(dc < -0.0){
+            mot2_ph1 = 0;
+            mot2_ph2 = 1;
+            mot_en2 = abs(dc);
+        }
+        else{
+            mot2_ph1 = 0;
+            mot2_ph2 = 0;
+            mot_en2 = 0.0;
+        }
+    }                   
+}
+
+//----- LS7366 Encoder/Counter Routines --------------------
+void LS7366_cmd(int inst,  int reg){
+    char cmd;
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    cmd = (inst << 6) | (reg << 3);
+//    printf("\r\ncmd=0X%2X", cmd);
+    spi.write(cmd);
+}
+
+long LS7366_read_counter(int chan_num){
+    union bytes{
+        char byte_enc[4];
+        long long_enc;
+    }counter;
+    
+    counter.long_enc = 0;
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 0;
+        wait_us(1);
+        LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
+        ls7166_cs1 = 1;
+        wait_us(1);
+        ls7166_cs1 = 0;
+    }
+    else{
+        ls7166_cs2 = 0;    
+        wait_us(1);
+        LS7366_cmd(LOAD,OTR);//cmd = 0xe8, LOAD to OTR
+        ls7166_cs2 = 1;
+        wait_us(1);
+        
+        ls7166_cs2 = 0;        
+    }
+    wait_us(1);
+    LS7366_cmd(RD,CNTR);  //cmd = 0x60, READ from CNTR
+    counter.byte_enc[3] = spi.write(0x00);
+    counter.byte_enc[2] = spi.write(0x00);
+    counter.byte_enc[1] = spi.write(0x00);
+    counter.byte_enc[0] = spi.write(0x00);
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs2 = 1;    
+    }        
+    
+    return counter.long_enc;  //return count
+}
+
+void LS7366_quad_mode_x4(int chan_num){
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 0;    
+    }            
+    else{
+        ls7166_cs2 = 0;    
+    }    
+    wait_us(1);
+    LS7366_cmd(WR,MDR0);// Write to the MDR0 register
+    spi.write(0x03); // X4 quadrature count mode
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs2 = 1;    
+    }
+}
+
+void LS7366_reset_counter(int chan_num){
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 0;    
+    }
+    else{
+        ls7166_cs2 = 0;    
+    }    
+    wait_us(1);
+    LS7366_cmd(CLR,CNTR);//Clear the counter register
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs2 = 1;    
+    }
+    wait_us(1);
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 0;    
+    }            
+    else{
+        ls7166_cs2 = 0;    
+    }        
+    wait_us(1);
+    LS7366_cmd(LOAD,CNTR);//
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs1 = 1;    
+    }
+}
+
+void LS7366_write_DTR(int chan_num,long enc_value){
+    union bytes
+    {
+        char byte_enc[4];
+        long long_enc;
+    }counter;
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    
+    counter.long_enc = enc_value;
+    
+    if(chan_num!=2){
+        ls7166_cs1 = 0;    
+    }            
+    else{
+        ls7166_cs2 = 0;    
+    }   
+    wait_us(1);
+    LS7366_cmd(WR,DTR);//
+    spi.write(counter.byte_enc[3]);
+    spi.write(counter.byte_enc[2]);
+    spi.write(counter.byte_enc[1]);
+    spi.write(counter.byte_enc[0]);
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs2 = 1;    
+    }     
+    
+    wait_us(1);
+    if(chan_num!=2){
+        ls7166_cs1 = 0;    
+    }            
+    else{
+        ls7166_cs2 = 0;    
+    }
+    wait_us(1);
+    LS7366_cmd(LOAD,CNTR);//
+    if(chan_num!=2){
+        ls7166_cs1 = 1;    
+    }            
+    else{
+        ls7166_cs2 = 1;    
+    }
+}   
+
+//------- MAX522 routines ---------------------------------
+void write_max522(int chan, float volts){
+    int cmd=0x20;   //set UB3
+    int data_word = (int)((volts/5.0) * 256.0);
+    if(chan != 2)
+        cmd |= 0x01;    //set DAC A out
+    else
+        cmd |= 0x02;    //set DACB out        
+    
+ //   pc.printf("cmd=0x%4X  data_word=0x%4X \r\n", cmd, data_word);
+    
+    spi.format(8, 0);
+    spi.frequency(2000000);
+    max522_cs = 0;
+    spi.write(cmd & 0xFF);
+    spi.write(data_word & 0xFF);
+    max522_cs = 1;    
+}
+
+void mbedWSEsbc_init(void){
+    led4 = 0;         
+    max1270_cs = 1;
+    max522_cs = 1;
+    ls7166_cs1 = 1;
+    ls7166_cs2 = 1;
+    
+    wait(.2);   //delay at beginning for voltage settle purposes
+    
+    mot_en1.period_us(50);   
+    //pc.baud(921600); //Set up serial port baud rate
+    pc.baud(9600); //Set up serial port baud rate
+    xbee.baud(9600);
+    
+    spi.frequency(5000000);
+    LS7366_reset_counter(1);
+    LS7366_quad_mode_x4(1);       
+    LS7366_write_DTR(1,0);
+    
+    LS7366_reset_counter(2);
+    LS7366_quad_mode_x4(2);       
+    LS7366_write_DTR(2,0);
+          
+    t.start();  // Set up timer    
+}//mbedWSEsbc_init()
\ No newline at end of file