//Same as the previous function, except that it reads multiple registers and stores them in data //The code must ensure that *data is large enough to contain all read data void DS1307RegisterRMult(uint8_t FirstReg, uint8_t NumReg, uint8_t *data){//Read from arbitrary number of registers TWIStart(); TWIWrite(DS1307ADDRESS | (0 << 0)); TWIWrite(FirstReg); TWIStart(); TWIWrite(DS1307ADDRESS | (1 << 0)); for(uint8_t i = 0; i < (NumReg - 1); i++){ data[i] = TWIReadACK(); } data[NumReg] = TWIReadNACK(); }
//Reads from a single register //Again, speed is generally not an issue, so this is adequate for most applications uint8_t DS1307RegisterR(uint8_t reg){//Read from a single register uint8_t data = 0; TWIStart(); TWIWrite(DS1307ADDRESS | (0 << 0)); TWIWrite(reg); TWIStart(); TWIWrite(DS1307ADDRESS | (1 << 0)); data = TWIReadNACK(); TWIStop(); return data; }
void TWIRead(uint8_t address, uint8_t *data, uint8_t length) { //Start comms TWIStart(); //Address slave for reading TWIAddress(address, 0x01); //Do not read last byte with ack for(unsigned int ii = 0; ii < length; ++ii) { *data++ = TWIReadACK(); } //Read last bit with nack *data = TWIReadNACK(); //Generate stop TWIStop(); }
// Gets the current percentage of the battery void getBatteryPercentage(void){ TWIStart(); TWIWrite(DS2782EAddress); // Average current TWIWrite(0x10); // Current accumulation TWIStart(); //Check status TWIWrite(DS2782EAddress|0b00000001); vcc = TWIReadACK() << 8;//} vcc += TWIReadNACK(); vcc = vcc*(0.3125); // 6.25uVh/Rsns = 6.25u/20mOhm = 0.0003125Ah = 0.3125mAh = 1/3.2 = 312uA vcc = (vcc * 100) / 300; // Converting to % (assumming 373mAh = 100% from experiment TWIStop(); }
uint16_t ReadTemp(uint8_t var){ uint8_t addr = 0x90; uint8_t regPtr = 0x00; addr = addr & 0xFE; TWIStart(); TWIWrite(addr); TWIWrite(regPtr); TWIStart(); TWIWrite(addr | 0x01); uint8_t data1 = TWIReadACK(); uint8_t data2 = TWIReadNACK(); TWIStop(); uint8_t val = (data1 & 0x7F )<<1; uint8_t add = (data2 & 0x80)>>7; uint8_t sign = (data1 & 0x80)>>7; uint16_t res = val | add; res = res | ((uint16_t)sign) << 8; return res; }
uint16_t ReadWord( uint8_t deviceAddr, uint8_t regPtr ){ uint16_t data = 0; uint8_t * datal = ((uint8_t*)&data); uint8_t * datah = (((uint8_t*)&data)+1); // Step a bit forward, just like using an array uint8_t reply; int i = 0; // Write Device Addr // Device addr is built according to the scheme: // 0011,A2,A1,A0,RW // 0011 = 0x30 // A2,A1,A0 Mask = 0x0E uint8_t addr = 0; addr = 0x90 | ( deviceAddr & 0x0E ); // Set RW Bit for Reading // addr = addr | 0x0C; // addr = addr | 0x80; // Write Device Addr, WRITING i = 0; for( ; i < RETRIES; i++ ){ TWIStart(); if ((reply = TWIGetStatus()) != TW_START){ TWIStop(); return ERROR; } TWIWrite(addr & 0xFE); reply = TWIGetStatus(); if (reply == TW_MT_SLA_ACK){ // READ an ACK break; }else if (reply == TW_MT_SLA_NACK || reply == TW_MT_ARB_LOST ){ continue; }else{ TWIStop(); return ERROR; } if( i == RETRIES -1 ){ TWIStop(); return ERROR; } } // Write Register Addr TWIWrite(regPtr); reply = TWIGetStatus(); if (reply != TW_MT_DATA_ACK){ // READ an ACK TWIStop(); return ERROR; } TWIStart(); TWIWrite(addr | 0x01); //*datah = TWIReadACK(); uint8_t data1 = TWIReadACK(); if ((reply = TWIGetStatus()) != TW_MR_DATA_ACK){ // READ an ACK TWIStop(); return ERROR; } //*datal = TWIReadNACK(); uint8_t data2 = TWIReadNACK(); if ((reply = TWIGetStatus()) != TW_MR_DATA_NACK){ // READ an ACK TWIStop(); return ERROR; } TWIStop(); return data; }