Library files for AD9106.

ad910x.cpp

Committer:
scabatan
Date:
2021-03-26
Revision:
3:909f157c982e
Parent:
1:10838ebbc223
Child:
4:15b1cf1aa2b0

File content as of revision 3:909f157c982e:

#include "mbed.h"
#include "ad910x.h"

extern UnbufferedSerial pc;

AD910x::AD910x(PinName CSB,
               PinName MOSI,
               PinName MISO,
               PinName SCK,
               PinName RESETB,
               PinName TRIGGERB) :
    spi(MOSI, MISO, SCK), csb(CSB), resetb(RESETB), triggerb(TRIGGERB)
{
}

/*
 * @brief Reset AD910x SPI registers to default values
 * @param none
 * @return none
 */
void AD910x::AD910x_reg_reset()
{
    resetb = 0;
    wait_us( 10 );
    resetb = 1;
}


/*
 * @brief Print register address and data in hexadecimal format
 * @param addr - SPI/SRAM register address
 * @param data - 16-bit data
 * @return none
 */
void AD910x::print_data( uint16_t addr, uint16_t data )
{
    printf( "0x%04X, 0x%04X\n", addr, data );
}

/*
 * @brief Write data to SRAM
 * @param data[] - array of data to be written to SRAM
 * @return none
 */
void AD910x::AD910x_update_sram( int16_t data[] )
{ 
    spi_write( 0x001E, 0x0004 );
    
    int16_t data_shifted = 0;
    
    uint16_t sram_add = 0x6000;
    
    for ( int i=0; i<4096; i++ ){
        data_shifted = data[i] << 2;
        spi_write( sram_add+i, data_shifted );
    }
    
    spi_write( 0x001E, 0x0010 );   
}

/*
 * @brief Read from SRAM and print data
 * @param n - number of SRAM addresses to be read from
 * @return none
 */
void AD910x::AD910x_print_sram( uint16_t n )
{
    spi_write( 0x001E, 0x000C );
    
    int16_t data_shifted = 0;
    
    uint16_t sram_add = 0x6000;
    
    for ( int i=0; i<n; i++ ){
        data_shifted = spi_read( sram_add+i ) >> 2;
        print_data( sram_add+i, data_shifted );
    }
    
    spi_write( 0x001E, 0x0010 );
}

/*
 * @brief Write to SPI registers, and read and print new register values
 * @param data[] - array of data to written to SPI registers
 * @return none
 */
void AD910x::AD910x_update_regs( uint16_t data[] ){
       
    uint16_t data_display = 0;
     
    for ( int i=0; i<66; i++ ){
        spi_write( reg_add[i], data[i] );
        data_display = spi_read( reg_add[i] );
        print_data( reg_add[i], data_display );
    } 
}

/*
 * @brief Start pattern generation by setting AD910x trigger pin to 0
 * @param none
 * @return none
 */
void AD910x::AD910x_start_pattern()
{
    triggerb = 0;
}

/*
 * @brief Stop pattern generation by setting AD910x trigger pin to 1
 * @param none
 * @return none
 */
void AD910x::AD910x_stop_pattern()
{
    triggerb = 1;
}

/*********************************************************/
// SPI FUNCTIONS 
/*********************************************************/

/*
 * @brief Set AD910x SPI word length, mode, frequency
 * @param reg_len - SPI word length
 * @param mode - SPI clock polarity, clock and data phase
 * @param hz - SPI bus frequency in hz
 * @return none
 */
void AD910x::spi_init(uint8_t reg_len, uint8_t mode, uint32_t hz)
{
    spi.format( reg_len, mode );
    spi.frequency( hz );
}

/*
 * @brief Write 16-bit data to AD910x SPI/SRAM register
 * @param addr - SPI/SRAM address
 * @param data - data to be written to register address
 * @return none
 */
void AD910x::spi_write( uint16_t addr, int16_t data )
{
    csb = 0;
    
    spi.write( addr );
    spi.write( data );
    
    csb = 1;
    wait_us( 1 );
}

/*
 * @brief Read 16-bit data from AD910x SPI/SRAM register
 * @param addr - SPI/SRAM address
 * @return reg_data - data returned by AD910x
 */
int16_t AD910x::spi_read( uint16_t addr )
{
    csb = 0;
    
    uint16_t read_addr;
    int16_t reg_data;
    
    read_addr = 0x8000+addr;
    spi.write( read_addr );
    reg_data = spi.write( 0 );
    
    csb = 1;
    wait_us( 1 );
    
    return reg_data;
}