Tedd OKANO / SC16IS750
Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers SC16IS750.cpp Source File

SC16IS750.cpp

00001 #include    "mbed.h"
00002 #include    "SC16IS750.h"
00003 
00004 #define XTAL_FREQUENCY              14784000    //  Hz
00005 #define REGISTER_ACCESS_SIZE        2
00006 
00007 #define REGISTER_INIT_BY_RESTART    true
00008 
00009 char    init[][ REGISTER_ACCESS_SIZE ] = {
00010     { SC16IS750::LCR, 0x80 },
00011     { SC16IS750::DLL, 0x60 },
00012     { SC16IS750::DLH, 0x00 },
00013     { SC16IS750::LCR, 0xBF },
00014     { SC16IS750::EFR, 0x10 },
00015     { SC16IS750::LCR, 0x03 },
00016     { SC16IS750::IER, 0x00 },
00017     { SC16IS750::FCR, 0x07 },
00018 };
00019 
00020 
00021 SC16IS750::SC16IS750(
00022     PinName I2C_sda,
00023     PinName I2C_scl,
00024     int     baud_rate,
00025     char    I2C_address
00026 ) : i2c( I2C_sda, I2C_scl ), i2c_addr( I2C_address ) {
00027 
00028     int     baud_setting;
00029 
00030     i2c.frequency( 400 * 1000 );
00031 
00032     baud_setting    = XTAL_FREQUENCY / (baud_rate * 16);
00033     init[ 1 ][ 1 ]  = (char)baud_setting;
00034     init[ 2 ][ 1 ]  = (char)(baud_setting >> 8);
00035 
00036     init_registers();
00037     
00038     i2c.stop();
00039 }
00040 
00041 void SC16IS750::set_baud( int baud ) {
00042     int     baud_setting;
00043 
00044     baud_rate   = baud;
00045     baud_setting    = XTAL_FREQUENCY / (baud_rate * 16);
00046 
00047     register_write( SC16IS750::LCR, 0x80 );
00048     register_write( SC16IS750::DLL, (char)baud_setting );
00049     register_write( SC16IS750::DLH, (char)(baud_setting >> 8) );
00050     register_write( SC16IS750::LCR, 0x03 );
00051 }
00052 
00053 void SC16IS750::init_registers( void ) {
00054     for ( int i = 0; i <  (sizeof( init ) / REGISTER_ACCESS_SIZE); i++ )
00055         i2c.write( i2c_addr, init[ i ], REGISTER_ACCESS_SIZE, REGISTER_INIT_BY_RESTART );
00056 }
00057 
00058 void SC16IS750::send_str( const char *s ) {
00059     char    buffer[ 65 ];
00060     int     i   = 1;
00061 
00062     buffer[ 0 ] = 0x00; //  register address
00063 
00064 #if 0
00065     while ( buffer[ i++ ]   = *s++ )
00066         ;
00067 #else
00068     for ( i = 1; i < 65; i++ )
00069         if ( !(buffer[ i ]   = *s++) )
00070             break;
00071 #endif
00072 
00073     i2c.write( i2c_addr, buffer, i );
00074 }
00075 
00076 
00077 void SC16IS750::register_write( char register_address, char data ) {
00078     char    w[ 2 ];
00079 
00080     w[ 0 ]  = register_address;
00081     w[ 1 ]  = data;
00082 
00083     i2c.write( i2c_addr, w, 2 );
00084 }
00085 
00086 char SC16IS750::register_read( char register_address ) {
00087     char    r;
00088 
00089     i2c.write( i2c_addr, &register_address, 1 );
00090     i2c.read( i2c_addr, &r, 1 );
00091 
00092     return ( r );
00093 }