00001 #include <cdefBF53x.h>
00002 #include <ccblkfn.h>
00003 #include "twi.h"
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 namespace twi{
00016
00017
00018
00019
00020
00021 unsigned char * dataPtr;
00022
00023
00024
00025
00026
00027
00028 unsigned char * nextPtr;
00029
00030
00031
00032
00033
00034
00035
00036 unsigned char nextAddress = 0;
00037
00038
00039
00040
00041
00042 unsigned int transferedCount;
00043
00044
00045
00046
00047
00048 unsigned int countToBeTransfer;
00049
00050
00051
00052
00053
00054
00055 unsigned int nextTransfer;
00056
00057
00058
00059
00060
00061 bool rcv;
00062
00063
00064
00065
00066
00067 void ( * userCallBack )(bool);
00068
00069 void init( unsigned int sclkMHz )
00070 {
00071 *pTWI_CONTROL = TWI_ENA | (sclkMHz / 10);
00072 *pTWI_CLKDIV = CLKHI(50) | CLKLOW(50);
00073 *pTWI_FIFO_CTL = XMTFLUSH | RCVFLUSH;
00074
00075
00076
00077
00078
00079
00080 *pTWI_FIFO_CTL = XMTINTLEN;
00081 *pTWI_SLAVE_CTL = 0;
00082 *pSIC_IMASK |= IRQ_TWI;
00083 }
00084
00085 void start( void )
00086 {
00087 }
00088
00089 bool ISR( void )
00090 {
00091 unsigned int istat;
00092
00093 if ( *pSIC_ISR & IRQ_TWI ){
00094 istat = *pTWI_INT_STAT;
00095 if ( istat & XMTSERV ) {
00096 if ( countToBeTransfer == transferedCount ){
00097 *pTWI_INT_MASK &= ~XMTSERV;
00098 if ( nextAddress )
00099 *pTWI_MASTER_CTL |= MDIR;
00100 }
00101 else {
00102 *pTWI_XMT_DATA8 = *(dataPtr++);
00103 transferedCount ++;
00104 }
00105 *pTWI_INT_STAT = XMTSERV;
00106 }
00107 else if ( istat & RCVSERV ) {
00108 *(dataPtr++) = *pTWI_RCV_DATA8;
00109 *pTWI_INT_STAT = RCVSERV;
00110 transferedCount ++;
00111 }
00112 else if ( istat & MCOMP ){
00113 *pTWI_INT_STAT = MCOMP;
00114 *pTWI_INT_MASK &= ~(RCVSERV|XMTSERV|MCOMP);
00115 if ( rcv ){
00116 if ( *pTWI_FIFO_STAT & RCVSTAT ) {
00117 *(dataPtr++) = *pTWI_RCV_DATA8;
00118 transferedCount ++;
00119 }
00120 if ( userCallBack )
00121 userCallBack(true);
00122 }
00123 else{
00124 if ( nextAddress )
00125 readAsync( nextAddress, nextPtr, nextTransfer, userCallBack );
00126 else if ( userCallBack )
00127 userCallBack(false);
00128 }
00129 }
00130 ssync();
00131 return true;
00132 }
00133 else
00134 return false;
00135 }
00136
00137 void readAsync(
00138 unsigned char address,
00139 unsigned char data[],
00140 unsigned int count,
00141 void ( * callback )( bool )
00142 )
00143 {
00144 rcv = true;
00145 nextAddress = 0;
00146 countToBeTransfer = count;
00147 dataPtr = (unsigned char *)data;
00148 userCallBack = callback;
00149 *pTWI_INT_MASK = 0;
00150 *pTWI_MASTER_ADDR = address;
00151 transferedCount = 0;
00152 *pTWI_MASTER_CTL = MEN | MDIR | DCNT & ( count << 6 );
00153 *pTWI_INT_MASK = RCVSERV | MCOMP;
00154 }
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 void writeAsyncSub(
00171 unsigned char address,
00172 const unsigned char data[],
00173 unsigned int count,
00174 void ( * callback )( bool )
00175 )
00176 {
00177 rcv = false;
00178 countToBeTransfer = count;
00179 dataPtr = (unsigned char *)data;
00180 userCallBack = callback;
00181 *pTWI_INT_MASK = 0;
00182 *pTWI_MASTER_ADDR = address;
00183 *pTWI_XMT_DATA8 = *(dataPtr++);
00184 transferedCount = 1;
00185
00186 *pTWI_MASTER_CTL |= MEN | DCNT & ( count << 6 );
00187 *pTWI_INT_MASK = XMTSERV | MCOMP;
00188 }
00189
00190
00191 void writeAsync(
00192 unsigned char address,
00193 const unsigned char data[],
00194 unsigned int count,
00195 void ( * callback )( bool )
00196 )
00197 {
00198 nextAddress = 0;
00199 *pTWI_MASTER_CTL = 0;
00200
00201 writeAsyncSub( address, data, count, callback );
00202 }
00203
00204 void writeReadAsync(
00205 unsigned char wAddress,
00206 const unsigned char wData[],
00207 unsigned int wCount,
00208 unsigned char rAddress,
00209 const unsigned char rData[],
00210 unsigned int rCount,
00211 void ( * callback )( bool )
00212 )
00213 {
00214 nextTransfer = rCount;
00215 nextPtr = (unsigned char *)rData;
00216 nextAddress = rAddress;
00217 *pTWI_MASTER_CTL = RSTART;
00218
00219 writeAsyncSub( wAddress, wData, wCount, callback );
00220 }
00221
00222 };
00223
00224