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_ALIGNED(32) 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
00179 for (i = 0; i < PAGE_SIZE; i++) {
00180
00181 if ((i & 1) == 0)
00182 pbuff[i] = 0xA5;
00183
00184 else
00185 pbuff[i] = 0x5A;
00186 }
00187 }
00188
00189 static void _checkReadBuffer(uint8_t *pBuff)
00190 {
00191 uint16_t i, NoError;
00192
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
00230 WDT_Disable(WDT);
00231
00232
00233 SCB_EnableICache();
00234 SCB_EnableDCache();
00235
00236 CallBackFired = 0;
00237
00238
00239 printf("-- TWI EEPROM Example %s --\n\r", SOFTPACK_VERSION);
00240 printf("-- %s\n\r", BOARD_NAME);
00241 printf("-- Compiled: %s %s With %s--\n\r", __DATE__, __TIME__, COMPILER_NAME);
00242
00243 TimeTick_Configure();
00244
00245
00246 PIO_Configure(pins, PIO_LISTSIZE(pins));
00247 PMC_EnablePeripheral(BOARD_ID_TWI_EEPROM);
00248
00249
00250 twi_dma.pTwid = malloc(sizeof(Twid));
00251 twi_dma.pTwiDma = malloc(sizeof(sXdmad));
00252
00253 TWI_ConfigureMaster(BOARD_BASE_TWI_EEPROM, TWCK, BOARD_MCK);
00254 TWID_Initialize(&twid, BOARD_BASE_TWI_EEPROM);
00255 TWID_DmaInitialize(&twi_dma, BOARD_BASE_TWI_EEPROM, 0);
00256
00257 TWID_Read(&twid, AT24MAC_SERIAL_NUM_ADD, 0x80, 1, SNo, PAGE_SIZE, 0);
00258
00259
00260 memset(pData, 0, PAGE_SIZE);
00261 for (i = 0; i < EEPROM_PAGES; i++) {
00262 printf("-I- Filling page #%d with zeroes ...\r\n", i);
00263 TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00264
00265 Wait(10);
00266 }
00267 printf("\r\n");
00268
00269 _fillBuffer(pData);
00270
00271
00272 for (i = 0; i < EEPROM_PAGES; i++) {
00273 printf("\n\r-I- Filling page #%d with checkerboard pattern ...\r", i);
00274 TWID_DmaWrite(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00275
00276 Wait(10);
00277 }
00278 printf("\r\n");
00279
00280
00281 memset(pData, 0, PAGE_SIZE);
00282 for (i = 0; i < EEPROM_PAGES; i++) {
00283 printf("-I- Reading page #%d... ", i);
00284 TWID_DmaRead(&twi_dma, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, 0);
00285
00286 Wait(10);
00287 _checkReadBuffer(pData);
00288 }
00289 printf("\r\n");
00290
00291
00292 NVIC_ClearPendingIRQ(TWIHS0_IRQn);
00293 NVIC_EnableIRQ(TWIHS0_IRQn);
00294
00295
00296 printf("-I- Read/write on page #0 (IRQ mode)\n\r");
00297
00298
00299 _fillBuffer(pData);
00300 memset(&async, 0, sizeof(async));
00301 async.callback = (void *) TestCallback;
00302
00303 for (i = 0; i < EEPROM_PAGES; i++) {
00304 printf("-I- Filling page #%d with checkerboard pattern ...\r", i);
00305 TWID_Write(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async);
00306 while (!ASYNC_IsFinished(&async));
00307
00308 Wait(10);
00309 }
00310 printf("\r\n");
00311
00312
00313
00314 memset(pData, 0, PAGE_SIZE);
00315 memset(&async, 0, sizeof(async));
00316 async.callback = (void *) TestCallback;
00317 for (i = 0; i < EEPROM_PAGES; i++) {
00318 printf("-I- Reading page # %d...\r", i);
00319 TWID_Read(&twid, AT24MAC_ADDRESS, i*PAGE_SIZE, 1, pData, PAGE_SIZE, &async);
00320 while (!ASYNC_IsFinished(&async));
00321
00322 Wait(10);
00323 _checkReadBuffer(pData);
00324 }
00325 printf("\r\n Callback Fired %d times", CallBackFired);
00326
00327 return 0;
00328 }