for SC16IS750 test program. Confirming register access method

Revision:
0:bae17cf3178e
Child:
1:d9a4b7a4a159
diff -r 000000000000 -r bae17cf3178e SC16IS750.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SC16IS750.cpp	Wed Jul 18 01:24:33 2012 +0000
@@ -0,0 +1,91 @@
+#include    "mbed.h"
+#include    "SC16IS750.h"
+
+#define XTAL_FREQUENCY          14784000    //  Hz
+#define REGISTER_ACCESS_SIZE    2
+
+char    init[][ REGISTER_ACCESS_SIZE ] = {
+    { SC16IS750::LCR, 0x80 },
+    { SC16IS750::DLL, 0x60 },
+    { SC16IS750::DLH, 0x00 },
+    { SC16IS750::LCR, 0xBF },
+    { SC16IS750::EFR, 0x10 },
+    { SC16IS750::LCR, 0x03 },
+    { SC16IS750::IER, 0x00 },
+    { SC16IS750::FCR, 0x07 },
+};
+
+
+SC16IS750::SC16IS750(
+    PinName I2C_sda,
+    PinName I2C_scl,
+    int     baud_rate,
+    char    I2C_address
+) : i2c( I2C_sda, I2C_scl ), i2c_addr( I2C_address ) {
+
+    int     baud_setting;
+
+    i2c.frequency( 400 * 1000 );
+
+    baud_setting    = XTAL_FREQUENCY / (baud_rate * 16);    
+    init[ 1 ][ 1 ]  = (char)baud_setting;
+    init[ 2 ][ 1 ]  = (char)(baud_setting >> 8);
+    
+    init_registers();
+}
+
+void SC16IS750::init_registers( void ) {
+    for ( int i = 0; i <  (sizeof( init ) / REGISTER_ACCESS_SIZE); i++ )
+        i2c.write( i2c_addr, init[ i ], REGISTER_ACCESS_SIZE );
+
+    i2c.stop();
+}
+
+void SC16IS750::set_baud( int baud ) {
+    int     baud_setting;
+
+    baud_rate   = baud;
+    baud_setting    = XTAL_FREQUENCY / (baud_rate * 16);    
+
+    register_write( SC16IS750::LCR, 0x80 );
+    register_write( SC16IS750::DLL, (char)baud_setting );
+    register_write( SC16IS750::DLH, (char)(baud_setting >> 8) );
+    register_write( SC16IS750::LCR, 0x03 );
+}
+
+void SC16IS750::send_str( char *s ) {
+    char    buffer[ 65 ];
+    int     i   = 1;
+
+    buffer[ 0 ] = 0x00; //  register address
+
+#if 0
+    while ( buffer[ i++ ]   = *s++ )
+        ;
+#else
+    for ( i = 1; i < 65; i++ )
+        if ( !(buffer[ i ]   = *s++) )
+            break;
+#endif
+
+    i2c.write( i2c_addr, buffer, i );
+}
+
+
+void SC16IS750::register_write( char register_address, char data ) {
+    char    w[ 2 ];
+
+    w[ 0 ]  = register_address;
+    w[ 1 ]  = data;
+
+    i2c.write( i2c_addr, w, 2 );
+}
+
+char SC16IS750::register_read( char register_address ) {
+    char    r;
+
+    i2c.write( i2c_addr, &register_address, 1 );
+    i2c.read( i2c_addr, &r, 1 );
+
+    return ( r );
+}