Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Diff: AT24C64D.cpp
- Revision:
- 2:7efbd43bfe7c
- Parent:
- 1:3ccf1b297b4f
- Child:
- 3:8a0bfc787463
--- a/AT24C64D.cpp Wed Feb 20 10:09:39 2019 +0000
+++ b/AT24C64D.cpp Fri Feb 22 10:05:29 2019 +0000
@@ -13,14 +13,14 @@
printf("Contructor of EEPROM AT24C64D...");
bAck = NACK;
- timer = new Timeout;
+ timer = new Timer;
+ startTimer();
+
i2c = _i2c;
for(int a; a <= SIZE_PAGE; a++)
cBuffer[a] = 0x00;
- //bReady = false;
- //timer->attach_us(callback(this, &AT24C64D::setReady), READY_TIME_US);
printf("end\n");
}
@@ -112,7 +112,7 @@
i2c->write(0x00);
i2c->start();
i2c->stop();
- //i2c->abort_transfer();
+
return;
}
@@ -146,27 +146,20 @@
if(uiTimeOut == 0) return NACK;
}
- //i2c->abort_transfer();
+
uiAddrWrite = uiAddr & ADDR_MASK;
cBuffer[0] = (uiAddrWrite >> 8) & 0xFF;
cBuffer[1] = uiAddrWrite & 0xFF;
cBuffer[2] = (*cData);
- printf("Write on EEPROM address 0x%02x %02x the Byte 0x%02x\n", cBuffer[0], cBuffer[1], cBuffer[2]);
-
+ //printf("Write on EEPROM address 0x%02x %02x the Byte 0x%02x\n", cBuffer[0], cBuffer[1], cBuffer[2]);
+
+ while(not isReady());
bAck &= i2c->write(AT24C64D_W, cBuffer, 3);
- //i2c->abort_transferv
-
- /*i2c->start();
- i2c->write(AT24C64D_W);
- i2c->write(cBuffer[0]);
- i2c->write(cBuffer[1]);
- i2c->write(cBuffer[2]);
- //i2c->abort_transfer();
- i2c->stop();
- */
-
+ //wait(0.004);
+ startTimer();
+
if(bAck) incAddrWrite();
return bAck;
@@ -196,60 +189,45 @@
//******************************************************************************//
//
//******************************************************************************//
-void AT24C64D::readByte(char *cData){
- int i = 0;
- bAck = NACK;
- while(bAck != ACK){
- i2c->start();
- bAck = i2c->write(AT24C64D_R); // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
- i2c->stop();
- i++;
- }
+bool AT24C64D::readByte(char *cData){
+
+ bAck = ACKpolling(AT24C64D_R); // polling for ACK
- //i2c->abort_transfer();
-
-
- i2c->start();
- i2c->write(AT24C64D_R);
- *cData = i2c->read(false);
- i2c->stop();
-
- return;
+ if(bAck == ACK){
+ i2c->start(); // send a start condition
+ i2c->write(AT24C64D_R);
+ *cData = i2c->read(false);
+ i2c->stop();
+ }
+ return bAck;
}
//******************************************************************************//
//
//******************************************************************************//
-void AT24C64D::readByte(uint16_t uiAddr, char *cData){
- int i = 0;
- bAck = NACK;
- while(bAck != ACK){
+bool AT24C64D::readByte(uint16_t uiAddr, char *cData){
+
+ bAck = ACKpolling(AT24C64D_R); // polling for ACK
+
+ if(bAck == ACK){
+
+ uiAddrRead = uiAddr & ADDR_MASK;
+
+ cBuffer[0] = (uiAddrRead >> 8) & 0xFF;
+ cBuffer[1] = uiAddrRead & 0xFF;
+ printf("0x%02x 0x%02x\n", cBuffer[0], cBuffer[1]);
i2c->start();
- bAck = i2c->write(AT24C64D_R); // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
+ i2c->write(AT24C64D_W);
+ i2c->write(cBuffer[0]);
+ i2c->write(cBuffer[1]);
+ i2c->start();
+ i2c->write(AT24C64D_R);
+ *cData = i2c->read(false);
i2c->stop();
- i++;
}
- //i2c->abort_transfer();
-
-
-
- uiAddrRead = uiAddr & ADDR_MASK;
-
- cBuffer[0] = (uiAddrRead >> 8) & 0xFF;
- cBuffer[1] = uiAddrRead & 0xFF;
-
- i2c->start();
- i2c->write(AT24C64D_W);
- i2c->write(cBuffer[0]);
- i2c->write(cBuffer[1]);
- i2c->start();
- i2c->write(AT24C64D_R);
- *cData = i2c->read(false);
- i2c->stop();
-
- return;
+ return bAck;
}
@@ -259,22 +237,12 @@
//******************************************************************************//
bool AT24C64D::read(uint16_t uiAddr, char *cData, uint16_t uiLength){
- if(uiLength == 0) return NACK;
-
- bAck = NACK;
- uiTimeOut = TIMEOUT_VAL;
-
- while(bAck != ACK){
- i2c->start();
- bAck = i2c->write(AT24C64D_R); // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
- i2c->stop();
-
- uiTimeOut--;
- if(uiTimeOut == 0) break;
-
+ if(uiLength == 0){
+ printf("Read from EPPROM with a size of 0\n");
+ return NACK;
}
- //i2c->abort_transfer();
+ ACKpolling(AT24C64D_R);
@@ -303,11 +271,32 @@
/******************************************************************************/
-// not used
+//
/******************************************************************************/
-void AT24C64D::setReady(){
- bReady = true;
- timer->detach();
+bool AT24C64D::isReady(){
+ if(bReady or timer->read_ms() >= READY_TIME_MS){
+ bReady = true;
+
+ if(bTimerRun){
+ timer->stop();
+ bTimerRun = false;
+ }
+ }
+
+ return bReady;
+}
+
+
+/******************************************************************************/
+//
+/******************************************************************************/
+void AT24C64D::startTimer(){
+
+ timer->start();
+ timer->reset();
+
+ bReady = false;
+ bTimerRun = true;
}
@@ -315,8 +304,22 @@
/******************************************************************************/
//
/******************************************************************************/
-bool AT24C64D::isReady(){
- return bReady;
-}
-
-
+bool AT24C64D::ACKpolling(uint8_t uiAdr){
+
+ bAck = NACK;
+ uiTimeOut = TIMEOUT_VAL;
+
+ while(bAck != ACK){
+ i2c->start();
+ bAck = (bool) i2c->write(uiAdr); // return 0 -> NACK | 1 -> ACK | 2 -> TimeOut
+ i2c->stop();
+
+ uiTimeOut--;
+ if(uiTimeOut == 0){
+ printf("Read from EPPROM: timeout\n");
+ return NACK;
+ }
+ }
+
+ return bAck;
+}
\ No newline at end of file