SC18IS606: I2C-->SPI protocol bridge test program with EEPROM
Sample code for SC18IS606 class library (using SPI interface EEPROM)
The SC18IS606 : I2C-bus to SPI bridge
This is a EEPROM operation sample code using SC18IS606 class library. Showing how to send/receive data to/from SPI bus through this bridge chip.
Wiring between the mend and the SC18IS606 evaluation board
main.cpp@0:b947375dee80, 2021-07-28 (annotated)
- Committer:
- okano
- Date:
- Wed Jul 28 02:05:50 2021 +0000
- Revision:
- 0:b947375dee80
test program with EEPROM operation
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
okano | 0:b947375dee80 | 1 | /* |
okano | 0:b947375dee80 | 2 | * Operation sample code for SC18IS606 library, using EEPROM (AT25010B) |
okano | 0:b947375dee80 | 3 | * |
okano | 0:b947375dee80 | 4 | * @author Akifumi (Tedd) OKANO, NXP Semiconductors |
okano | 0:b947375dee80 | 5 | * @version 0.2 |
okano | 0:b947375dee80 | 6 | * @date 28-July-2021 |
okano | 0:b947375dee80 | 7 | * |
okano | 0:b947375dee80 | 8 | * SC18IS606 is an "I2C-bus to SPI bridge" |
okano | 0:b947375dee80 | 9 | * http://www.nxp.com/ (product infomation page will be updated later) |
okano | 0:b947375dee80 | 10 | */ |
okano | 0:b947375dee80 | 11 | |
okano | 0:b947375dee80 | 12 | #include "mbed.h" |
okano | 0:b947375dee80 | 13 | #include "SC18IS606.h" |
okano | 0:b947375dee80 | 14 | |
okano | 0:b947375dee80 | 15 | I2C i2c( p28, p27 ); |
okano | 0:b947375dee80 | 16 | InterruptIn int_line( p21 ); |
okano | 0:b947375dee80 | 17 | SC18IS606 bridge( i2c ); |
okano | 0:b947375dee80 | 18 | |
okano | 0:b947375dee80 | 19 | #define I2C_FREQUENCY (400 * 1000) // Hz |
okano | 0:b947375dee80 | 20 | #define SLAVE_SELECT_NUM 1 // AT25010B is connected to /SS1 pin |
okano | 0:b947375dee80 | 21 | |
okano | 0:b947375dee80 | 22 | #define WRITE_DATA_LENGTH 8 // 1 or 8 (single byte or page write) |
okano | 0:b947375dee80 | 23 | #define TRANSFER_LENGTH (2 + WRITE_DATA_LENGTH) // AT25010B needs command(1 byte), address(1 byte) + data(1 or 8 byte) |
okano | 0:b947375dee80 | 24 | #define READ_DATA_LENGTH 128 |
okano | 0:b947375dee80 | 25 | #define RCV_LENGTH (2 + READ_DATA_LENGTH) // AT25010B returnss 2 bytes dummy + data(1 or 8 byte) |
okano | 0:b947375dee80 | 26 | |
okano | 0:b947375dee80 | 27 | void data_check( char *data, int length ); |
okano | 0:b947375dee80 | 28 | |
okano | 0:b947375dee80 | 29 | volatile int int_flag = false; |
okano | 0:b947375dee80 | 30 | |
okano | 0:b947375dee80 | 31 | void int_handler() |
okano | 0:b947375dee80 | 32 | { |
okano | 0:b947375dee80 | 33 | int_flag = true; |
okano | 0:b947375dee80 | 34 | } |
okano | 0:b947375dee80 | 35 | |
okano | 0:b947375dee80 | 36 | void wait_transfer_done( void ) |
okano | 0:b947375dee80 | 37 | { |
okano | 0:b947375dee80 | 38 | while ( !int_flag ) |
okano | 0:b947375dee80 | 39 | ; |
okano | 0:b947375dee80 | 40 | |
okano | 0:b947375dee80 | 41 | bridge.clear_interrupt(); |
okano | 0:b947375dee80 | 42 | int_flag = false; |
okano | 0:b947375dee80 | 43 | } |
okano | 0:b947375dee80 | 44 | |
okano | 0:b947375dee80 | 45 | void hardware_settings( void ) |
okano | 0:b947375dee80 | 46 | { |
okano | 0:b947375dee80 | 47 | int_line.mode( PullUp ); |
okano | 0:b947375dee80 | 48 | int_line.fall( &int_handler ); |
okano | 0:b947375dee80 | 49 | i2c.frequency( I2C_FREQUENCY ); |
okano | 0:b947375dee80 | 50 | } |
okano | 0:b947375dee80 | 51 | |
okano | 0:b947375dee80 | 52 | int main() |
okano | 0:b947375dee80 | 53 | { |
okano | 0:b947375dee80 | 54 | printf( "SC18IS606 Hello\r\n" ); |
okano | 0:b947375dee80 | 55 | |
okano | 0:b947375dee80 | 56 | hardware_settings(); |
okano | 0:b947375dee80 | 57 | bridge.install_wait_func( wait_transfer_done ); |
okano | 0:b947375dee80 | 58 | |
okano | 0:b947375dee80 | 59 | char snd_data[ TRANSFER_LENGTH ]; |
okano | 0:b947375dee80 | 60 | char rcv_data[ RCV_LENGTH ]; |
okano | 0:b947375dee80 | 61 | char write_enable = 0x06; |
okano | 0:b947375dee80 | 62 | |
okano | 0:b947375dee80 | 63 | snd_data[ 0 ] = 0x02; |
okano | 0:b947375dee80 | 64 | |
okano | 0:b947375dee80 | 65 | int count = 0; |
okano | 0:b947375dee80 | 66 | |
okano | 0:b947375dee80 | 67 | while ( true ) { |
okano | 0:b947375dee80 | 68 | for ( int d = 0; d < READ_DATA_LENGTH; d += WRITE_DATA_LENGTH ) { |
okano | 0:b947375dee80 | 69 | snd_data[ 1 ] = d; |
okano | 0:b947375dee80 | 70 | for ( int i = 0; i < WRITE_DATA_LENGTH; i++ ) { |
okano | 0:b947375dee80 | 71 | snd_data[ i + 2 ] = (count & 0x1) ? ~(d + i) : (d + i); |
okano | 0:b947375dee80 | 72 | } |
okano | 0:b947375dee80 | 73 | |
okano | 0:b947375dee80 | 74 | bridge.transfer( SLAVE_SELECT_NUM, &write_enable, sizeof( write_enable ) ); |
okano | 0:b947375dee80 | 75 | bridge.transfer( SLAVE_SELECT_NUM, snd_data, sizeof( snd_data ) ); |
okano | 0:b947375dee80 | 76 | |
okano | 0:b947375dee80 | 77 | wait_ms(1); |
okano | 0:b947375dee80 | 78 | } |
okano | 0:b947375dee80 | 79 | |
okano | 0:b947375dee80 | 80 | rcv_data[ 0 ] = 0x03; |
okano | 0:b947375dee80 | 81 | rcv_data[ 1 ] = 0x00; |
okano | 0:b947375dee80 | 82 | |
okano | 0:b947375dee80 | 83 | bridge.transfer( SLAVE_SELECT_NUM, rcv_data, sizeof( rcv_data ) ); |
okano | 0:b947375dee80 | 84 | bridge.read_buffer( rcv_data, sizeof( rcv_data ) ); |
okano | 0:b947375dee80 | 85 | |
okano | 0:b947375dee80 | 86 | data_check( rcv_data + 2, sizeof( rcv_data ) - 2 ); |
okano | 0:b947375dee80 | 87 | count++; |
okano | 0:b947375dee80 | 88 | } |
okano | 0:b947375dee80 | 89 | } |
okano | 0:b947375dee80 | 90 | |
okano | 0:b947375dee80 | 91 | |
okano | 0:b947375dee80 | 92 | void data_check( char *data, int length ) |
okano | 0:b947375dee80 | 93 | { |
okano | 0:b947375dee80 | 94 | printf( "\r\ndata_check:" ); |
okano | 0:b947375dee80 | 95 | for ( int i = 0; i < length; i++ ) { |
okano | 0:b947375dee80 | 96 | if ( !(i % 16) ) |
okano | 0:b947375dee80 | 97 | printf( "\r\n %02X :", i ); |
okano | 0:b947375dee80 | 98 | printf( " %02X", data[ i ] ); |
okano | 0:b947375dee80 | 99 | } |
okano | 0:b947375dee80 | 100 | } |