test version 0.2

Dependents:   SC18IS606_Hello SC18IS606_EEPROM_access_test SC18IS606_OS6_Hello

Committer:
okano
Date:
Thu Jul 29 01:35:53 2021 +0000
Revision:
7:9fee975998c1
Parent:
6:cfe7ec4f2b59
added read version, GPIO read

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:d4d72026aaf3 1 /*
okano 0:d4d72026aaf3 2 * SC18IS606 library
okano 0:d4d72026aaf3 3 *
okano 0:d4d72026aaf3 4 * @author Akifumi (Tedd) OKANO, NXP Semiconductors
okano 5:436b2c7854e8 5 * @version 0.2
okano 5:436b2c7854e8 6 * @date 28-July-2021
okano 0:d4d72026aaf3 7 *
okano 1:b44f801ac9f2 8 * SC18IS606 is an "I2C-bus to SPI bridge"
okano 1:b44f801ac9f2 9 * http://www.nxp.com/ (product infomation page will be updated later)
okano 0:d4d72026aaf3 10 */
okano 0:d4d72026aaf3 11
okano 1:b44f801ac9f2 12 #include "mbed.h"
okano 1:b44f801ac9f2 13
okano 0:d4d72026aaf3 14 #ifndef MBED_SC18IS606
okano 0:d4d72026aaf3 15 #define MBED_SC18IS606
okano 0:d4d72026aaf3 16
okano 0:d4d72026aaf3 17 /** SC18IS606 class
okano 0:d4d72026aaf3 18 *
okano 0:d4d72026aaf3 19 * This is a driver code for the SC18IS606: *
okano 0:d4d72026aaf3 20 * Example:
okano 0:d4d72026aaf3 21 * @code
okano 0:d4d72026aaf3 22 * #include "mbed.h"
okano 5:436b2c7854e8 23 * #include "SC18IS606.h"
okano 5:436b2c7854e8 24 *
okano 5:436b2c7854e8 25 * I2C i2c( p28, p27 );
okano 5:436b2c7854e8 26 * InterruptIn int_line( p21 );
okano 5:436b2c7854e8 27 * SC18IS606 bridge( i2c ); // make a SC18IS606 instance as "bridge"
okano 5:436b2c7854e8 28 *
okano 5:436b2c7854e8 29 * #define I2C_FREQUENCY (400 * 1000) // Hz
okano 5:436b2c7854e8 30 * #define SLAVE_SELECT_NUM 0
okano 5:436b2c7854e8 31 * #define DATA_LENGTH 256
okano 5:436b2c7854e8 32 *
okano 5:436b2c7854e8 33 * void data_check( char *data, int length );
okano 5:436b2c7854e8 34 *
okano 5:436b2c7854e8 35 * volatile int int_flag = false;
okano 5:436b2c7854e8 36 *
okano 5:436b2c7854e8 37 * void int_handler()
okano 5:436b2c7854e8 38 * {
okano 5:436b2c7854e8 39 * int_flag = true;
okano 5:436b2c7854e8 40 * }
okano 5:436b2c7854e8 41 *
okano 5:436b2c7854e8 42 * void wait_transfer_done( void )
okano 5:436b2c7854e8 43 * {
okano 5:436b2c7854e8 44 * while ( !int_flag )
okano 5:436b2c7854e8 45 * ;
okano 5:436b2c7854e8 46 *
okano 5:436b2c7854e8 47 * bridge.clear_interrupt();
okano 5:436b2c7854e8 48 * int_flag = false;
okano 5:436b2c7854e8 49 * }
okano 5:436b2c7854e8 50 *
okano 5:436b2c7854e8 51 * void hardware_settings( void )
okano 5:436b2c7854e8 52 * {
okano 5:436b2c7854e8 53 * int_line.mode( PullUp );
okano 5:436b2c7854e8 54 * int_line.fall( &int_handler );
okano 5:436b2c7854e8 55 * i2c.frequency( I2C_FREQUENCY );
okano 5:436b2c7854e8 56 * }
okano 5:436b2c7854e8 57 *
okano 5:436b2c7854e8 58 * int main()
okano 5:436b2c7854e8 59 * {
okano 5:436b2c7854e8 60 * printf( "SC18IS606 Hello\r\n" );
okano 5:436b2c7854e8 61 *
okano 5:436b2c7854e8 62 * hardware_settings();
okano 5:436b2c7854e8 63 * bridge.install_wait_func( wait_transfer_done );
okano 5:436b2c7854e8 64 *
okano 5:436b2c7854e8 65 * char snd_data[ DATA_LENGTH ];
okano 5:436b2c7854e8 66 * char rcv_data[ DATA_LENGTH ];
okano 5:436b2c7854e8 67 *
okano 5:436b2c7854e8 68 * for ( int i = 0; i < DATA_LENGTH; i++ ) {
okano 5:436b2c7854e8 69 * snd_data[ i ] = i;
okano 5:436b2c7854e8 70 * }
okano 5:436b2c7854e8 71 *
okano 5:436b2c7854e8 72 * while(1) {
okano 5:436b2c7854e8 73 * bridge.transfer( SLAVE_SELECT_NUM, snd_data, sizeof( snd_data ) );
okano 5:436b2c7854e8 74 * bridge.read_buffer( rcv_data, sizeof( rcv_data ) );
okano 5:436b2c7854e8 75 * data_check( rcv_data, DATA_LENGTH );
okano 5:436b2c7854e8 76 * }
okano 5:436b2c7854e8 77 * }
okano 5:436b2c7854e8 78 *
okano 5:436b2c7854e8 79 * void data_check( char *data, int length )
okano 5:436b2c7854e8 80 * {
okano 5:436b2c7854e8 81 * for ( int i = 0; i < length; i++ ) {
okano 5:436b2c7854e8 82 * if ( !(i % 16) )
okano 5:436b2c7854e8 83 * printf( "\r\n %02X :", i );
okano 5:436b2c7854e8 84 * printf( " %02X", data[ i ] );
okano 5:436b2c7854e8 85 * }
okano 5:436b2c7854e8 86 * }
okano 0:d4d72026aaf3 87 * @endcode
okano 0:d4d72026aaf3 88 */
okano 0:d4d72026aaf3 89
okano 0:d4d72026aaf3 90 class SC18IS606
okano 0:d4d72026aaf3 91 {
okano 0:d4d72026aaf3 92 public:
okano 0:d4d72026aaf3 93
okano 0:d4d72026aaf3 94 /** Function IDs */
okano 0:d4d72026aaf3 95 typedef enum {
okano 0:d4d72026aaf3 96 SPI_read_and_write = 0x00,
okano 0:d4d72026aaf3 97 Configure_SPI_Interface = 0xF0,
okano 0:d4d72026aaf3 98 Clear_Interrupt,
okano 0:d4d72026aaf3 99 Idle_mode,
okano 1:b44f801ac9f2 100 GPIO_Write = 0xF4,
okano 0:d4d72026aaf3 101 GPIO_Read,
okano 0:d4d72026aaf3 102 GPIO_Enable,
okano 7:9fee975998c1 103 GPIO_Configuration,
okano 7:9fee975998c1 104 Read_Version = 0xFE
okano 0:d4d72026aaf3 105 }
okano 0:d4d72026aaf3 106 FunctionID;
okano 0:d4d72026aaf3 107
okano 5:436b2c7854e8 108 /** Error Code */
okano 5:436b2c7854e8 109 typedef enum {
okano 5:436b2c7854e8 110 NO_ERROR = 0x00,
okano 5:436b2c7854e8 111 }
okano 5:436b2c7854e8 112 ErrorCode;
okano 5:436b2c7854e8 113
okano 5:436b2c7854e8 114 /** Create a SC18IS606 instance connected to specified I2C pins
okano 0:d4d72026aaf3 115 *
okano 5:436b2c7854e8 116 * @param sda I2C-bus SDA pin
okano 5:436b2c7854e8 117 * @param scl I2C-bus SCL pin
okano 5:436b2c7854e8 118 * @param i2c_address I2C slave address (option, default = 0x50)
okano 0:d4d72026aaf3 119 */
okano 0:d4d72026aaf3 120 SC18IS606( PinName sda, PinName scl, char i2c_address = DEFAULT_I2C_SLAVE_ADDRESS );
okano 0:d4d72026aaf3 121
okano 5:436b2c7854e8 122 /** Create a SC18IS606 instance connected to specified I2C instance
okano 0:d4d72026aaf3 123 *
okano 0:d4d72026aaf3 124 * @param i2c I2C object (instance)
okano 5:436b2c7854e8 125 * @param i2c_address I2C slave address (option, default = 0x50)
okano 0:d4d72026aaf3 126 */
okano 1:b44f801ac9f2 127 SC18IS606( I2C &i2c, char i2c_address = DEFAULT_I2C_SLAVE_ADDRESS );
okano 0:d4d72026aaf3 128
okano 0:d4d72026aaf3 129 /** Destractor
okano 0:d4d72026aaf3 130 */
okano 1:b44f801ac9f2 131 ~SC18IS606();
okano 0:d4d72026aaf3 132
okano 5:436b2c7854e8 133 /** Installing "wait function" for "SC18IS606::transfer()"
okano 5:436b2c7854e8 134 * "SC18IS606::transfer()" will callback install function to monitor SPI transfer completion
okano 5:436b2c7854e8 135 *
okano 5:436b2c7854e8 136 * @param block pointer to a function to monitor SPI transfer completion
okano 5:436b2c7854e8 137 */
okano 4:ac0aef91fd94 138 void install_wait_func( void (*block)( void ) )
okano 4:ac0aef91fd94 139 {
okano 4:ac0aef91fd94 140 wait_transfer_completion = block;
okano 4:ac0aef91fd94 141 }
okano 4:ac0aef91fd94 142
okano 5:436b2c7854e8 143 /** Transfer (execute SPI transfer)
okano 2:4e64923032ad 144 *
okano 2:4e64923032ad 145 * @param slave_select_num SPI slave select number (0 ~ 2)
okano 5:436b2c7854e8 146 * @param send_data_ptr Send_data_ptr
okano 2:4e64923032ad 147 * @param length Length of data array
okano 6:cfe7ec4f2b59 148 * @return I2C error state
okano 2:4e64923032ad 149 */
okano 2:4e64923032ad 150 int transfer( int slave_select_num, char *send_data_ptr, int length );
okano 2:4e64923032ad 151
okano 2:4e64923032ad 152 /** Read buffer (reading out received data from buffer)
okano 0:d4d72026aaf3 153 *
okano 5:436b2c7854e8 154 * @param receive_data_ptr Receive_data_ptr
okano 2:4e64923032ad 155 * @param length Length of data array
okano 6:cfe7ec4f2b59 156 * @return I2C error state
okano 0:d4d72026aaf3 157 */
okano 2:4e64923032ad 158 int read_buffer( char *receive_data_ptr, int length );
okano 2:4e64923032ad 159
okano 0:d4d72026aaf3 160 /** Set congiguration
okano 0:d4d72026aaf3 161 *
okano 0:d4d72026aaf3 162 * @param data Donfig data byte
okano 6:cfe7ec4f2b59 163 * @return I2C error state
okano 0:d4d72026aaf3 164 */
okano 0:d4d72026aaf3 165 int config( FunctionID fid, char data );
okano 0:d4d72026aaf3 166
okano 1:b44f801ac9f2 167 /** Clear interrupt
okano 1:b44f801ac9f2 168 *
okano 6:cfe7ec4f2b59 169 * @return I2C error state
okano 1:b44f801ac9f2 170 */
okano 1:b44f801ac9f2 171 int clear_interrupt( void );
okano 1:b44f801ac9f2 172
okano 6:cfe7ec4f2b59 173 /** Read version
okano 6:cfe7ec4f2b59 174 *
okano 6:cfe7ec4f2b59 175 * @return version info in string
okano 6:cfe7ec4f2b59 176 */
okano 6:cfe7ec4f2b59 177 char* read_version( void );
okano 6:cfe7ec4f2b59 178
okano 0:d4d72026aaf3 179 private:
okano 0:d4d72026aaf3 180
okano 0:d4d72026aaf3 181 enum {
okano 1:b44f801ac9f2 182 DEFAULT_I2C_SLAVE_ADDRESS = 0x50
okano 0:d4d72026aaf3 183 };
okano 0:d4d72026aaf3 184
okano 4:ac0aef91fd94 185 int init( void);
okano 1:b44f801ac9f2 186
okano 0:d4d72026aaf3 187 I2C *i2c_p;
okano 0:d4d72026aaf3 188 I2C &i2c;
okano 0:d4d72026aaf3 189 char device_address;
okano 4:ac0aef91fd94 190 void (*wait_transfer_completion)( void );
okano 0:d4d72026aaf3 191 };
okano 0:d4d72026aaf3 192
okano 0:d4d72026aaf3 193 #endif // end of "#ifndef MBED_SC18IS606"