GPIB Controller

Dependencies:   TextLCD mbed

Files at this revision

API Documentation at this revision

Comitter:
jf1vrr
Date:
Sat Jun 11 06:35:38 2011 +0000
Commit message:
Rev 0.01A 2011/06/11 new

Changed in this revision

GPIB_9914.h Show annotated file Show diff for this revision Revisions of this file
TextLCD.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/GPIB_9914.h	Sat Jun 11 06:35:38 2011 +0000
@@ -0,0 +1,386 @@
+//GPIB_9914.h
+
+//NAT7210 - mbed I/O Port design
+BusInOut DATA(p9, p10, p11, p12, p13, p14, p15, p16); // LSB p9 - MSB p16 data bus
+DigitalOut RD(p18);
+DigitalOut WR(p19);
+BusOut RS(p21, p22, p23); //LSB p21 - MSB p23 address bus
+
+//Flags & Macros
+#define     _LOW        0
+#define     _HIGH       1
+#define     _OFF        0
+#define     _ON         1
+#define     SET_READ    DATA.input();
+#define     SET_WRITE   DATA.output();
+
+//NAT7210 9914 Mode READ Registers
+#define     ISR0        0           //Interrupt Status Register 0
+#define     ISR1        1           //Interrupt Status Register 1
+#define     ADSR        2           //Address Register
+#define     BSR         3           //Bus Status Register
+#define     ISR2        4           //Interrupt Status Register 2(Page-In)
+#define     SPSR        5           //Serial Poll Status Register(Page-In)
+#define     CPTR        6           //Command Pass Through Register
+#define     DIR         7           //Data In Register
+
+//NAT7210 9914 Mode WRITE Registers
+#define     IMR0        0           //Interrupt Mask Register 0
+#define     IMR1        1           //Interrupt Mask Register 1
+#define     IMR2        2           //Interrupt Mask register 2(Page-In)
+#define     EOSR        2           //End-Of-String Register(Page-In)
+#define     BCR         2           //Bus Control Register(Page-In)
+#define     ACCR        2           //Accessory Read Register(Page-In)
+#define     AUXCR       3           //Auxiliary Command Register
+#define     ADR         4           //Address Register
+#define     SPMR        5           //Serial Poll Mode Register
+#define     PPR         6           //Parallel Poll Register
+#define     CDOR        7           //Command/data Out Register
+
+#define     AUXMR       5           //7210 Auxiliary Mode Register
+#define     _sw9914     0x15        //Switch To 9914 Mode(7210 Mode AUXMR)
+
+//ACCR Accessory Read register Map
+#define     ICR         0x20
+#define     ACCA        0x80
+#define     ACCB        0xA0
+#define     ACCE        0xC0
+#define     ACCF        0xD0
+#define     ACCI        0xE0
+
+//AUXCR Auxiliary Commands
+#define     _clr_swrst  0x00        //Clear Software Reset
+#define     _set_swrst  0x80        //Set Software Reset
+#define     _nonvalid   0x01        //Nonvalid Release DAC Holdoff
+#define     _valid      0x81        //Valid Release DAC Holdoff
+#define     _rhdf       0x02        //Release RFD Holdoff
+#define     _clr_hdfa   0x03        //Clear Holdoff On All data
+#define     _set_hdfa   0x83        //Set Holdoff On All Data
+#define     _clr_hdfe   0x04        //Clear Holdoff On END Only
+#define     _set_hdfe   0x84        //Holdoff On END Only
+#define     _nbaf       0x05        //New Byte Available False
+#define     _clr_fget   0x06        //Clear Force Group Execute Trigger
+#define     _set_fget   0x86        //Set Force Group Execute Trigger
+#define     _clr_rtl    0x07        //Clear return To Local
+#define     _set_rtl    0x87        //Set Return To Local
+#define     _feoi       0x08        //Send EOI With The Next Byte
+#define     _clr_lon    0x09        //Clear Listen Only
+#define     _set_lon    0x89        //Set Listen only
+#define     _clr_ton    0x0A        //Clear Talk Only
+#define     _set_ton    0x8A        //Set Talk Only
+#define     _gts        0x0B        //Go To Standby
+#define     _tca        0x0C        //Take Control Asynchronously
+#define     _tcs        0x0D        //Take Control Synchronously
+#define     _clr_rpp    0x0E        //Clear Request Parallel Poll
+#define     _set_rpp    0x8E        //Set Request Parallel Poll
+#define     _clr_sic    0x0F        //Clear Send Interface Clear
+#define     _set_sic    0x8F        //Set Send Interface Clear
+#define     _clr_sre    0x10        //Clear Send Remote Enable
+#define     _set_sre    0x90        //Set Send Remote Enable
+#define     _rqc        0x11        //Request Control
+#define     _rlc        0x12        //Release Control
+#define     _clr_dai    0x13        //Clear Disable IMR2, IMR1, And IMR0 Interrupts
+#define     _set_dai    0x93        //Set Disable IMR2, IMR1 And IMR0 Interrupts
+#define     _pts        0x14        //Pass Through Next Secondary
+#define     _clr_stdl   0x15        //Clear Short T1 Delay
+#define     _set_std1   0x95        //Set Short T1 Delay
+#define     _clr_shdw   0x16        //Clear Shadow Handshaking
+#define     _set_shdw   0x96        //Set Shadow Handshaking
+#define     _clr_vstdl  0x17        //Clear Very Short T1 Delay
+#define     _set_vstdl  0x97        //Set Very Short T1 Delay
+#define     _clr_rsv2   0x18        //Clear Request Service bit 2
+#define     _set_rsv2   0x98        //Set Request Service bit 2
+#define     _sw7210     0x99        //Switch To 7210 Mode
+#define     _reqf       0x1A        //Request rsv False
+#define     _reqt       0x9A        //Request rsv True
+#define     _ch_rst     0x1C        //Chip Reset
+#define     _clr_ist    0x1D        //Clear Parallel Poll Flag
+#define     _set_ist    0x9D        //Set Parallel Poll Flag
+#define     _piimr2     0x1E        //Page-In Interrupt Mask Register 2
+#define     _pibcr      0x1F        //Page-In Bus Control Register
+#define     _clrpi      0x9C        //Clear_Page-In Register
+#define     _pieosr     0x9E        //Page-In End-Of-String Register
+#define     _piaccr     0x9F        //Page-In Accessory Register      
+
+//ISR0 Flags
+#define     _BI         0x20
+#define     _BO         0x10
+
+#define     _CR         0x0D        //Delemiter(CR) --- ignore
+#define     _LF         0x0A        //Delimiter(LF)
+
+//GPIB Command
+#define     _GTL        0x01        //
+#define     _SDC        0x04        //
+#define     _PPC        0x05        //
+#define     _GET        0x08        //
+#define     _TCT        0x09        //
+#define     _LLO        0x11        //Local Lock Out
+#define     _DCL        0x14        //
+#define     _PPU        0x15        //
+#define     _SPE        0x18        //
+#define     _SPD        0x19        //
+#define     _UNL        0x3F        //Unlisten
+#define     _UNT        0x5F        //Untalk
+
+#define     _BUFLEN        16
+
+char    databyte;
+char    databuff[_BUFLEN];
+
+//Data write to Internal Register
+//IN: RS = NAT7210 Internal Register Address
+//IN: DATA = data byte to write
+void GPIB_write() {
+    WR = _LOW;
+    wait_us(100);
+    WR = _HIGH;
+}
+
+//IN: RS = NAT7210 Internal Register Address
+//OUT: databyte = get data byte
+void GPIB_read() {
+    SET_READ;
+    RD = _LOW;
+    wait_us(100);
+    databyte = DATA;
+    wait_us(100);
+    RD = _HIGH;
+    SET_WRITE;
+}
+
+void auxcr(unsigned char aux_cmd){
+    RS = AUXCR;
+    DATA = aux_cmd;
+    GPIB_write();
+    if(aux_cmd == _gts) wait_ms(10); 
+}
+
+void GPIB_in(unsigned char gpib_reg){
+    RS = gpib_reg;
+    GPIB_read();
+}
+
+//Data Output to GPIB bus
+//IN: DATA = Data byte to out
+void GPIB_DOUT(){
+    RS = CDOR;
+    GPIB_write();   //Data out
+__WAIT_DOUT:
+    wait_ms(1);
+    GPIB_in(ISR0);
+    if ((databyte & _BO) == _BO) return; //Wait for buffer out
+    else {
+        //lcd.locate(0,0);
+        //lcd.printf("Waitng BO-1     ");
+        goto __WAIT_DOUT;
+    }
+}
+
+void GPIB_BOWT(){
+__WAIT_DOWT:
+    GPIB_in(ISR0);
+    if ((databyte & _BO) == _BO) return; //Wait for buffer out
+    else {
+        //lcd.locate(0,0);
+        //lcd.printf("Waitng BO-2     ");
+        goto __WAIT_DOWT;
+    }
+}
+
+char GPIB_BIWT(){
+__WAIT_BIWT:
+    GPIB_in(ISR0);
+    if((databyte & _BI) == 0) {    //wait for Data available
+        //lcd.locate(0,1);
+        //lcd.printf("Waiting BI      ");
+        goto __WAIT_BIWT;
+    }
+    GPIB_in(DIR);    //Get data byte
+    return databyte;
+}
+
+void GPIB_out(unsigned char gpib_cmd){
+    DATA = gpib_cmd;
+    GPIB_DOUT();  //Out to GPIB data bus
+}
+
+void GPIB_OLA(unsigned char listener){
+    GPIB_out(0x20 + listener);
+}
+
+void GPIB_OTA(unsigned char talker){
+    GPIB_out(0x40 + talker);
+}
+
+void GPIB_DCL(){
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    GPIB_out(_UNT);
+    GPIB_out(_DCL);
+    auxcr(_gts); //ATNH
+}
+
+void GPIB_SDC(unsigned char listener){
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    auxcr(_set_ton); //MTA
+    GPIB_OLA(listener);
+    GPIB_out(_SDC);   
+    auxcr(_gts); //ATNH
+}
+
+void GPIB_GPOUT(char *send_buffer){
+int i;
+    for(i = 0; i < (_BUFLEN - 1); i++){
+        if(send_buffer[i] == NULL) goto __GPOUT_EXIT;
+        else {
+            GPIB_out(send_buffer[i]);
+        }
+    }
+__GPOUT_EXIT:
+    GPIB_out(_CR); //Delimiter
+    auxcr(_feoi);
+    GPIB_out(_LF);   
+}
+
+int GPIB_GPIN(char *rcv_buffer){
+int i;
+    auxcr(_set_hdfa);
+    for(i = 0; i < (_BUFLEN - 1); i++){
+        rcv_buffer[i] = GPIB_BIWT(); //Get byte
+        if(rcv_buffer[i] == _LF) { //Delimiter?
+            rcv_buffer[i] = NULL;
+            goto __GPIN_EXIT;            
+        } else if(rcv_buffer[i] == _CR) { //Ignor
+            i--;
+        }
+        auxcr(_rhdf); //Next
+    }                
+__GPIN_EXIT:
+    auxcr(_rhdf);
+    auxcr(_clr_hdfa);
+    return i;
+} 
+
+void GPIB_IFC(){
+    auxcr(_tca); //ATNL
+    wait_ms(1);
+    auxcr(_set_sic);
+    wait_us(100);
+    auxcr(_clr_sic);
+    wait_ms(1);
+    auxcr(_gts); //ATNH
+}
+    
+void GPIB_OUTPUT(char *send_buffer, unsigned char listener){  
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    auxcr(_set_ton); //MTA
+    GPIB_OLA(listener);
+    auxcr(_gts); //ATNH
+    GPIB_BOWT(); //wait talker
+    GPIB_GPOUT(send_buffer);
+}
+
+int GPIB_ENTER(char *rcv_buffer, unsigned char talker){
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    GPIB_OTA(talker);
+    auxcr(_set_lon); //MLA
+    auxcr(_gts);
+    return GPIB_GPIN(rcv_buffer);
+}
+    
+void GPIB_REMOTE(unsigned char listener){
+    auxcr(_set_sre); //REN
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    auxcr(_set_ton); //MTA
+    GPIB_OLA(listener);
+    auxcr(_gts);
+}
+
+void GPIB_LOCAL(unsigned char listener){
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    auxcr(_set_ton); //MTA
+    GPIB_OLA(listener);
+    GPIB_out(_GTL);
+    auxcr(_gts); //ATNH
+}    
+    
+void GPIB_TRIGER(unsigned char listener){
+    auxcr(_tca); //ATNL
+    GPIB_out(_UNL);
+    auxcr(_set_ton); //MTA
+    GPIB_OLA(listener);
+    GPIB_out(_GET);
+    auxcr(_gts); //ATNH
+}
+
+void GPIB_Init(unsigned char my_address){
+    SET_WRITE;
+         
+    RD = _HIGH;
+    WR = _HIGH;
+    
+    RS = AUXMR;
+    DATA = _sw9914;      //Switch To 9914 Mode
+    GPIB_write();
+    
+    //RS = AUXCR;
+    //DATA = _ch_rst;     //Chip Reset and pon
+    //GPIB_write();
+    
+    RS = AUXCR;
+    DATA = _set_swrst;   //Set Software Reset
+    GPIB_write();
+    
+    wait_ms(1);
+    
+    RS = AUXCR;
+    DATA = _clr_swrst;   //Clear Software Reset
+    GPIB_write();
+    
+    RS = ADR;
+    DATA = my_address;  //Set My Address
+    GPIB_write();
+
+    RS = AUXCR;
+    DATA = _set_dai;    //Set Disable All Interrupt
+    GPIB_write();
+    
+    RS = ISR0;          //Clear Interrupt Status Register 0
+    GPIB_read();
+    
+    RS = ISR1;          //Clear Interrupt Status Register 1
+    GPIB_read();        
+    
+    RS = SPMR;          //Clear Serial Poll register
+    DATA = 0;
+    GPIB_write();
+
+    RS = PPR;           //Clear Parallel Poll register
+    DATA = 0;
+    GPIB_write();    
+        
+    RS = IMR0;          //Disable interrupt IMR0
+    DATA = 0;
+    GPIB_write();
+
+    RS = IMR1;          //Disable interrupt IMR1
+    DATA = 0;
+    GPIB_write();
+
+    RS = DIR;           //Clear Data In Register
+    GPIB_read();
+
+    RS = CDOR;          //Clear Command/Data Out Register
+    DATA = 0;
+    GPIB_write();
+    
+    RS = AUXCR;         //Set T1 Delay
+    DATA = _set_std1;
+    GPIB_write(); 
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TextLCD.lib	Sat Jun 11 06:35:38 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/simon/code/TextLCD/#44f34c09bd37
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Sat Jun 11 06:35:38 2011 +0000
@@ -0,0 +1,40 @@
+/* GPIB Adapter 2011/06/10 MLabo */
+char init_msg1[]="  GPIB Cont.\n";
+char init_msg2[]="V0.01 11/6 MLabo\n";
+
+#include "mbed.h"
+#include "TextLCD.h"
+#include <GPIB_9914.h>
+
+TextLCD lcd(p24, p26, p27, p28, p29, p30);
+
+#define     my_address  0           //My GPIB address
+
+int main() {
+int data_len;
+    lcd.cls();
+    lcd.locate(0,0);
+    lcd.printf(init_msg1);
+    lcd.locate(0,1);
+    lcd.printf(init_msg2);
+    wait(1.0);
+
+    lcd.cls();
+    GPIB_Init(my_address);
+    GPIB_IFC();  
+    while(1){
+        GPIB_REMOTE(23);         
+        GPIB_OUTPUT("F1 R2", 23);
+
+        lcd.locate(0,0);
+        lcd.printf("Get Message1!   "); 
+        data_len = GPIB_ENTER(databuff, 23);
+    
+        lcd.locate(0,1);
+        lcd.printf("%2d %s", data_len, databuff);
+
+        GPIB_LOCAL(23);
+        wait(1);
+    }//while
+}//main
+//End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Sat Jun 11 06:35:38 2011 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/63bcd7ba4912