Пример #1
0
//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();
}
Пример #2
0
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();
}
Пример #3
0
// 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();
}
Пример #4
0
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;
}
Пример #5
0
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;
}