SC18IS606: I2C-->SPI protocol bridge test program with EEPROM

Dependencies:   mbed SC18IS606

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 https://os.mbed.com/media/uploads/okano/untitled.png

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?

UserRevisionLine numberNew 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 }