예제 #1
0
bool ARMDebug::dpRead(unsigned addr, bool APnDP, uint32_t &data)
{
    unsigned retries = 10;
    unsigned ack;

    do {
        wireWrite(packHeader(addr, APnDP, true), 8);
        wireReadTurnaround();
        ack = wireRead(3);

        switch (ack) {
        case 1:     // Success
            data = wireRead(32);
            if (wireRead(1) != evenParity(data)) {
                wireWriteTurnaround();
                wireWriteIdle();
                log(LOG_ERROR, "PARITY ERROR during read (addr=%x APnDP=%d data=%08x)",
                    addr, APnDP, data);
                return false;
            }
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_TRACE_DP, "DP  Read  [%x:%x] %08x", addr, APnDP, data);
            return true;

        case 2:     // WAIT
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_TRACE_DP, "DP  WAIT response, %d retries left", retries);
            retries--;
            break;

        case 4:     // FAULT
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_ERROR, "FAULT response during read (addr=%x APnDP=%d)", addr, APnDP);
            if (!handleFault())
                log(LOG_ERROR, "Error during fault recovery!");
            return false;

        default:
            wireWriteTurnaround();
            wireWriteIdle();
            log(LOG_ERROR, "PROTOCOL ERROR response during read (ack=%x addr=%x APnDP=%d)", ack, addr, APnDP);
            return false;
        }
    } while (retries--);

    log(LOG_ERROR, "WAIT timeout during read (addr=%x APnDP=%d)", addr, APnDP);
    return false;
}
예제 #2
0
/*full algorithm for temperature measuring without delays for cooking new value*/
int MeansureTemp(){
	wireInit();
	wireSend(0xCC);
	wireSend(0xBE);

	int Temp[2];
	Temp[0] = wireRead();
	Temp[1] = wireRead();
	int Result = ((Temp[1]<<8) + Temp[0]) >> 4;

	wireInit();
	wireSend(0xCC);
	wireSend(0x44);
	
	return Result;
}