test version 0.2

Dependents:   SC18IS606_Hello SC18IS606_EEPROM_access_test SC18IS606_OS6_Hello

Committer:
okano
Date:
Wed Jul 28 20:20:15 2021 +0000
Revision:
6:cfe7ec4f2b59
Parent:
5:436b2c7854e8
Child:
7:9fee975998c1
(1) comment corrected, (2) "read version" function added

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 0:d4d72026aaf3 103 GPIO_Configuration
okano 0:d4d72026aaf3 104 }
okano 0:d4d72026aaf3 105 FunctionID;
okano 0:d4d72026aaf3 106
okano 5:436b2c7854e8 107 /** Error Code */
okano 5:436b2c7854e8 108 typedef enum {
okano 5:436b2c7854e8 109 NO_ERROR = 0x00,
okano 5:436b2c7854e8 110 }
okano 5:436b2c7854e8 111 ErrorCode;
okano 5:436b2c7854e8 112
okano 5:436b2c7854e8 113 /** Create a SC18IS606 instance connected to specified I2C pins
okano 0:d4d72026aaf3 114 *
okano 5:436b2c7854e8 115 * @param sda I2C-bus SDA pin
okano 5:436b2c7854e8 116 * @param scl I2C-bus SCL pin
okano 5:436b2c7854e8 117 * @param i2c_address I2C slave address (option, default = 0x50)
okano 0:d4d72026aaf3 118 */
okano 0:d4d72026aaf3 119 SC18IS606( PinName sda, PinName scl, char i2c_address = DEFAULT_I2C_SLAVE_ADDRESS );
okano 0:d4d72026aaf3 120
okano 5:436b2c7854e8 121 /** Create a SC18IS606 instance connected to specified I2C instance
okano 0:d4d72026aaf3 122 *
okano 0:d4d72026aaf3 123 * @param i2c I2C object (instance)
okano 5:436b2c7854e8 124 * @param i2c_address I2C slave address (option, default = 0x50)
okano 0:d4d72026aaf3 125 */
okano 1:b44f801ac9f2 126 SC18IS606( I2C &i2c, char i2c_address = DEFAULT_I2C_SLAVE_ADDRESS );
okano 0:d4d72026aaf3 127
okano 0:d4d72026aaf3 128 /** Destractor
okano 0:d4d72026aaf3 129 */
okano 1:b44f801ac9f2 130 ~SC18IS606();
okano 0:d4d72026aaf3 131
okano 5:436b2c7854e8 132 /** Installing "wait function" for "SC18IS606::transfer()"
okano 5:436b2c7854e8 133 * "SC18IS606::transfer()" will callback install function to monitor SPI transfer completion
okano 5:436b2c7854e8 134 *
okano 5:436b2c7854e8 135 * @param block pointer to a function to monitor SPI transfer completion
okano 5:436b2c7854e8 136 */
okano 4:ac0aef91fd94 137 void install_wait_func( void (*block)( void ) )
okano 4:ac0aef91fd94 138 {
okano 4:ac0aef91fd94 139 wait_transfer_completion = block;
okano 4:ac0aef91fd94 140 }
okano 4:ac0aef91fd94 141
okano 5:436b2c7854e8 142 /** Transfer (execute SPI transfer)
okano 2:4e64923032ad 143 *
okano 2:4e64923032ad 144 * @param slave_select_num SPI slave select number (0 ~ 2)
okano 5:436b2c7854e8 145 * @param send_data_ptr Send_data_ptr
okano 2:4e64923032ad 146 * @param length Length of data array
okano 6:cfe7ec4f2b59 147 * @return I2C error state
okano 2:4e64923032ad 148 */
okano 2:4e64923032ad 149 int transfer( int slave_select_num, char *send_data_ptr, int length );
okano 2:4e64923032ad 150
okano 2:4e64923032ad 151 /** Read buffer (reading out received data from buffer)
okano 0:d4d72026aaf3 152 *
okano 5:436b2c7854e8 153 * @param receive_data_ptr Receive_data_ptr
okano 2:4e64923032ad 154 * @param length Length of data array
okano 6:cfe7ec4f2b59 155 * @return I2C error state
okano 0:d4d72026aaf3 156 */
okano 2:4e64923032ad 157 int read_buffer( char *receive_data_ptr, int length );
okano 2:4e64923032ad 158
okano 0:d4d72026aaf3 159 /** Set congiguration
okano 0:d4d72026aaf3 160 *
okano 0:d4d72026aaf3 161 * @param data Donfig data byte
okano 6:cfe7ec4f2b59 162 * @return I2C error state
okano 0:d4d72026aaf3 163 */
okano 0:d4d72026aaf3 164 int config( FunctionID fid, char data );
okano 0:d4d72026aaf3 165
okano 1:b44f801ac9f2 166 /** Clear interrupt
okano 1:b44f801ac9f2 167 *
okano 6:cfe7ec4f2b59 168 * @return I2C error state
okano 1:b44f801ac9f2 169 */
okano 1:b44f801ac9f2 170 int clear_interrupt( void );
okano 1:b44f801ac9f2 171
okano 6:cfe7ec4f2b59 172 /** Read version
okano 6:cfe7ec4f2b59 173 *
okano 6:cfe7ec4f2b59 174 * @return version info in string
okano 6:cfe7ec4f2b59 175 */
okano 6:cfe7ec4f2b59 176 char* read_version( void );
okano 6:cfe7ec4f2b59 177
okano 0:d4d72026aaf3 178 private:
okano 0:d4d72026aaf3 179
okano 0:d4d72026aaf3 180 enum {
okano 1:b44f801ac9f2 181 DEFAULT_I2C_SLAVE_ADDRESS = 0x50
okano 0:d4d72026aaf3 182 };
okano 0:d4d72026aaf3 183
okano 4:ac0aef91fd94 184 int init( void);
okano 1:b44f801ac9f2 185
okano 0:d4d72026aaf3 186 I2C *i2c_p;
okano 0:d4d72026aaf3 187 I2C &i2c;
okano 0:d4d72026aaf3 188 char device_address;
okano 4:ac0aef91fd94 189 void (*wait_transfer_completion)( void );
okano 0:d4d72026aaf3 190 };
okano 0:d4d72026aaf3 191
okano 0:d4d72026aaf3 192 #endif // end of "#ifndef MBED_SC18IS606"