test version 0.2
Dependents: SC18IS606_Hello SC18IS606_EEPROM_access_test SC18IS606_OS6_Hello
SC18IS606.h@5:436b2c7854e8, 2021-07-28 (annotated)
- Committer:
- okano
- Date:
- Wed Jul 28 01:26:27 2021 +0000
- Revision:
- 5:436b2c7854e8
- Parent:
- 4:ac0aef91fd94
- Child:
- 6:cfe7ec4f2b59
doxygen comment added
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:4e64923032ad | 147 | * @return dummy |
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 | 2:4e64923032ad | 155 | * @return dummy |
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 | 0:d4d72026aaf3 | 162 | * @return dummy |
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 | 1:b44f801ac9f2 | 168 | * @return dummy |
okano | 1:b44f801ac9f2 | 169 | */ |
okano | 1:b44f801ac9f2 | 170 | int clear_interrupt( void ); |
okano | 1:b44f801ac9f2 | 171 | |
okano | 0:d4d72026aaf3 | 172 | private: |
okano | 0:d4d72026aaf3 | 173 | |
okano | 0:d4d72026aaf3 | 174 | enum { |
okano | 1:b44f801ac9f2 | 175 | DEFAULT_I2C_SLAVE_ADDRESS = 0x50 |
okano | 0:d4d72026aaf3 | 176 | }; |
okano | 0:d4d72026aaf3 | 177 | |
okano | 4:ac0aef91fd94 | 178 | int init( void); |
okano | 1:b44f801ac9f2 | 179 | |
okano | 0:d4d72026aaf3 | 180 | I2C *i2c_p; |
okano | 0:d4d72026aaf3 | 181 | I2C &i2c; |
okano | 0:d4d72026aaf3 | 182 | char device_address; |
okano | 4:ac0aef91fd94 | 183 | void (*wait_transfer_completion)( void ); |
okano | 0:d4d72026aaf3 | 184 | }; |
okano | 0:d4d72026aaf3 | 185 | |
okano | 0:d4d72026aaf3 | 186 | #endif // end of "#ifndef MBED_SC18IS606" |