Exemple #1
0
void Enc28j60::reset(void)
{
    // Trigger a software reset
    writeOperation(ENC28J60_SOFT_RESET, 0, ENC28J60_SOFT_RESET);

    // Errata #2: Wait for at least 1 ms after software reset
    for (uint32_t i = 0x1FFF; i != 0; i--)
        ;

    // Wait until the clock becomes ready
    while(!readOperation(ENC28J60_READ_CTRL_REG, ESTAT) & ESTAT_CLKRDY);

    // Store a pointer to the next packet
    nextPacketPtr = RXSTART_INIT;

    // Set the packet transmit and receive buffers
    writeRegister(ERXST, RXSTART_INIT);
    writeRegister(ERXRDPT, RXSTART_INIT);
    writeRegister(ERXND, RXSTOP_INIT);
    writeRegister(ETXST, TXSTART_INIT);
    writeRegister(ETXND, TXSTOP_INIT);

    // Set MACON1 register
    writeRegisterByte(MACON1, MACON1_MARXEN | MACON1_TXPAUS | MACON1_RXPAUS);

    // Set MACON2 register
    writeRegisterByte(MACON2, 0x00);

    // Set MACON3 registers
    writeOperation(ENC28J60_BIT_FIELD_SET, MACON3, MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN);

    // Set Non-Back-to-Back Inter-Packet Gap
    writeRegister(MAIPG, 0x0C12);

    // Set Back-to-Back Inter-Packet Gap
    writeRegisterByte(MABBIPG, 0x12);

    // Set maximum frame length
    writeRegister(MAMXFL, MAX_FRAMELEN);

    // Set MAC address
    writeRegisterByte(MAADR5, macAddress[0]);
    writeRegisterByte(MAADR4, macAddress[1]);
    writeRegisterByte(MAADR3, macAddress[2]);
    writeRegisterByte(MAADR2, macAddress[3]);
    writeRegisterByte(MAADR1, macAddress[4]);
    writeRegisterByte(MAADR0, macAddress[5]);

    // Errata #9/10: Disable loopback in half-duplex
    writePhy(PHCON2, PHCON2_HDLDIS);

    // Set ECON1 bank
    setBank(ECON1);

    // Enable packet interrupt
    writeOperation(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE | EIE_PKTIE);

    // Enable packet reception
    writeOperation(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_RXEN);
}
Exemple #2
0
OperationResult Enc28j60::transmitFrame(uint8_t* data, uint32_t length)
{
    // Errata #12: In half-duplex, transmit logic may stall
    while (readOperation(ENC28J60_READ_CTRL_REG, ECON1) & ECON1_TXRTS)
    {
        if (readRegisterByte(EIR) & EIR_TXERIF)
        {
            writeOperation(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRST);
            writeOperation(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRST);
        }
    }

    // Set transmit buffer start and end
    writeRegister(EWRPT, TXSTART_INIT);
    writeRegister(ETXND, TXSTART_INIT + length);

    // Use default per packet control bytes
    writeOperation(ENC28J60_WRITE_BUF_MEM, 0, 0x00);

    // Write data to buffer
    writeBuffer(data, length);

    // Enable transmission
    writeOperation(ENC28J60_BIT_FIELD_SET, ECON1, ECON1_TXRTS);

    return ResultSuccess;
}
Exemple #3
0
Instruction encodeInst(std::string const& dis_)
{
	Instruction inst;
	std::string dis;
	bool not_num = true;
	for(char s : dis_){
		if(!not_num){
			dis += s;
		}else if(::isalpha(s)){
			dis += static_cast<char>(::toupper(s));
		}else if(::isdigit(s)){
			not_num = false;
			dis += s;
		}else if(!::isspace(s)){
			dis += s;
		}
	}
	if(readOperation(inst, dis) < 0) {
		inst.op_ = Operation::Invalid;
	}else if(readAddrMode(inst, dis.substr(3)) < 0){
		inst.op_ = Operation::Invalid;
	}
	if(inst.op_ != Operation::Invalid){
		unsigned int code = static_cast<unsigned int>(inst.op_) | static_cast<unsigned int>(inst.addrMode_);
		for(int i=0;i<256;++i){
			if( symCode[i] == code ) {
				inst.bin[0] = i;
				return inst;
			}
		}
	}
	inst.op_ = Operation::Invalid;
	return inst;
}