| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767 |
- #define SCPI_GPIB_CORE_C
- #include "app/scpi/scpi_gpib_core.h"
- #include "my_assert.h"
- // Reference:
- // [1] SCPI Specification, revision 1999.0
- // "Standard Commands for Programmable Instruments (SCPI), VERSION 1999.0, May 1999"
- // [2], Gpib Programming Tutorial, Electronics Group (http://www.few.vu.nl/~elec), 11 January 2000 Electronics Group, (http://g2pc1.bu.edu/~qzpeng/gpib/manual/GpibProgTut.pdf)
- // [3] USBTMC-USB488 Standard, rev. 1.0, 14/04/2003
- // "Universal Serial Bus Test and Measurement Class, Subclass USB488 Specification (USBTMC-USB488)
- // [4] IEEE 488.2 Standard, revision IEEE Std 488.2-1987 (1992)
- // "IEEE Standard Codes, Formats, Protocols, and Common Commands for Use With IEEE Std 488.1-1987, IEEE
- static void gpib_get_event_status_register( xGPIBRegisters_t * _gpibr, uint8_t * pesr );
- static void gpib_set_event_status_register_power_on_state( xGPIBRegisters_t * _gpibr, bool pon );
- static void gpib_set_event_status_register_user_request_state( xGPIBRegisters_t * _gpibr, bool urq );
- static void gpib_set_event_status_register_command_error_state( xGPIBRegisters_t * _gpibr, bool cme );
- static void gpib_set_event_status_register_execution_error_state( xGPIBRegisters_t * _gpibr, bool e );
- static void gpib_set_event_status_register_device_specific_error_state( xGPIBRegisters_t * _gpibr, bool dde );
- static void gpib_set_event_status_register_query_error_state( xGPIBRegisters_t * _gpibr, bool qye );
- static void gpib_set_event_status_register_request_control_state( xGPIBRegisters_t * _gpibr, bool rqc );
- static void gpib_set_event_status_register_operation_complete_state( xGPIBRegisters_t * _gpibr, bool opc );
- static void gpib_get_event_status_enable_register( xGPIBRegisters_t * _gpibr, uint8_t * pese );
- static void gpib_set_event_status_enable_register( xGPIBRegisters_t * _gpibr, uint8_t ese );
- static void gpib_get_event_summary_bit( xGPIBRegisters_t * _gpibr, uint8_t * pesb );
- static void gpib_set_event_summary_enable_state( xGPIBRegisters_t * _gpibr, bool esb );
- static void gpib_set_message_available_bit( xGPIBRegisters_t * _gpibr, bool mav );
- static void gpib_set_message_available_enable_state( xGPIBRegisters_t * _gpibr, bool mav );
- static void gpib_get_message_available_bit( xGPIBRegisters_t * _gpibr, uint8_t * pmav );
- static void gpib_set_error_available_bit( xGPIBRegisters_t * _gpibr, bool eav );
- static void gpib_set_error_available_enable_state( xGPIBRegisters_t * _gpibr, bool eav );
- static void gpib_get_error_available_bit( xGPIBRegisters_t * _gpibr, uint8_t * peav );
- static void gpib_get_status_byte_serial_poll( xGPIBRegisters_t * _gpibr, uint8_t * pstb );
- static void gpib_get_status_byte_normal_poll( xGPIBRegisters_t * _gpibr, uint8_t * pstb );
- static void gpib_clr_status_byte( xGPIBRegisters_t * _gpibr );
- static void gpib_get_service_request_enable_register( xGPIBRegisters_t * _gpibr, uint8_t * psre );
- static void gpib_set_service_request_enable_register( xGPIBRegisters_t * _gpibr, uint8_t sre );
- static void gpib_get_service_request_status( xGPIBRegisters_t * _gpibr, bool * psrq );
- static void gpib_set_service_request_status( xGPIBRegisters_t * _gpibr, bool srq );
- const sGPIBMachineRoutines_t GPIBMachine =
- {
- .fGPIB_get_event_status_register = gpib_get_event_status_register,
- .fGPIB_set_event_status_register_power_on_state = gpib_set_event_status_register_power_on_state,
- .fGPIB_set_event_status_register_user_request_state = gpib_set_event_status_register_user_request_state,
- .fGPIB_set_event_status_register_command_error_state = gpib_set_event_status_register_command_error_state,
- .fGPIB_set_event_status_register_execution_error_state = gpib_set_event_status_register_execution_error_state,
- .fGPIB_set_event_status_register_device_specific_error_state = gpib_set_event_status_register_device_specific_error_state,
- .fGPIB_set_event_status_register_query_error_state = gpib_set_event_status_register_query_error_state,
- .fGPIB_set_event_status_register_request_control_state = gpib_set_event_status_register_request_control_state,
- .fGPIB_set_event_status_register_operation_complete_state = gpib_set_event_status_register_operation_complete_state,
- .fGPIB_get_event_status_enable_register = gpib_get_event_status_enable_register,
- .fGPIB_set_event_status_enable_register = gpib_set_event_status_enable_register,
- .fGPIB_get_event_summary_bit = gpib_get_event_summary_bit,
- .fGPIB_set_event_summary_enable_state = gpib_set_event_summary_enable_state,
- .fGPIB_set_message_available_bit = gpib_set_message_available_bit,
- .fGPIB_set_message_available_enable_state = gpib_set_message_available_enable_state,
- .fGPIB_get_message_available_bit = gpib_get_message_available_bit,
- .fGPIB_set_error_available_bit = gpib_set_error_available_bit,
- .fGPIB_set_error_available_enable_state = gpib_set_error_available_enable_state,
- .fGPIB_get_error_available_bit = gpib_get_error_available_bit,
- .fGPIB_get_status_byte_serial_poll = gpib_get_status_byte_serial_poll,
- .fGPIB_get_status_byte_normal_poll = gpib_get_status_byte_normal_poll,
- .fGPIB_clr_status_byte = gpib_clr_status_byte,
- .fGPIB_get_service_request_enable_register = gpib_get_service_request_enable_register,
- .fGPIB_set_service_request_enable_register = gpib_set_service_request_enable_register,
- .fGPIB_get_service_request_status = gpib_get_service_request_status,
- .fGPIB_set_service_request_status = gpib_set_service_request_status,
- };
- // Reference:
- // [1] SCPI Specification, revision 1999.0
- // "Standard Commands for Programmable Instruments (SCPI), VERSION 1999.0, May 1999"
- // [2], Gpib Programming Tutorial, Electronics Group (http://www.few.vu.nl/~elec), 11 January 2000 Electronics Group, (http://g2pc1.bu.edu/~qzpeng/gpib/manual/GpibProgTut.pdf)
- // [3] USBTMC-USB488 Standard, rev. 1.0, 14/04/2003
- // "Universal Serial Bus Test and Measurement Class, Subclass USB488 Specification (USBTMC-USB488)
- // --------------------------------------------------------------------------------------------------------
- #pragma pack(push,1)
- typedef struct
- {
- uint8_t operationComplete : 1;
- uint8_t requestControl : 1;
- uint8_t queryError : 1;
- uint8_t deviceError : 1;
- uint8_t executionError : 1;
- uint8_t commandError : 1;
- uint8_t userRequest : 1;
- uint8_t powerOn : 1;
- }
- sGPIBEventStatusRegisterBits_t; // "4 Instrument status", [2]
- typedef struct
- {
- uint8_t bit_0 : 1;
- uint8_t bit_1 : 1;
- uint8_t EAV : 1; // Error AVailable bit
- uint8_t bit_3 : 1;
- uint8_t MAV : 1; // Message AVailable bit
- uint8_t ESB : 1; // Event Summary Bit
- uint8_t RQS_MSS : 1; // ReQuested Service / Master Summary Status
- uint8_t bit_7 : 1;
- }
- sGPIBStatusByteRegisterBits_t; // "4 Instrument status", [2]; "4.3.1 READ_STATUS_BYTE", [3]
- typedef struct
- {
- union
- {
- sGPIBEventStatusRegisterBits_t bits;
- uint8_t byte;
- }
- ESR; // "ESR", "Event Status Register"
- union
- {
- sGPIBEventStatusRegisterBits_t bits;
- uint8_t byte;
- }
- ESE; // "ESE", "Event Status Enable Register"
- }
- sGPIBEventStatus_t; // "4 Instrument status", [2]
- typedef union
- {
- sGPIBStatusByteRegisterBits_t bits;
- uint8_t byte;
- }
- sGPIB_STB_t; // "STB", "Status Byte Register"
- typedef union
- {
- sGPIBStatusByteRegisterBits_t bits;
- uint8_t byte;
- }
- sGPIB_SRE_t; // "SRE", "Service Request Enable Register"
- typedef struct
- {
- sGPIB_STB_t STB;
- sGPIB_SRE_t SRE;
- union
- {
- bool requestService;
- uint32_t reserved;
- };
- }
- sGPIBStatusByte_t; // "4 Instrument status", [2]
- typedef struct
- {
- sGPIBEventStatus_t EventStatus;
- sGPIBStatusByte_t Status;
- }
- sGPIBRegisters_t;
- #pragma pack(pop)
- // --------------------------------------------------------------------------------------------------------
- STATIC_ASSERT( sizeof(xGPIBRegisters_t) == sizeof(sGPIBRegisters_t), "Invalid xGPIBRegisters_t/sGPIBRegisters_t size" );
- // --------------------------------------------------------------------------------------------------------
- static void gpib_RQS_set( xGPIBRegisters_t * _gpibr )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.requestService = true;
- }
- static void gpib_RQS_reset( xGPIBRegisters_t * _gpibr )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.requestService = false;
- }
- // --------------------------------------------------------------------------------------------------------
- static void gpib_STB_update( xGPIBRegisters_t * _gpibr )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0xff }; MASK.bits.RQS_MSS = 0;
- gpibr->Status.STB.bits.RQS_MSS = (gpibr->Status.SRE.byte & gpibr->Status.STB.byte & MASK.byte)?1:0;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_event_status_register
- // Returns GPIB event status register
- // Reference:
- // "4 Instrument status", [2]
- // "10.12 *ESR?, Standard Event Status Register Query", [4]
- // "11.5.1.2 Standard Event Status Register Operation", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pesr - pointer to the variable to store the value of ESR (event status register) to.
- // Returns: none
- static void gpib_get_event_status_register( xGPIBRegisters_t * _gpibr, uint8_t * pesr )
- {
- my_assert( _gpibr );
- my_assert( pesr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- *pesr = gpibr->EventStatus.ESR.byte;
- // "10.12 *ESR?, Standard Event Status Register Query", [4]
- // "11.5.1.2 Standard Event Status Register Operation", [4]
- // "<...> Reading the Standard Event Status Register clears it <...>", [4]
- gpibr->EventStatus.ESR.byte = 0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_power_on_state
- // Sets GPIB event status register status: power on
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pon - value of Power On bit (PON) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_power_on_state( xGPIBRegisters_t * _gpibr, bool pon )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.powerOn = (pon)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_user_request_state
- // Sets GPIB event status register status: user request
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @urq - value of User Request bit (URQ) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_user_request_state( xGPIBRegisters_t * _gpibr, bool urq )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.userRequest = (urq)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_command_error_state
- // Sets GPIB event status register status: command error
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @cme - value of Command Error bit (CME) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_command_error_state( xGPIBRegisters_t * _gpibr, bool cme )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.commandError = (cme)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_execution_error_state
- // Sets GPIB event status register status: execution error
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @e - value of Execution Error bit (E) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_execution_error_state( xGPIBRegisters_t * _gpibr, bool e )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.executionError = (e)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_device_specific_error_state
- // Sets GPIB event status register status: device specific error
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @dde - value of Device Specific Error bit (DDE) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_device_specific_error_state( xGPIBRegisters_t * _gpibr, bool dde )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.deviceError = (dde)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_query_error_state
- // Sets GPIB event status register status: query error
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @qye - value of Device Specific Error bit (QYE) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_query_error_state( xGPIBRegisters_t * _gpibr, bool qye )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.queryError = (qye)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_request_control_state
- // Sets GPIB event status register status: request control
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @rqc - value of Request Control bit (RQC) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_request_control_state( xGPIBRegisters_t * _gpibr, bool rqc )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.requestControl = (rqc)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_register_operation_complete_state
- // Sets GPIB event status register status: operation complete
- // Reference:
- // "4 Instrument status", [2]
- // "11.5.1.1 Standard Event Status Register Bit Definitions", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @opc - value of Operation Complete bit (RQC) in ESR (event status register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_register_operation_complete_state( xGPIBRegisters_t * _gpibr, bool opc )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESR.bits.operationComplete = (opc)?1:0;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_event_status_enable_register
- // Returns GPIB event status enable register
- // Reference:
- // "4 Instrument status", [2]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pesr - pointer to the variable to store the value of ESE (event status enable register) to.
- // Returns: none
- static void gpib_get_event_status_enable_register( xGPIBRegisters_t * _gpibr, uint8_t * pese )
- {
- my_assert( _gpibr );
- my_assert( pese );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- *pese = gpibr->EventStatus.ESE.byte;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_status_enable_register
- // Sets GPIB event status enable register
- // Reference:
- // "4 Instrument status", [2]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @ese - value of ESE (event status enable register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_status_enable_register( xGPIBRegisters_t * _gpibr, uint8_t ese )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->EventStatus.ESE.byte = ese;
- gpibr->Status.STB.bits.ESB = ((gpibr->EventStatus.ESR.byte & gpibr->EventStatus.ESE.byte)?1:0);
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_event_summary_bit
- // Return GPIB event summary bit
- // Reference:
- // "4.1 Status Byte registers (STB and SRE)", "Event Summary Bit", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pesb - pointer to the variable to store the value of ESB (event summary bit) to.
- // Note: the value of the bit will be set to the corresponding bit position, all the rest bits are reset to zero.
- // Returns: none
- static void gpib_get_event_summary_bit( xGPIBRegisters_t * _gpibr, uint8_t * pesb )
- {
- my_assert( _gpibr );
- my_assert( pesb );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0 }; MASK.bits.ESB = 1;
- *pesb = gpibr->Status.STB.byte & MASK.byte;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_event_summary_enable_state
- // Set GPIB event summary enable bit in Service Request Enable Register (SRE)
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @esb - the event summary indictor enable to set to GPIB Register structure.
- // Returns: none
- static void gpib_set_event_summary_enable_state( xGPIBRegisters_t * _gpibr, bool esb )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.SRE.bits.ESB = (esb)?1:0;
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_message_available_bit
- // Return GPIB message available bit
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @mav - the message available indictor to set to GPIB Register structure.
- // Returns: none
- static void gpib_set_message_available_bit( xGPIBRegisters_t * _gpibr, bool mav )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.STB.bits.MAV = (mav)?1:0;
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_message_available_enable_state
- // Set GPIB message available enable bit in Service Request Enable Register (SRE)
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @mav - the message available indictor enable to set to GPIB Register structure.
- // Returns: none
- static void gpib_set_message_available_enable_state( xGPIBRegisters_t * _gpibr, bool mav )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.SRE.bits.MAV = (mav)?1:0;
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_message_available_bit
- // Set GPIB message available bit
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pmav - pointer to the variable to store the value of MAV (message available bit) to.
- // Note: the value of the bit will be set to the corresponding bit position, all the rest bits are reset to zero.
- // Returns: none
- static void gpib_get_message_available_bit( xGPIBRegisters_t * _gpibr, uint8_t * pmav )
- {
- my_assert( _gpibr );
- my_assert( pmav );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0 }; MASK.bits.MAV = 1;
- *pmav = gpibr->Status.STB.byte & MASK.byte;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_error_available_bit
- // Set GPIB error available bit
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @eav - the error available indictor to set to GPIB Register structure.
- // Returns: none
- static void gpib_set_error_available_bit( xGPIBRegisters_t * _gpibr, bool eav )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.STB.bits.EAV = (eav)?1:0;
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_error_available_enable_state
- // Set GPIB error available enable bit in Service Request Enable Register (SRE)
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @eav - the error available indictor enable to set to GPIB Register structure.
- // Returns: none
- static void gpib_set_error_available_enable_state( xGPIBRegisters_t * _gpibr, bool eav )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.SRE.bits.EAV = (eav)?1:0;
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_error_available_bit
- // Return GPIB error available bit
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @peav - pointer to the variable to store the value of EAV (error available bit) to.
- // Note: the value of the bit will be set to the corresponding bit position, all the rest bits are reset to zero.
- // Returns: none
- static void gpib_get_error_available_bit( xGPIBRegisters_t * _gpibr, uint8_t * peav )
- {
- my_assert( _gpibr );
- my_assert( peav );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0 }; MASK.bits.EAV = 1;
- *peav = gpibr->Status.STB.byte & MASK.byte;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_status_byte_serial_poll
- // Return GPIB Status Byte during Serial Poll procedure.
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "3.4.1 Interrupt-IN DATA sent due to an SRQ condition", [3]
- // "3.4.2 Interrupt-IN DATA sent due to READ_STATUS_BYTE request", [3]
- // "11.2.2 Reading the Status Byte Register", [4]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pstb - pointer to the variable to store the value of STB (status byte) to.
- // Returns: none
- static void gpib_get_status_byte_serial_poll( xGPIBRegisters_t * _gpibr, uint8_t * pstb )
- {
- my_assert( _gpibr );
- my_assert( pstb );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0x00 }; MASK.bits.RQS_MSS = (gpibr->Status.requestService)?1:0;
- *pstb = gpibr->Status.STB.byte | MASK.byte;
-
- gpib_RQS_reset(_gpibr); // "11.2.2.1 Reading with a Serial Poll", [4]
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_status_byte_normal_poll
- // Return GPIB Status Byte during *STB? procedure.
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "3.4.1 Interrupt-IN DATA sent due to an SRQ condition", [3]
- // "3.4.2 Interrupt-IN DATA sent due to READ_STATUS_BYTE request", [3]
- // "11.2.2 Reading the Status Byte Register", [4]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @pstb - pointer to the variable to store the value of STB (status byte) to.
- // Returns: none
- static void gpib_get_status_byte_normal_poll( xGPIBRegisters_t * _gpibr, uint8_t * pstb )
- {
- my_assert( _gpibr );
- my_assert( pstb );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_STB_t MASK = { .byte = 0x00 }; MASK.bits.RQS_MSS = (gpibr->Status.requestService)?1:0;
- *pstb = gpibr->Status.STB.byte | MASK.byte;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_clr_status_byte
- // Clears GPIB Status Byte
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.4 Clearing the Status Byte Register"
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // Returns: none
- void gpib_clr_status_byte( xGPIBRegisters_t * _gpibr )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- gpibr->Status.STB.bits.bit_0 = 0;
- gpibr->Status.STB.bits.bit_1 = 0;
- gpibr->Status.STB.bits.bit_3 = 0;
- gpibr->Status.STB.bits.bit_7 = 0;
- gpibr->Status.STB.bits.EAV = 0;
- gpibr->Status.STB.bits.ESB = 0;
- sGPIB_STB_t MASK = { .byte = 0xff }; MASK.bits.RQS_MSS = 0;
- gpibr->Status.STB.bits.RQS_MSS = (gpibr->Status.SRE.byte & gpibr->Status.STB.byte & MASK.byte)?1:0;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_service_request_enable_register
- // Return GPIB Service Request Enable Register
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @psre - pointer to the variable to store the value of SRE (Service Request Enable Register) to.
- // Returns: none
- static void gpib_get_service_request_enable_register( xGPIBRegisters_t * _gpibr, uint8_t * psre )
- {
- my_assert( _gpibr );
- my_assert( psre );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- sGPIB_SRE_t MASK = { .byte = 0xff }; MASK.bits.RQS_MSS = 0;
- *psre = (gpibr->Status.SRE.byte) & (MASK.byte);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_service_request_enable_register
- // Set GPIB Service Request Enable Register
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @sre - value of SRE (Service Request Enable Register) to write to GPIB Register structure.
- // Returns: none
- static void gpib_set_service_request_enable_register( xGPIBRegisters_t * _gpibr, uint8_t sre )
- {
- my_assert( _gpibr );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- {
- sGPIB_SRE_t MASK = { .byte = 0 }; MASK.bits.RQS_MSS = 0;
- gpibr->Status.SRE.byte = (sre) & (MASK.byte);
- }
- gpib_STB_update(_gpibr);
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_get_service_request_status
- // Return GPIB Service Request indicator (Service Request Generation, SRQ)
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @psrq - pointer to the variable to store the state of SRQ indicator (Service ReQuest) to.
- // Returns: none
- static void gpib_get_service_request_status( xGPIBRegisters_t * _gpibr, bool * psrq )
- {
- my_assert( _gpibr );
- my_assert( psrq );
- sGPIBRegisters_t * gpibr = (sGPIBRegisters_t*)_gpibr;
- *psrq = gpibr->Status.requestService;
- }
- // --------------------------------------------------------------------------------------------------------
- // @gpib_set_service_request_status
- // Writes GPIB Service Request indicator (Service Request Generation, SRQ)
- // Reference:
- // "4 Instrument status", [2]
- // "4.1 Status Byte registers (STB and SRE)", [2]
- // "11.2.2.3 Master Summary Status", [4]
- // "11.3.2.4 Clearing the Service Request Enable Register", [4]
- // Parameters:
- // @_gpibr - GPIB Register structure;
- // @srq - SRQ indicator value (Service ReQuest) to write
- // Returns: none
- static void gpib_set_service_request_status( xGPIBRegisters_t * _gpibr, bool srq )
- {
- my_assert( _gpibr );
- if( srq )
- gpib_RQS_set( _gpibr );
- else
- gpib_RQS_reset( _gpibr );
- }
|