37 #define EEPROM 0xA0 //LC515 address assuming both address pins tied low.
41 void waitForWriteCompletion(
uint8_t u8_i2cAddr) {
43 u8_savedSWDTEN = _SWDTEN;
45 u8_i2cAddr = I2C_WADDR(u8_i2cAddr);
50 }
while (u8_ack == I2C_NAK);
51 _SWDTEN = u8_savedSWDTEN;
58 u8_AddrLo = u16_MemAddr & 0x00FF;
59 u8_AddrHi = (u16_MemAddr >> 8);
60 if (u16_MemAddr & 0x8000) {
62 u8_i2cAddr = u8_i2cAddr | 0x08;
64 waitForWriteCompletion(u8_i2cAddr);
70 for (u16_i=0; u16_i < BLKSIZE; u16_i++) {
81 u8_AddrLo = u16_MemAddr & 0x00FF;
82 u8_AddrHi = (u16_MemAddr >> 8);
84 if (u16_MemAddr & 0x8000) {
86 u8_i2cAddr = u8_i2cAddr | 0x08;
88 waitForWriteCompletion(u8_i2cAddr);
95 #define DMA_TRANSFER_SIZE BLKSIZE
97 uint8_t au8_bufferA[DMA_TRANSFER_SIZE] __attribute__((space(dma)));
98 uint8_t au8_bufferB[DMA_TRANSFER_SIZE] __attribute__((space(dma)));
100 typedef struct tagFLAGBITS {
101 unsigned u1_activeBuffer:
103 unsigned u1_writeFlag:
106 volatile FLAGBITS flags;
109 DMA0PAD = (
unsigned int) &U1RXREG;
110 DMA0REQ = DMA_IRQ_U1RX;
113 DMA0STA = __builtin_dmaoffset(au8_bufferA);
114 DMA0STB = __builtin_dmaoffset(au8_bufferB);
116 DMA0CNT = DMA_TRANSFER_SIZE -1;
120 DMA_DIR_READ_PERIPHERAL |
123 DMA_AMODE_REGISTER_POSTINC |
124 DMA_MODE_CONTINUOUS_PING_PONG);
136 void _ISRFAST _U1ErrInterrupt(
void) {
142 void _ISRFAST _DMA0Interrupt(
void) {
144 flags.u1_activeBuffer = !flags.u1_activeBuffer;
145 flags.u1_writeFlag = 1;
149 uint8_t au8_eepromBuf[BLKSIZE];
154 outString(
"\nEnter 'w' for write mode, anything else reads: ");
161 if (u8_mode ==
'w') {
164 if (flags.u1_writeFlag)
reportError(
"DMA overflow!\n");
166 flags.u1_writeFlag = 0;
167 if (flags.u1_activeBuffer)
168 memWriteLC515(EEPROM,u16_MemAddr,au8_bufferA);
170 memWriteLC515(EEPROM,u16_MemAddr,au8_bufferB);
171 u16_MemAddr = u16_MemAddr +64;
180 memReadLC515(EEPROM,u16_MemAddr,au8_eepromBuf);
181 for (u8_i = 0; u8_i< 64; u8_i++)
outChar(au8_eepromBuf[u8_i]);
186 u16_MemAddr = u16_MemAddr + 64;