RETRO ROBOT E
Dependents: RETRO_ROBOT_SC16IS750E
Fork of SC16IS750 by
SC16IS750.h
- Committer:
- wim
- Date:
- 2014-01-22
- Revision:
- 0:d64854a60f95
- Child:
- 1:0440152c5387
File content as of revision 0:d64854a60f95:
/* SC16IS750 interface * /////////////////////v1.0 Tedd OKANO, 18 Jul 2012, I2C I/F only, MIT License * v1.1 WH, Nov 2013, Added SPI I/F and more methods, MIT License * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software without restriction, * including without limitation the rights to use, copy, modify, merge, publish, distribute, * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or * substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #ifndef _SC16IS750_H #define _SC16IS750_H //Default I2C Slaveaddress #define DEFAULT_SC16IS750_ADDR 0x9A //Default baudrate #define DEFAULT_BAUD_RATE 9600 #define ENABLE_BULK_TRANSFERS 0x01 //#include "Configuration.h" #define XTAL_FREQUENCY 14745600UL // On-board crystal (New mid-2010 Version) // See datasheet section 7.8 for configuring the // "Programmable baud rate generator" #define PRESCALER 1 // Default prescaler after reset #define BAUD_RATE_DIVISOR(baud) ((XTAL_FREQUENCY/PRESCALER)/(baud*16UL)) // See section 8.4 of the datasheet for definitions // of bits in the Line Control Register (LCR) #define LCR_BITS5 0x00 #define LCR_BITS6 0x01 #define LCR_BITS7 0x02 #define LCR_BITS8 0x03 #define LCR_BITS1 0x00 #define LCR_BITS2 0x04 #define LCR_NONE 0x00 #define LCR_ODD 0x08 #define LCR_EVEN 0x18 #define LCR_FORCED1 0x28 #define LCR_FORCED0 0x38 #define LCR_BRK_ENA 0x40 #define LCR_BRK_DIS 0x00 #define LCR_DIV_ENA 0x80 #define LCR_DIV_DIS 0x00 // See section 8.10 of the datasheet for definitions // of bits in the Enhanced Features Register (EFR) #define EFR_ENABLE_CTS (1 << 7) #define EFR_ENABLE_RTS (1 << 6) #define EFR_ENABLE_ENHANCED_FUNCTIONS (1 << 4) // See Chapter 11 of datasheet #define SPI_READ_MODE_FLAG 0x80 /** Abstract class SC16IS750 for a converter between either SPI or I2C and a Serial port * * Supports both SPI and I2C interfaces through derived classes * * @code * * @endcode */ //class SC16IS750 : public Serial { //Fout, geen Serial constr met Serial(NC, NC) toegestaan... class SC16IS750 { public: // SC16IS750 Register definitions (shifted to align) enum RegisterName { RHR = 0x00 << 3, THR = 0x00 << 3, IER = 0x01 << 3, FCR = 0x02 << 3, IIR = 0x02 << 3, LCR = 0x03 << 3, MCR = 0x04 << 3, LSR = 0x05 << 3, MSR = 0x06 << 3, SPR = 0x07 << 3, TCR = 0x06 << 3, TLR = 0x07 << 3, TXLVL = 0x08 << 3, RXLVL = 0x09 << 3, IODIR = 0x0A << 3, IOSTATE = 0x0B << 3, IOINTMSK = 0x0C << 3, reserved = 0x0D << 3, IOCTRL = 0x0E << 3, EFCR = 0x0F << 3, DLL = 0x00 << 3, DLH = 0x01 << 3, EFR = 0x02 << 3, XON1 = 0x04 << 3, XON2 = 0x05 << 3, XOFF1 = 0x06 << 3, XOFF2 = 0x07 << 3, } ; // SC16IS750 configuration register values struct SC16IS750_cfg { char baudrate; char dataformat; char flowctrl; char fifoformat; }; /** Constructor * */ SC16IS750(); /** Determine if there is a character available to read. * @return 1 if there is a character available to read, 0 otherwise */ int readable(); /** Determine if how many characters available to read. * @return int Characters available to read */ int readableCount(); /** Determine if there is space available to write a character. * @return 1 if there is a space for a character to write, 0 otherwise */ int writable(); /** Determine if how much space is available to write characters. * @return int Characterspace available for writing */ int writableCount(); char getc(); void putc(char value); void write(const char *str); /** Set baudrate of the serial port. * @param baud integer baudrate (4800, 9600 etc) * @return none */ void baud(int baudrate = DEFAULT_BAUD_RATE); /** Set the transmission format used by the serial port. * @param bits The number of bits in a word (5-8; default = 8) * @param parity The parity used (Serial::None, Serial::Odd, Serial::Even, Serial::Forced1, Serial::Forced0; default = Serial::None) * @param stop_bits The number of stop bits (1 or 2; default = 1) */ void format(int bits=8, Serial::Parity parity=Serial::None, int stop_bits=1); /** * Check that UART is connected and operational. * @param none * @return bool true when connected, false otherwise */ bool connected(); #if ENABLE_BULK_TRANSFERS void write(const uint8_t *buffer, size_t size); #else // using Print::write; #endif void flush(); //required for Stream int peek() {return 0;}; // These are specific to the SPI UART void ioSetDirection(unsigned char bits); void ioSetState(unsigned char bits); /** Write value to internal register. * Pure virtual, must be declared in derived class. * @param register_address The address of the Register (enum RegisterName) * @param data The 8bit value to write * @return none */ virtual void writeRegister (RegisterName register_address, char data ) =0; /** Read value from internal register. * Pure virtual, must be declared in derived class. * @param register_address The address of the Register (enum RegisterName) * @return char The 8bit value read from the register */ virtual char readRegister (RegisterName register_address ) =0; protected: //protected is accessible to derived classes, but not to external users SC16IS750_cfg _config; private: //private is not accessible to derived classes, nor external users void init(); }; /** Class SC16IS750_SPI for a converter between SPI and a Serial port * * @code * #include "mbed.h" * #include "SC16IS750.h" * * SPI spi(PTD2, PTD3, PTD1); //MOSI, MISO, SCK * SC16IS750_SPI serial_spi(&spi, PTD0); * * Serial pc(USBTX,USBRX); * * int main() { * pc.printf("\nHello World!\n"); * * while(1) { * serial_spi.ioSetState(0x00); * wait(0.5); * pc.putc('*'); * } * } * * @endcode */ class SC16IS750_SPI : public SC16IS750 { public: /** Create a SC16IS750_SPI object using a specified SPI bus and CS * * @param SPI &spi the SPI port to connect to * @param cs the Pin of the CS */ SC16IS750_SPI(SPI *spi, PinName cs); /** Write value to internal register. * @param register_address The address of the Register (enum RegisterName) * @param data The 8bit value to write * @return none */ virtual void writeRegister(SC16IS750::RegisterName registerAddress, char data); /** Read value from internal register. * @param register_address The address of the Register (enum RegisterName) * @return char The 8bit value read from the register */ virtual char readRegister(SC16IS750::RegisterName registerAddress); protected: //protected is accessible to derived classes, but not to external users private: SPI *_spi; //SPI bus reference DigitalOut _cs; //CS of SPI device }; /** Class SC16IS750_I2C for a converter between I2C and a Serial port * * @code * #include "mbed.h" * #include "SC16IS750.h" * * I2C i2c(PTE0, PTE1); //SDA, SCL * SC16IS750_I2C serial_i2c(&i2c, DEFAULT_SC16IS750_ADDR); * * Serial pc(USBTX,USBRX); * * int main() { * pc.printf("\nHello World!\n"); * * while(1) { * serial_i2c.ioSetState(0x00); * wait(0.5); * pc.putc('*'); * } * } * * @endcode */ class SC16IS750_I2C : public SC16IS750 { public: /** Create a SC16IS750_I2C object using a specified I2C bus and slaveaddress * * @param I2C &i2c the I2C port to connect to * @param char deviceAddress the address of the SC16IS750 */ SC16IS750_I2C(I2C *i2c, uint8_t deviceAddress = DEFAULT_SC16IS750_ADDR); /** Write value to internal register. * @param register_address The address of the Register (enum RegisterName) * @param data The 8bit value to write * @return none */ virtual void writeRegister(SC16IS750::RegisterName register_address, char data ); /** Read value from internal register. * @param register_address The address of the Register (enum RegisterName) * @return char The 8bit value read from the register */ virtual char readRegister(SC16IS750::RegisterName register_address ); protected: //protected is accessible to derived classes, but not to external users private: I2C *_i2c; //I2C bus reference uint8_t _slaveAddress; //I2C Slave address of device }; #endif // _SC16IS750_H