mini board PCU9669 (and PCA9665) sample code
Dependencies: mbed PCU9669 utility PCA9665 I2C_slaves parallel_bus
Fork of mini_board_PCU9669_old by
Sample code for PCU9669 (PCU9661, PCA9663, PCA9661 and PCA9665) evaluation board.
PCU9669 evaluation board: Mini board PCU9669
User manual is available -> http://www.nxp.com/documents/user_manual/UM10580.pdf
Revision 8:6120bbbe3636, committed 2012-03-28
- Comitter:
- nxp_ip
- Date:
- Wed Mar 28 04:32:50 2012 +0000
- Parent:
- 7:87fd13f1faa6
- Child:
- 9:7a7d4292dfe9
- Commit message:
- correction for comment on header part of each files (date: 26-Mar-2011 --> 26-Mar-2012)
Changed in this revision
--- a/config.h Wed Mar 28 04:29:27 2012 +0000 +++ b/config.h Wed Mar 28 04:32:50 2012 +0000 @@ -1,34 +1,34 @@ -/** A sample code for "mini board PCU9669/PCA9665" - * - * @author Akifumi (Tedd) OKANO, NXP Semiconductors - * @version 1.0 - * @date 26-Mar-2011 - * - * Released under the MIT License: http://mbed.org/license/mit - * - * An operation sample of PCU9669/PCA9665 I2C bus controller. - * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. - * The bit-banging is poerformed by PortInOut function of mbed library. - * - * To make the code porting easier, all codes are partitioned into layers to abstract other parts. - * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". - * This module may need to be modified for the porting. - * - * All other upper layers are writen in standard-C. - * - * base code is written from 05-Sep-2011 to 09-Sep-2011. - * And demo code has been build on 11-Sep-2011. - * Debug and code adjustment has been done on 08-Sep-2011. - * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 - * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 - * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. - * - * Before builidng the code, please edit the file mini_board_PCU9669/config.h - * Un-comment the target name what you want to target. - */ - -#define CODE_FOR_PCU9669 -//#define CODE_FOR_PCA9663 -//#define CODE_FOR_PCA9665 - - +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +#define CODE_FOR_PCU9669 +//#define CODE_FOR_PCA9663 +//#define CODE_FOR_PCA9665 + +
--- a/main_PCA9665.c Wed Mar 28 04:29:27 2012 +0000 +++ b/main_PCA9665.c Wed Mar 28 04:32:50 2012 +0000 @@ -2,7 +2,7 @@ * * @author Akifumi (Tedd) OKANO, NXP Semiconductors * @version 1.0 - * @date 26-Mar-2011 + * @date 26-Mar-2012 * * Released under the MIT License: http://mbed.org/license/mit *
--- a/main_PCU9669.c Wed Mar 28 04:29:27 2012 +0000 +++ b/main_PCU9669.c Wed Mar 28 04:32:50 2012 +0000 @@ -2,7 +2,7 @@ * * @author Akifumi (Tedd) OKANO, NXP Semiconductors * @version 1.0 - * @date 26-Mar-2011 + * @date 26-Mar-2012 * * Released under the MIT License: http://mbed.org/license/mit *
--- a/mini_board_libs/I2C_slaves/PCA9629_reg.h Wed Mar 28 04:29:27 2012 +0000 +++ b/mini_board_libs/I2C_slaves/PCA9629_reg.h Wed Mar 28 04:32:50 2012 +0000 @@ -1,66 +1,66 @@ -/** A sample code for "mini board PCU9669/PCA9665" - * - * @author Akifumi (Tedd) OKANO, NXP Semiconductors - * @version 1.0 - * @date 26-Mar-2011 - * - * Released under the MIT License: http://mbed.org/license/mit - * - * An operation sample of PCU9669/PCA9665 I2C bus controller. - * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. - * The bit-banging is poerformed by PortInOut function of mbed library. - * - * To make the code porting easier, all codes are partitioned into layers to abstract other parts. - * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". - * This module may need to be modified for the porting. - * - * All other upper layers are writen in standard-C. - * - * base code is written from 05-Sep-2011 to 09-Sep-2011. - * And demo code has been build on 11-Sep-2011. - * Debug and code adjustment has been done on 08-Sep-2011. - * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 - * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 - * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. - * - * Before builidng the code, please edit the file mini_board_PCU9669/config.h - * Un-comment the target name what you want to target. - */ - - -/** PCA9629 related definitions - * - * PCA9629's internal register name and address definitions, I2C address difinitions - */ - -#ifndef MINIBOARD_PCA9629_REG__ -#define MINIBOARD_PCA9629_REG__ - - -/** @var PCA9629 I2C bus addresses - */ - -typedef enum { - PCA9629_ADDR0 = 0x40, - PCA9629_ADDR1 = 0x42, - PCA9629_ADDR2 = 0x44, - PCA9629_ADDR3 = 0x46, - PCA9629_ADDR4 = 0x48, - PCA9629_ADDR5 = 0x4A, - PCA9629_ADDR6 = 0x4C, - PCA9629_ADDR7 = 0x4E, - PCA9629_ADDR8 = 0x50, - PCA9629_ADDR9 = 0x52, - PCA9629_ADDRA = 0x54, - PCA9629_ADDRB = 0x56, - PCA9629_ADDRC = 0x58, - PCA9629_ADDRD = 0x5A, - PCA9629_ADDRE = 0x5C, - PCA9629_ADDRF = 0x5E, -} -pca9629_addr; - - -#endif // MINIBOARD_PCA9629_REG__ - - +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + + +/** PCA9629 related definitions + * + * PCA9629's internal register name and address definitions, I2C address difinitions + */ + +#ifndef MINIBOARD_PCA9629_REG__ +#define MINIBOARD_PCA9629_REG__ + + +/** @var PCA9629 I2C bus addresses + */ + +typedef enum { + PCA9629_ADDR0 = 0x40, + PCA9629_ADDR1 = 0x42, + PCA9629_ADDR2 = 0x44, + PCA9629_ADDR3 = 0x46, + PCA9629_ADDR4 = 0x48, + PCA9629_ADDR5 = 0x4A, + PCA9629_ADDR6 = 0x4C, + PCA9629_ADDR7 = 0x4E, + PCA9629_ADDR8 = 0x50, + PCA9629_ADDR9 = 0x52, + PCA9629_ADDRA = 0x54, + PCA9629_ADDRB = 0x56, + PCA9629_ADDRC = 0x58, + PCA9629_ADDRD = 0x5A, + PCA9629_ADDRE = 0x5C, + PCA9629_ADDRF = 0x5E, +} +pca9629_addr; + + +#endif // MINIBOARD_PCA9629_REG__ + +
--- a/mini_board_libs/I2C_slaves/PCx9955_reg.h Wed Mar 28 04:29:27 2012 +0000 +++ b/mini_board_libs/I2C_slaves/PCx9955_reg.h Wed Mar 28 04:32:50 2012 +0000 @@ -1,8 +1,8 @@ /** A sample code for "mini board PCU9669/PCA9665" * * @author Akifumi (Tedd) OKANO, NXP Semiconductors - * @version 1.0 - * @date 26-Mar-2011 + * @version 1.01 + * @date 26-Mar-2012 * * Released under the MIT License: http://mbed.org/license/mit *
--- a/mini_board_libs/PCA9665.lib Wed Mar 28 04:29:27 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/nxp_ip/libraries/PCA9665/m7gm2b \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCA9665/.lib Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/nxp_ip/libraries/PCA9665/m7gm2b \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCA9665/PCA9665_access.c Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,414 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +#include "PCA9665_access.h" +#include "hardware_abs.h" + +#define BUS_CONTINUE 0 +#define BUS_STOP 1 +#define BUS_RELEASE 2 + +typedef enum { + I2CSTA = 0x0, + INDPTR = 0x0, + I2CDAT, + INDIRECT, + I2CCON +} +pca9665_direct_registers; + +typedef enum { + I2CCOUNT, + I2CADR, + I2CSCLL, + I2CSCLH, + I2CTO, + I2CPRESET, + I2CMODE +} +pca9665_indirect_registers; + +typedef enum { + ILLEGAL_START_STOP = 0x00, + MASTER_START_TXed = 0x08, + MASTER_RESTART_TXed = 0x10, + MASTER_SLA_W_ACK = 0x18, + MASTER_SLA_W_NAK = 0x20, + MASTER_DATA_W_ACK = 0x28, + MASTER_DATA_W_NAK = 0x30, + MASTER_ARB_LOST = 0x38, + MASTER_SLA_R_ACK = 0x40, + MASTER_SLA_R_NAK = 0x48, + MASTER_DATA_R_ACK = 0x50, + MASTER_DATA_R_NAK = 0x58, + SLAVE_ADDRESSED_W = 0x60, + SLAVE_AL_ADDRESSED_W = 0x68, + SDA_STUCK = 0x70, + SCL_STUCK = 0x78, + SLAVE_DATA_RX_ACK = 0x80, + SLAVE_DATA_RX_NAK = 0x88, + SLAVE_STOP_OR_RESTART = 0xA0, + SLAVE_ADDRESSED_R = 0xA8, + SLAVE_AL_ADDRESSED_R = 0xB0, + SLAVE_DATA_TX_ACK = 0xB8, + SLAVE_DATA_TX_NAK = 0xC0, + SLAVE_LAST_DATA_TX_ACK = 0xC8, + SLAVE_GENERALCALL = 0xD0, + SLAVE_GENERALCALL_AL = 0xD8, + SLAVE_GENERALCALL_DATA_RX_ACK = 0xE0, + SLAVE_GENERALCALL_DATA_RX_NAK = 0xE8, + IDLE = 0xF8, + ILLEGAL_I2CCOUNT = 0xFC +} +pca9665_status; + +typedef struct _speed_mode_st { + char i2cmode; + char i2cscll; + char i2csclh; +} +speed_mode_st; + +speed_mode_st speed_mode[ 3 ] = { + { 0x00, 0x9D, 0x86 }, + { 0x01, 0x2C, 0x14 }, + { 0x02, 0x011, 0x09 } +}; + +int buffer_mode_enable = DISABLE; +char int_happened = 0; +char op_mode_flag = OP_MODE_MASTER_ONLY; + +void interrupt_handler_PCA9665( void ) { + int_happened = 1; +} + +void PCA9665_init( void ) { + write_data( I2CCON, 0x40 ); + hw_wait_us( 1000 ); + + install_ISR( &interrupt_handler_PCA9665 ); // interrupt service routine install + + // initialize PCA9955 registers +} + +void set_speed_mode( int mode ) { + indirect_write( I2CMODE, speed_mode[ mode ].i2cmode ); + indirect_write( I2CSCLL, speed_mode[ mode ].i2cscll ); + indirect_write( I2CSCLH, speed_mode[ mode ].i2csclh ); +} + +void set_buffer_mode( int mode ) { + buffer_mode_enable = mode; +} + +int i2c_write( char addr, char *dp, char length, char restart_flag ) { + return ( + buffer_mode_enable ? + i2c_write_buffer_mode( addr, dp, length, restart_flag ) + : + i2c_write_byte_mode( addr, dp, length, restart_flag ) + ); +} + +int i2c_read( char addr, char *dp, char length, char restart_flag ) { + return ( + buffer_mode_enable ? + i2c_read_buffer_mode( addr, dp, length, restart_flag ) + : + i2c_read_byte_mode( addr, dp, length, restart_flag ) + ); +} + + +int i2c_write_buffer_mode( char addr, char *dp, char length, char restart_flag ) { + int done = BUS_CONTINUE; + char state; + char return_value = 0xFF; +#ifdef PCA9665_BURST_DATA_ACCESS +#else + int i; +#endif + + if ( 67 < length ) + return ( 0xFE ); + + write_data( I2CCON, 0x61 ); + + while ( !done ) { + if ( int_happened ) { + int_happened = 0; + + state = read_data( I2CSTA ); + + switch ( state ) { + case MASTER_START_TXed : + case MASTER_RESTART_TXed : + indirect_write( I2CCOUNT, length + 1 ); + write_data( I2CDAT, addr & 0xFE ); + +#ifdef PCA9665_BURST_DATA_ACCESS + write_data_burst( I2CDAT, dp, length ); +#else + for ( i = 0; i < length; i++ ) + write_data( I2CDAT, *dp++ ); +#endif + + write_data( I2CCON, 0x41 ); + break; + case MASTER_SLA_W_ACK : // SLA+W TXed + case MASTER_DATA_W_ACK : // DATA TXed + return_value = 0x00; + done = BUS_STOP; + break; + case MASTER_SLA_W_NAK : + case MASTER_DATA_W_NAK : + return_value = 0x01; + done = BUS_STOP; + break; + case MASTER_ARB_LOST : + case SLAVE_AL_ADDRESSED_R : + case SLAVE_AL_ADDRESSED_W : + case SLAVE_GENERALCALL_AL : + /* bus should be released for other master */ + default : + /* unexpected bus error */ + done = BUS_RELEASE; + break; + } + } + } + + if ( OP_MODE_MASTER_ONLY == op_mode_flag ) + done = BUS_STOP; + + if ( (BUS_STOP == done) && !restart_flag ) + write_data( I2CCON, 0x50 ); + + return ( return_value ); +} + +int i2c_read_buffer_mode( char addr, char *dp, char length, char restart_flag ) { + int done = BUS_CONTINUE; + char state; + char return_value = 0xFF; + +#ifdef PCA9665_BURST_DATA_ACCESS +#else + int i; +#endif + + if ( 68 < length ) + return ( 0xFE ); + + if ( !length ) // zero byte read may cause invalid STOP to START signal output + return ( 0 ); + + write_data( I2CCON, 0x61 ); + + while ( !done ) { + if ( int_happened ) { + int_happened = 0; + + state = read_data( I2CSTA ); + + switch ( state ) { + case MASTER_START_TXed : + case MASTER_RESTART_TXed : + write_data( I2CDAT, addr | 0x01 ); + indirect_write( I2CCOUNT, length | 0x80 ); + write_data( I2CCON, 0x41 ); + break; + case MASTER_SLA_R_ACK : // SLA+R TXed + case MASTER_DATA_R_ACK : // DATA RXed + return_value = 0x00; + done = BUS_STOP; + break; + case MASTER_SLA_R_NAK : // SLA+R TXed + return_value = 0x01; + done = BUS_STOP; + break; + case MASTER_DATA_R_NAK : + return_value = length - (indirect_read( I2CCOUNT ) & 0x7F); + done = BUS_STOP; + + break; + case MASTER_ARB_LOST : + case SLAVE_AL_ADDRESSED_R : + case SLAVE_AL_ADDRESSED_W : + case SLAVE_GENERALCALL_AL : + /* bus should be released for other master */ + default : + /* unexpected bus error */ + done = BUS_RELEASE; + break; + } + } + } + +#ifdef PCA9665_BURST_DATA_ACCESS + read_data_burst( I2CDAT, dp, length ); +#else + for ( i = 0; i < length; i++ ) + *dp++ = read_data( I2CDAT ); +#endif + + if ( OP_MODE_MASTER_ONLY == op_mode_flag ) + done = BUS_STOP; + + if ( (BUS_STOP == done) && !restart_flag ) + write_data( I2CCON, 0x50 ); + + return ( return_value ); +} + +int i2c_write_byte_mode( char addr, char *dp, char length, char restart_flag ) { + int done = BUS_CONTINUE; + char state; + + write_data( I2CCON, 0x60 ); + + while ( !done ) { + if ( int_happened ) { + int_happened = 0; + + state = read_data( I2CSTA ); + + switch ( state ) { + case MASTER_START_TXed : + case MASTER_RESTART_TXed : + write_data( I2CDAT, addr & 0xFE ); + write_data( I2CCON, 0x40 ); + break; + case MASTER_DATA_W_ACK : // DATA TXed + length--; + /* FALLTHROUGH */ + case MASTER_SLA_W_ACK : // SLA+W TXed + if ( !length ) { + done = BUS_STOP; + break; + } + write_data( I2CDAT, *dp++ ); + write_data( I2CCON, 0x40 ); + break; + case MASTER_SLA_W_NAK : + case MASTER_DATA_W_NAK : + done = BUS_STOP; + break; + case MASTER_ARB_LOST : + case SLAVE_AL_ADDRESSED_R : + case SLAVE_AL_ADDRESSED_W : + case SLAVE_GENERALCALL_AL : + /* bus should be released for other master */ + default : + /* unexpected bus error */ + done = BUS_RELEASE; + break; + } + } + } + + if ( OP_MODE_MASTER_ONLY == op_mode_flag ) + done = BUS_STOP; + + if ( (BUS_STOP == done) && !restart_flag ) + write_data( I2CCON, 0x50 ); + + return ( length ); +} + +int i2c_read_byte_mode( char addr, char *dp, char length, char restart_flag ) { + int done = BUS_CONTINUE; + char state; + + if ( !length ) // zero byte read may cause invalid STOP to START signal output + return ( 0 ); + + write_data( I2CCON, 0x60 ); + + while ( !done ) { + if ( int_happened ) { + int_happened = 0; + + state = read_data( I2CSTA ); + + switch ( state ) { + case MASTER_START_TXed : + case MASTER_RESTART_TXed : + write_data( I2CDAT, addr | 0x01 ); + write_data( I2CCON, 0x40 ); + break; + case MASTER_DATA_R_NAK : + done = BUS_STOP; + /* FALLTHROUGH */ + case MASTER_DATA_R_ACK : // DATA RXed + *dp++ = read_data( I2CDAT ); + length--; + /* FALLTHROUGH */ + case MASTER_SLA_R_ACK : // SLA+R TXed + if ( !length ) + done = BUS_STOP; + + if ( !done ) + write_data( I2CCON, (length == 1) ? 0x40 : 0xC0 ); + break; + case MASTER_SLA_R_NAK : + done = BUS_STOP; + break; + case MASTER_ARB_LOST : + case SLAVE_AL_ADDRESSED_R : + case SLAVE_AL_ADDRESSED_W : + case SLAVE_GENERALCALL_AL : + /* bus should be released for other master */ + default : + /* unexpected bus error */ + done = BUS_RELEASE; + break; + } + } + } + + if ( OP_MODE_MASTER_ONLY == op_mode_flag ) + done = BUS_STOP; + + if ( (BUS_STOP == done) && !restart_flag ) + write_data( I2CCON, 0x50 ); + + return ( length ); +} + +void indirect_write( char idaddr, char data ) { + write_data( INDPTR, idaddr ); + write_data( INDIRECT, data ); +} + +char indirect_read( char idaddr ) { + write_data( INDPTR, idaddr ); + return ( read_data( INDIRECT ) ); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCA9665/PCA9665_access.h Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,77 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +#ifndef MINIBOARD_PCA9665_ACCESS__ +#define MINIBOARD_PCA9665_ACCESS__ + + +#define OP_MODE_BOTH 0 +#define OP_MODE_MASTER_ONLY 1 +#define OP_MODE_SLAVE_ONLY 2 + +#define RESTART_DISABLE 0 +#define STOP RESTART_DISABLE +#define RESTART_ENABLE 1 +#define NEXT_RESTART RESTART_ENABLE + +#define PCA9665_BURST_DATA_ACCESS + + +typedef enum { + SPEED_STD_MODE = 0, + SPEED_FAST_MODE = 1, + SPEED_FAST_MODE_PLUS = 2 +} +speed_mode_val; + +typedef enum { + DISABLE = 0, + ENABLE = 1 +} +buffer_mode_flag; + +void set_speed_mode( int mode ); +void set_buffer_mode( int mode ); + +int i2c_write( char addr, char *dp, char length, char restart_flag ); +int i2c_read( char addr, char *dp, char length, char restart_flag ); + +int i2c_write_buffer_mode( char addr, char *dp, char length, char restart_flag ); +int i2c_read_buffer_mode( char addr, char *dp, char length, char restart_flag ); + +int i2c_write_byte_mode( char addr, char *dp, char length, char restart_flag ); +int i2c_read_byte_mode( char addr, char *dp, char length, char restart_flag ); + +void PCA9665_init( void ); + +void indirect_write( char idaddr, char data ); +char indirect_read( char idaddr ); + +#endif // MINIBOARD_PCA9665_ACCESS__ +
--- a/mini_board_libs/PCU9669.lib Wed Mar 28 04:29:27 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/nxp_ip/libraries/PCU9669/m7hiuh \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCU9669/.lib Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/nxp_ip/libraries/PCU9669/m7hiuh \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCU9669/PCU9669_access.c Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,130 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/* + * "PCU9669_access" module abstracts PCU9669 register and data buffer access. + * This gives simple interface to the bus controller. + * All this interface works on "hardware_abs" module. + */ + +#include "PCU9669_access.h" // PCU9669 chip access interface +#include "hardware_abs.h" // Using hardware abstraction interface + +// +// prototypes (module private function prototypes) +// + +int is_bus_controller_ready( void ); +int check_device_ID( char target_id ); +void registers_initialize( void ); + +// variables + +char device_id_code; // keeps CHIP_ID value +char ch_ofst[] = { OFFSET_CH0, OFFSET_CH1, OFFSET_CH2 }; // Address offsets of channel registers + +// Channel register writing function + +void write_ch_register( char ch, char reg, char val ) { + write_data( ch_ofst[ ch ] + reg, val ); +} + +// Channel register reading function + +char read_ch_register( char ch, char reg ) { + return( read_data( ch_ofst[ ch ] + reg ) ); +} + +// Start routine: It checks the bus controller can be accessed, chip-ID value and initializes registers. + +int start_bus_controller( char target_id ) { + if ( is_bus_controller_ready() ) + return 1; + + if ( check_device_ID( target_id ) ) + return 2; + + registers_initialize(); + + return 0; +} + +// (module private finction, called by start_bus_controller) +// checks if the bus controller can be accessed + +int is_bus_controller_ready( void ) { + return ( read_data( CTRLRDY ) ); +} + +// (module private finction, called by start_bus_controller) +// checks if chip-ID value is same as expected. The "TARGET_BUS_CONTROLLER" value can be modified in "PCU9669_access.h" + +int check_device_ID( char target_id ) { + device_id_code = read_data( DEVICE_ID ); +// printf( "Target chip: PC%c96%02X, ID register value = 0x%02X\r\n", device_id_code & 0x80 ? 'U' : 'A', device_id_code & 0x7F, device_id_code ); + + return ( target_id == device_id_code ) ? 0 : -1; +} + +// (module private finction, called by start_bus_controller) +// register initializations. + +void registers_initialize( void ) { + + // The PCU9669 does not require any specical register initializations. + // It can start data transfer with default register settings. + // + // Or, if you need to have specific settings modify this function like following sample. + +#if 0 + write_ch_register( CH_UFM1, SCLPER, 32 ); + write_ch_register( CH_UFM1, SDADLY, 2 ); + write_ch_register( CH_UFM2, SCLPER, 32 ); + write_ch_register( CH_UFM2, SDADLY, 2 ); +#endif +} + +// Next functions are option. +// if the BURST_DATA_ACCESS is defined in "hardware_abs.h", it is propagated to define "PCU9969_BURST_DATA_ACCESS" +// These interface may be useful for table and buffer access + +#ifdef PCU9969_BURST_DATA_ACCESS + +void write_ch_register_burst( char ch, char reg, char *vp, char length ) { + write_data_burst( ch_ofst[ ch ] + reg, vp, length ); +} + +void read_ch_register_burst( char ch, char reg, char *vp, char length ) { + read_data_burst( ch_ofst[ ch ] + reg, vp, length ); +} + +#endif + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCU9669/PCU9669_access.h Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,192 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/** PCU9669 abstraction layer module + * + * Common access method is abstracted in this module. + * Each channel's registers, global registers and buffer access can be through these interface. + * This module works on top of hardware abstraction layer. + */ + +#ifndef __PCU9669_ACCESS__ +#define __PCU9669_ACCESS__ + +#include "hardware_abs.h" + +/** @def PCU9669_ID / PCA9663_ID / TARGET_BUS_CONTROLLER + * + * Device IDs which can be read from DEVICE_ID register. + * This value may need to be checked before the operation start. + */ +#define PCU9669_ID 0xE9 +#define PCA9663_ID 0x63 +//#define TARGET_BUS_CONTROLLER PCA9663_ID + +/** @def CH_FM_PLUS / CH_UFM1 / CH_UFM2 + * + * Channel number abstracted by its characters. + */ +#define CH_FM_PLUS 0 +#define CH_UFM1 1 +#define CH_UFM2 2 + +#define CH_0 0 +#define CH_1 1 +#define CH_2 2 + +/** @var Register names + * + * PCU9669/9663 internal register name and addesses + */ +typedef enum { + + // channel registers + + CONTROL = 0x00, // These are register offsets. offset base CH0=0xC0, CH1=0xD0, CH2=0xE0 + CHSTATUS, + INTMSK, + SLATABLE, + TRANCONFIG, + DATA, + TRANSEL, + TRANOFS, + BYTECOUNT, + FRAMECNT, + REFRATE, + SCLL, + SCLH, + MODE, + TIMEOUT, + PRESET, + + SCLPER = 0x0B, + SDADLY = 0x0C, + RESERVED = 0x0E, + + // global registers + + CTRLSTATUS = 0xF0, + CTRLINTMSK, + DEVICE_ID = 0xF6, + CTRLPRESET, + CTRLRDY = 0xFF, + + OFFSET_CH0 = 0xC0, + OFFSET_CH1 = 0xD0, + OFFSET_CH2 = 0xE0, + +} RegisterName; + + +/** @var Devide ID code + * + * Keeps the value which is read from DEVICE_ID register + */ +extern char device_id_code; + + +/** Write channel register + * + * Writing 8 bit data into register in specified channel. + * Register address offset of each channels is added in this function. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param reg target channel register: RegisterName + * @param val target of channel: 8 bit value + * @see read_ch_register() + */ +void write_ch_register( char ch, char reg, char val ); + +/** Read channel register + * + * Read 8 bit data from register in specified channel. + * Register address offset of each channels is added in this function. + * + * @return 8 bit value from the register + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param reg target channel register: RegisterName + * @see write_ch_register() + */ +char read_ch_register( char ch, char reg ); + +/** Starting the bus controller (i.e. PCU9669) + * + * Checks the bus controller get ready, and ChipID is correct + * Then neccesary register initializations are done. + * In this reference code, no register initialization done. + * But if user need to do some, edit a module-private function "registers_initialize()" in "PCU9669_access.cpp" + * + * @return ZERO for no error, 1 for PCU9669 couldn't get ready after reset, 2 for ChipID was not match. + */ +int start_bus_controller( char target_id ); + + +/** BURST_DATA_ACCESS option code + * + * Following code is enabled only when BURST_DATA_ACCESS is defined in "hardware_abs.h" + */ +#ifdef BURST_DATA_ACCESS + +/** @def PCU9669_BURST_DATA_ACCESS + * + * PCU9669_BURST_DATA_ACCESS is defied to let upper layer know the burst access is available. + * This happens onlny BURST_DATA_ACCESS is defined in "hardware_abs.h" + */ +#define PCU9669_BURST_DATA_ACCESS + +/** Write channel register + * + * Write multiple bytes into a register in specified channel. + * Register address offset of each channels is added in this function. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param reg target channel register: RegisterName + * @param *vp a pointer to char array. The data in the array will be written. + * @param length length of the data (bytes) + * @see read_ch_register_burst() + */ +void write_ch_register_burst( char ch, char reg, char *vp, char length ); + +/** Read channel register + * + * Read multiple bytes from a register in specified channel. + * Register address offset of each channels is added in this function. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param reg target channel register: RegisterName + * @param *vp a pointer to char array. The data will be read into this. + * @param length length of the data (bytes) + * @see write_ch_register_burst() + */ +void read_ch_register_burst( char ch, char reg, char *vp, char length ); + +#endif // BURST_DATA_ACCESS + +#endif // __PCU9669_ACCESS__ +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCU9669/transfer_manager.c Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,179 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/* + * "transfer_manager" is a module to manage I2C bus transfers. + * In this sample code, single slave access (from START or RESTART condition to STOP or next RESTART + * condition) is called transaction. + * + * In this software, the transaction is a struct (the struct is defined in "transfer_manager.h") + * + * typedef struct transaction_st { + * char i2c_address __attribute__((packed)); + * char *data __attribute__((packed)); + * char length __attribute__((packed)); + * } + * transaction; + * + * The transaction has target I2C slave address pointer to the data array and the data length. + * Read/write drection is maneged by LSB of the i2c_address. + * + * For the reading, in this version, a dummy data array can be used but it need to have actual data + * because it will be accessed for buffer filling. + * And transfer manager doesn't readback the buffer. So user need to readback by "buffer_read()" + * function after transaction executed. + * + * A transfer can be represented by array of transaction, i.e... + * + * transaction a_sample_of_transfer[]; + * + * This array_of_transaction: "transfer" is used for the setting of the registers and buffers. + * + * See "main.cpp" for the actual sample of those transfer/transaction usage + */ + +#include "transfer_manager.h" +#include "PCU9669_access.h" // PCU9669 chip access interface + +void setup_transfer( char ch, transaction *t, char n_of_transaction ) { + int i; +#ifdef PCU9969_BURST_DATA_ACCESS +#else + int j; +#endif + + write_ch_register( ch, CONTROL, 0x02 ); // AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA) + + for ( i = 0; i < n_of_transaction; i++ ) + write_ch_register( ch, SLATABLE, (t + i)->i2c_address ); // + + write_ch_register( ch, TRANCONFIG, n_of_transaction ); // first byte of TRANCONFIG sets to # of transactions + write_ch_register( ch, TRANSEL, 0 ); // select #0 transaction + + for ( i = 0; i < n_of_transaction; i++ ) + write_ch_register( ch, TRANCONFIG, (t + i)->length ); + + +#ifdef PCU9969_BURST_DATA_ACCESS + for ( i = 0; i < n_of_transaction; i++ ) + write_ch_register_burst( ch, DATA, ((t + i)->data), (t + i)->length ); + +#else + for ( i = 0; i < n_of_transaction; i++ ) + for ( j = 0; j < (t + i)->length; j++ ) + write_ch_register( ch, DATA, *(((t + i)->data) + j) ); +#endif +} + + +void set_n_of_transaction( char ch, char n_of_transaction ) +{ + write_ch_register( ch, CONTROL, 0x02 ); // AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA) + write_ch_register( ch, TRANCONFIG, n_of_transaction ); // first byte of TRANCONFIG sets to # of transactions +} + + +void buffer_overwrite( char ch, char transaction_number, char offset, char *data, char length ) { +#ifdef PCU9969_BURST_DATA_ACCESS +#else + int i; +#endif + + write_ch_register( ch, TRANSEL, transaction_number ); + write_ch_register( ch, TRANOFS, offset ); + +#ifdef PCU9969_BURST_DATA_ACCESS + write_ch_register_burst( ch, DATA, data, length ); +#else + for ( i = 0; i < length; i++ ) + write_ch_register( ch, DATA, *data++ ); +#endif +} + +void buffer_read( char ch, char transaction_number, char offset, char *data, char length ) { +#ifdef PCU9969_BURST_DATA_ACCESS +#else + int i; +#endif + + write_ch_register( ch, TRANSEL, transaction_number ); + write_ch_register( ch, TRANOFS, offset ); + +#ifdef PCU9969_BURST_DATA_ACCESS + read_ch_register_burst( ch, DATA, data, length ); +#else + for ( i = 0; i < length; i++ ) + *data++ = read_ch_register( ch, DATA ); +#endif +} + +void start( char ch ) { + write_ch_register( ch, CONTROL, 0x40 ); +} + +void start_by_trigger( char ch, char polarity ) { + write_ch_register( ch, CONTROL, 0x48 | (polarity ? 0x10 : 0x00 ) ); +} + +void stop( char ch ) { + write_ch_register( ch, CONTROL, 0x20 ); // set STO bit +} + +/* for test of register access order variation */ +/* +void setup_transfer( char ch, transaction *t, char n_of_transaction ) { + int i; + int j; + + write_ch_register( ch, CONTROL, 0x02 ); // AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA) + write_ch_register( ch, TRANCONFIG, n_of_transaction ); // first byte of TRANCONFIG sets to # of transactions + write_ch_register( ch, TRANSEL, 0 ); // select #0 transaction + + for ( i = 0; i < n_of_transaction; i++ ) { + write_ch_register( ch, SLATABLE, (t + i)->i2c_address ); // + write_ch_register( ch, TRANCONFIG, (t + i)->length ); + write_ch_register_burst( ch, DATA, ((t + i)->data), (t + i)->length ); + } +} +*/ + +/* +void single_transaction_buffer_fill( char ch, char slot, transaction *tp ) { + int i; + + write_ch_register( ch, CONTROL, 0x02 ); // AIPTRRST : AutoIncrementPointerReset (for SLATABLE TRANCONFIG and DATA) + write_ch_register( ch, TRANSEL, slot ); // select #0 transfer + write_ch_register( ch, TRANCONFIG, 1 ); // first byte of TRANCONFIG sets to # of transactions + write_ch_register( ch, TRANCONFIG, tp->length ); // length of first transaction + write_ch_register( ch, SLATABLE, tp->i2c_address ); // + + for ( i = 0; i < length; i++ ) + write_ch_register( ch, DATA, *data++ ); // +} +*/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/PCU9669/transfer_manager.h Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,132 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/** Data transfer is abstracted on this layer + * + * The transer can be managed by a struct and some functions + */ +#ifndef __TRANSFER_MANAGER__ +#define __TRANSFER_MANAGER__ + +#define TRIGGER_BY_RISING_EDGE 0 +#define TRIGGER_BY_FALLING_EDGE 1 + +/** @typedef transaction + * + * A transaction (single data read/write access to the slave) is managed by this structure + * An array of the transaction makes a transfer. + * The sample of the transfer management can be found in "main.cpp". + */ +typedef struct transaction_st { + char i2c_address __attribute__((packed)); + char *data __attribute__((packed)); + char length __attribute__((packed)); +} +transaction; + +/** Setup transfer + * + * A transfer (consists multiple transactions) will be set into the buffer. + * This function only sets the data. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param *t a pointer to transaction array. This array represents a transfer. + * @param n_of_transaction number of transactions (how many transactions in this transfer) + * @see setup_transfer() + * @see buffer_overwrite() + * @see buffer_read() + * @see start() + */ +void setup_transfer( char ch, transaction *t, char n_of_transaction ); + +/** Set N of transaction + * + * To modify the N_OF_TRANSACTION + * This can be used to ignore transactions after specified transaction + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param n_of_transaction number of transactions (how many transactions in this transfer) + * @see setup_transfer() + * @see buffer_overwrite() + * @see buffer_read() + * @see start() + */ +void set_n_of_transaction( char ch, char n_of_transaction ); + +/** Buffer overwrite (in a transaction) + * + * Buffer contents in a transaction can be overwritten. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param transaction_number points the target transaction by number. + * @param offset offset of overwriting start byte + * @param *data pointer to char array, this contents will be written + * @param length number of bytes to overwrite + * @see setup_transfer() + * @see buffer_overwrite() + * @see buffer_read() + * @see start() + */ +void buffer_overwrite( char ch, char transaction_number, char offset, char *data, char length ); + +/** Buffer read (in a transaction) + * + * Buffer read interface. + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @param transaction_number points the target transaction by number. + * @param offset offset of reading start byte + * @param *data pointer to char array, the data will be written here + * @param length number of bytes to read + * @see setup_transfer() + * @see buffer_overwrite() + * @see buffer_read() + * @see start() + */ +void buffer_read( char ch, char transaction_number, char offset, char *data, char length ); + +/** Start transfer + * + * Starts the transfer of specified channel + * + * @param ch target of channel: CH_FM_PLUS | CH_UFM1 | CH_UFM2 + * @see setup_transfer() + * @see buffer_overwrite() + * @see buffer_read() + * @see start() + */ +void start( char ch ); +void start_by_trigger( char ch, char polarity ); +void stop( char ch ); + +// void single_transaction_buffer_fill( char ch, char *data, char length ); + + +#endif // __TRANSFER_MANAGER__ +
--- a/mini_board_libs/parallel_bus.lib Wed Mar 28 04:29:27 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/nxp_ip/libraries/parallel_bus/m7i4uc \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/parallel_bus/.lib Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/nxp_ip/libraries/parallel_bus/m7i4uc \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/parallel_bus/hardware_abs.c Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,220 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/* + * "hardware_abs" module has been made to abstract hardware: Hardware abstract layer + * This is file which will be modified when the porting done for other MCUs. + */ + +/* + * This sample code has been made for mbed. The code emulates parallel SRAM bus using the mbed's GPIO ports. + * To maximize the port access speed, PortOut and PortInOut libraly used. + */ + +#include "mbed.h" +#include "hardware_abs.h" + +// GPIO port setting + +#define ADDR_MASK 0x07878000 // 8 bit address mask on PORT0: Address value will be set into this bit position +#define DATA_MASK 0x00000FF0 // 8 bit data mask on PORT0: Data value will be appeared on this bit position +#define CONTROL_MASK 0x00000038 // Control signals CS=bit5(pin21), WR=bit4(pin22), RD=bit3(pin23) + +PortOut addr_port( Port0, ADDR_MASK ); +PortInOut data_port( Port0, DATA_MASK ); +PortOut ctrl_port( Port2, CONTROL_MASK ); +InterruptIn int_port( p26 ); + +// The very early version of PCU9669 mini board has different configuration. +// Following part switches the port configuration for those board versions. + +//#define PROTOTYPE_BREADBOARD + +DigitalInOut reset_port( p20 ); +//DigitalOut trig_port( p19 ); + +// Next two macros defines interface for temporaly interrupt disable/enable functions. +// These macros are used to blocking interrupt until a bus access cycle completed. +// Because if the interrupt happened in a cycle, the emulated parallel port state will be disturbed. +// For the mbed, library routine: __disable_irq() / __enable_irq() can be used. + +#define interrupt_enable() __enable_irq() +#define interrupt_disable() __disable_irq() + +// "prev_access_was_write" is a variable to keep the previous data directions. +// Using this flag, successive write and read addess overhead can be reduced. +// This mechanism will not be required if the MCU has parallel port + +char prev_access_was_write; + +// ISR routine installer + +void install_ISR( void (*fptr)(void) ) { + int_port.fall( fptr ); +} + +// Hardware initialize: it defines initial state of the (emulated) parallel bus + +void hardware_initialize( void ) { + prev_access_was_write = 0; + ctrl_port = 0x38; // CS, WR and RD are deaserted (HIGH) + data_port.input(); // data bus set to Hi-Z + reset_port.output(); + reset_port.mode( PullUp ); +} + +// Hardware reset for PCU9669: It asserts RESET signal for 4us and waits 650us after deassert (reset recovery time) + +void reset( int reset_pulse_width_us, int reset_recovery_us ) { + hardware_reset( ASSERT ); // Minimum pulse width is 4us for PCU9669 + hw_wait_us( reset_pulse_width_us ); + hardware_reset( DEASSERT ); // deassert hardware /RESET sgnal + hw_wait_us( reset_recovery_us ); +} + +// Interface to Control hardware RESET signal + +void hardware_reset( char signal ) { + reset_port = signal; +} + +// Interface to Control hardware TRIGGER signal + +void hardware_trigger( char signal ) { +// trig_port = signal; +} + +// Single write cycle on (emulated) parallel bus + +void write_data( char addr, char data ) { + interrupt_disable(); // disable interrupt first + + addr_port = (addr << 19) | (addr << 15); // Address output + ctrl_port = 0x08; // Assert CS and WR signals + + if ( !prev_access_was_write ) // Data bus direction control + data_port.output(); + + prev_access_was_write = 1; + + data_port = data << 4; // Data output + ctrl_port = 0x38; // Deassert CS and WR + + interrupt_enable(); // enable interrupt again +} + + +char read_data( char addr ) { + volatile char tmp; + interrupt_disable(); // disable interrupt first + + if ( prev_access_was_write ) // Data bus direction control + data_port.input(); + + prev_access_was_write = 0; + + addr_port = (addr << 19) | (addr << 15); // Address output + ctrl_port = 0x10; // Assert CS and RD signals + ctrl_port = 0x10; // asserting CS and RD pulse twice (but those are kept LOW) to wait short time till actual read timing + tmp = (data_port >> 4) & 0xFF; // Read data bus into var + ctrl_port = 0x38; // Deassert CS and RD + + interrupt_enable(); // enable interrupt again + + return ( tmp ); +} + +// Wait for micro-seconds + +void hw_wait_us( int v ) { + wait_us( v ); +} + +// Wait for seconds + +void wait_sec( float f ) { + wait( f ); +} + +// Following part is an optionto accerelate bus access. +// If such trick is not required, undefine the "BURST_DATA_ACCESS" and don't touch it. +// +// Next two functions access single address with repeating read/write. +// The repeating read/write are used often for PCU9669 like SLATABLE, TRANCONFIG and DATA (buffer accesses). +// So this accerelation contributes saving MCU time. +// +// For the porting, it may be good idea to modify those routines to DMA access. + +#ifdef BURST_DATA_ACCESS + +void write_data_burst( char addr, char *data, char length ) { + int i; + + interrupt_disable(); // disable interrupt first + + addr_port = (addr << 19) | (addr << 15); // Address output + + if ( !prev_access_was_write ) // Data bus direction control + data_port.output(); + + prev_access_was_write = 1; + + for ( i = 0; i < length; i++ ) { // repeat data write access + ctrl_port = 0x08; + data_port = *(data + i) << 4; + ctrl_port = 0x38; + } + + interrupt_enable(); +} + +void read_data_burst( char addr, char *data, char length ) { + int i; + + interrupt_disable(); // disable interrupt first + + addr_port = (addr << 19) | (addr << 15); // Address output + + if ( prev_access_was_write ) // Data bus direction control + data_port.input(); + + prev_access_was_write = 0; + + for ( i = 0; i < length; i++ ) { // repeat data read access + ctrl_port = 0x10; + ctrl_port = 0x10; + + *(data + i) = (data_port >> 4) & 0xFF; + ctrl_port = 0x38; + } + interrupt_enable(); +} + +#endif +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/parallel_bus/hardware_abs.h Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,170 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +/** Hardware abstraction layer module + * + * All MCU hardware related code are defined in this module + * This module may need to be modified when the code is ported to other MCU. + */ + +#ifndef MINIBOARD_HARDWARE_ABS__ +#define MINIBOARD_HARDWARE_ABS__ + +/** @def BURST_DATA_ACCESS + * + * To accelerate multiple bus access on same addess, use BURST_DATA_ACCESS + * On the mbed emvironment, this burst access enables 3 times faster read/write compare to single access. + * For code porting, the BURST_DATA_ACCESS code part is not neccesary if the hardware is fast enough. + */ +#define BURST_DATA_ACCESS + + +/** @def ASSERT / DEASSERT + * + * Reset signal logic difinition + */ +#define ASSERT 0 // for hardware reset +#define DEASSERT 1 // for hardware reset + + +/** Install an ISR + * + * Registering function as ISR. + * The function will be called when the interrupt asserted. + * + * @param fptr a pointer to a function + */ +void install_ISR( void (*fptr)(void) ); + +/** Hardware initialization + * + * MCU side initialization should be done in this function. + * For the mbed, it set the initial state of parallel bus control signal. + */ +void hardware_initialize( void ); + +/** Reset signal control + * + * This function drives the RESET signal line with given state. + * + * @param signal the state of RESET signal: ASSERT | DEASSERT + */ +void hardware_reset( char signal ); + +/** Hardware reset + * + * Asserts the RESET signal with required pulse width and waits its recovery time + * + * @param reset_pulse_width_us RESET pulse width in micro-seconds + * @param reset_recovery_us RESET recovery time in micro-seconds (wait time after RESET de-assertion) + */ +void reset( int reset_pulse_width_us, int reset_recovery_us ); + +/** Triger signal control + * + * This function drives the TRIGGER signal line with given state. + * + * @param signal the state of TRIGGER signal: ASSERT | DEASSERT + */ +void hardware_trigger( char signal ); + +/** Write data + * + * Writes 1 byte + * + * @param addr 8 bit address where the data should be written to + * @param data 8 bit data which will be written + * @see read_data() + */ +void write_data( char addr, char data ); + +/** Read data + * + * Reads 1 byte + * + * @return 8 bit data which is read from bus + * @param addr 8 bit address where the data should be read from + * @see write_data() + */ +char read_data( char addr ); + +/** Wait micro-seconds + * + * Wait function waits given-micro-seconds + * + * @param micro-seconds the program should wait (32 bit integer value) + * @see wait_sec() + */ +void hw_wait_us( int v ); + +/** Wait seconds + * + * Wait function waits given-seconds + * + * @param seconds the program should wait (float value) + * @see hw_wait_us() + */ +void wait_sec( float ); + + +/** BURST_DATA_ACCESS option code + * + * This code is option to accelerate the bus access + */ +#ifdef BURST_DATA_ACCESS + +/** Write data + * + * Writes multiple bytes to same address. + * This function suitable to use for the registers like SLATABLE, TRANCONFIG and data buffers (through DATA register). + * While this access is going, the interrupt will be tempolary disabled (ISR execution will be postponed) + * + * @param addr 8 bit address where the data should be written to + * @param *data pointer to char array. The data in this array will be written + * @param length length of the data (bytes) + * @see read_data_burst() + */ +void write_data_burst( char addr, char *data, char length ); + +/** Read data + * + * Reads multiple bytes from same address. + * This function suitable to use for the registers like SLATABLE, TRANCONFIG and data buffers (through DATA register). + * While this access is going, the interrupt will be tempolary disabled (ISR execution will be postponed) + * + * @param addr 8 bit address where the data should be written to + * @param *data pointer to char array. The read data will be written to this + * @param length length of the data (bytes) + * @see write_data_burst() + */ +void read_data_burst( char addr, char *data, char length ); +#endif + +#endif // MINIBOARD_HARDWARE_ABS__ +
--- a/mini_board_libs/utility.lib Wed Mar 28 04:29:27 2012 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -http://mbed.org/users/nxp_ip/libraries/utility/m7h57i \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/utility/.lib Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/nxp_ip/libraries/utility/m7h57i \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/utility/utility.c Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,45 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + +#include "utility.h" +#include "mbed.h" // for printf + +void dump_read_data( char *data, char length ) { + int i; + + printf( "\r\ndump @ %p for %d bytes", data, length ); + for ( i = 0; i < length; i++ ) + { + if ( !(i % 8) ) + printf( "\r\n%08p (%03d, 0x%02X) : 0x", data + i, i, i ); + + printf( "%02X ", data[ i ] ); + } + printf( "\r\n" ); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mini_board_libs/utility/utility.h Wed Mar 28 04:32:50 2012 +0000 @@ -0,0 +1,36 @@ +/** A sample code for "mini board PCU9669/PCA9665" + * + * @author Akifumi (Tedd) OKANO, NXP Semiconductors + * @version 1.0 + * @date 26-Mar-2012 + * + * Released under the MIT License: http://mbed.org/license/mit + * + * An operation sample of PCU9669/PCA9665 I2C bus controller. + * The mbed accesses the bus controller's parallel port (8/2 bit address and 8 bit data) by bit-banging. + * The bit-banging is poerformed by PortInOut function of mbed library. + * + * To make the code porting easier, all codes are partitioned into layers to abstract other parts. + * The mbed specific parts are concentrated in lowest layer: "hardware_abs.*". + * This module may need to be modified for the porting. + * + * All other upper layers are writen in standard-C. + * + * base code is written from 05-Sep-2011 to 09-Sep-2011. + * And demo code has been build on 11-Sep-2011. + * Debug and code adjustment has been done on 08-Sep-2011. + * Small sanitization for main.cpp. All mbed related codes are moved in to "hardware_abs.*". 13-Oct-2011 + * hardware_abs are moved into parallel_bus library folder, 3 LED driver operation sample 13-Feb.-2012 + * PCU9669 and PCA9665 codes are packed in a project 14-Feb-2012. + * + * Before builidng the code, please edit the file mini_board_PCU9669/config.h + * Un-comment the target name what you want to target. + */ + + +#ifndef MINIBOARD_UTILITY__ +#define MINIBOARD_UTILITY__ + +void dump_read_data( char *data, char length ); + +#endif // MINIBOARD_UTILITY__