00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 #include "board.h"
00099
00100 #include <stdint.h>
00101 #include <stdio.h>
00102 #include <stdarg.h>
00103 #include <string.h>
00104 #include <assert.h>
00105
00106
00107
00108
00109
00110
00111 #define TWCK 400000
00112
00113
00114 #define AT24MAC_ADDRESS 0x57
00115 #define AT24MAC_SERIAL_NUM_ADD 0x5F
00116
00117
00118 #define PAGE_SIZE 16
00119
00120
00121 #define EEPROM_PAGES 16
00122
00123
00124 #define BOARD_PINS_TWI_EEPROM PINS_TWI0
00125
00126
00127 #define BOARD_ID_TWI_EEPROM ID_TWIHS0
00128
00129
00130 #define BOARD_BASE_TWI_EEPROM TWIHS0
00131
00132
00133
00134
00135
00136 static const Pin pins[] = BOARD_PINS_TWI_EEPROM;
00137 static TwihsDma twi_dma;
00138
00139
00140 static Twid twid;
00141
00142
00143 COMPILER_WORD_ALIGNED static uint8_t pData[PAGE_SIZE];
00144
00145 static uint8_t CallBackFired = 0;
00146
00147
00148
00149
00150
00151
00152
00153 void TWIHS0_Handler( void )
00154 {
00155 TWID_Handler( &twid ) ;
00156 }
00157
00158
00159
00160
00161 void XDMAC_Handler(void)
00162 {
00163 XDMAD_Handler(twi_dma.pTwiDma);
00164 }
00165
00166
00167
00168
00169 static void TestCallback( void )
00170 {
00171 CallBackFired++;
00172 }
00173
00174 static void _fillBuffer(uint8_t *pbuff)
00175 {
00176 uint32_t i;
00177
00178 for ( i=0 ; i < PAGE_SIZE ; i++ ) {
00179
00180 if ( (i & 1) == 0 ) {
00181 pbuff[i] = 0xA5;
00182 }
00183
00184 else {
00185 pbuff[i] = 0x5A;
00186 }
00187 }
00188 }
00189
00190 static void _checkReadBuffer(uint8_t *pBuff )
00191 {
00192 uint16_t i, NoError;
00193 NoError = 0;
00194 for (i = 0; i < PAGE_SIZE; i++) {
00195
00196 if ( ((i & 1) == 0) && (pBuff[i] != 0xA5) ) {
00197 printf( "-E- Data mismatch at offset #%u: expected 0xA5, \
00198 read 0x%02x\n\r", (unsigned int)i, (unsigned int)pData[i] ) ;
00199 NoError++ ;
00200 }
00201
00202 else {
00203 if ( ((i & 1) == 1) && (pBuff[i] != 0x5A) ) {
00204 printf( "-E- Data mismatch at offset #%u: expected 0x5A, read\
00205 0x%02x\n\r", (unsigned int)i, (unsigned int)pData[i] ) ;
00206 NoError++;
00207 }
00208 }
00209 }
00210 printf("-I- %u comparison error(s) found \r", (unsigned int)NoError);
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 extern int main( void )
00224 {
00225 uint8_t i;
00226 uint8_t SNo[16];
00227 Async async;
00228
00229 WDT_Disable( WDT ) ;
00230
00231
00232 SCB_EnableICache();
00233 SCB_EnableDCache();
00234
00235 CallBackFired = 0;
00236
00237
00238 printf("-- TWI EEPROM Example %s --\n\r", SOFTPACK_VERSION);
00239 printf("-- %s\n\r", BOARD_NAME);
00240 printf( "-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__ , COMPILER_NAME) ;
00241
00242 TimeTick_Configure();
00243
00244
00245 PIO_Configure(pins, PIO_LISTSIZE(pins));
00246 PMC_EnablePeripheral(BOARD_ID_TWI_EEPROM);
00247
00248
00249 twi_dma.pTwid = malloc(sizeof(Twid));
00250 twi_dma.pTwiDma = malloc(sizeof(sXdmad));
00251
00252 TWI_ConfigureMaster(BOARD_BASE_TWI_EEPROM, TWCK, BOARD_MCK);
00253 TWID_Initialize(&twid, BOARD_BASE_TWI_EEPROM);
00254 TWID_DmaInitialize(&twi_dma, BOARD_BASE_TWI_EEPROM, 0);
00255
00256 TWID_Read(&twid, AT24MAC_SERIAL_NUM_ADD, 0x80, 1, SNo, PAGE_SIZE, 0);
00257
00258
00259 memset(pData, 0, PAGE_SIZE);
00260 for(i=0; i< EEPROM_PAGES; i++) {
00261 printf("-I- Filling page #%d with zeroes ...\r\n", i);
00262 TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00263
00264 Wait(10);
00265 }
00266 printf("\r\n");
00267
00268 _fillBuffer(pData);
00269
00270
00271 for(i=0; i< EEPROM_PAGES; i++) {
00272 printf("\n\r-I- Filling page #%d with checkerboard pattern ...\r", i);
00273 TWID_DmaWrite(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00274
00275 Wait(10);
00276 }
00277 printf("\r\n");
00278
00279
00280 memset(pData, 0, PAGE_SIZE);
00281 for(i=0; i< EEPROM_PAGES; i++) {
00282 printf("-I- Reading page #%d... ", i);
00283 TWID_DmaRead(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00284
00285 Wait(10);
00286 _checkReadBuffer(pData);
00287 }
00288 printf("\r\n");
00289
00290
00291 NVIC_ClearPendingIRQ(TWIHS0_IRQn);
00292 NVIC_EnableIRQ(TWIHS0_IRQn);
00293
00294
00295 printf("-I- Read/write on page #0 (IRQ mode)\n\r");
00296
00297
00298 _fillBuffer(pData);
00299 memset(&async, 0, sizeof(async));
00300 async.callback = (void *) TestCallback;
00301
00302 for(i=0; i< EEPROM_PAGES; i++) {
00303 printf("-I- Filling page #%d with checkerboard pattern ...\r", i);
00304 TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async);
00305 while (!ASYNC_IsFinished(&async));
00306
00307 Wait(10);
00308 }
00309 printf("\r\n");
00310
00311
00312
00313 memset(pData, 0, PAGE_SIZE);
00314 memset(&async, 0, sizeof(async));
00315 async.callback = (void *) TestCallback;
00316 for(i=0; i< EEPROM_PAGES; i++) {
00317 printf("-I- Reading page # %d...\r", i);
00318 TWID_Read(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async);
00319 while ( !ASYNC_IsFinished( &async ) ) ;
00320
00321 Wait(10);
00322 _checkReadBuffer(pData);
00323 }
00324 printf("\r\n Callback Fired %d times", CallBackFired);
00325
00326 return 0 ;
00327 }