Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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, ®ister_address, 1 ); 00090 i2c.read( i2c_addr, &r, 1 ); 00091 00092 return ( r ); 00093 }
Generated on Wed Jul 13 2022 17:45:05 by
1.7.2