unsigned char CSccb::Read(unsigned char addr) { unsigned char i, val; // 2 phase Start(); Write(m_dev); Write(addr); Stop(); Start(); Write(m_dev + 1); TriState(); for (i=0, val=0; i<8; i++) { val <<= 1; PortWrite(1, 0); if (DATA_REG&DATA_MASK) val |= 1; PortWrite(0, 0); } // send NA bit PortWrite(0, 1); Drive(); PortWrite(1, 1); PortWrite(0, 1); Stop(); return val; }
void CSccb::Write(unsigned char val) { unsigned char i; for (i=0; i<8; i++, val<<=1) { if (val&0x80) // send msb first { PortWrite(0, 1); PortWrite(1, 1); PortWrite(0, 1); } else { PortWrite(0, 0); PortWrite(1, 0); PortWrite(0, 0); } } // send "don't care" bit TriState(); PortWrite(0, 0); PortWrite(1, 0); PortWrite(0, 0); Drive(); }
/** * @brief * This method transmits au8Buffer to Serial line. * Only if u8txenpin != 0, there is a flow handling in order to keep * the RS485 transceiver in output state as long as the message is being sent. * This is done with UCSRxA register. * The CRC is appended to the buffer before starting to send it. * * @param nothing * @return nothing * @ingroup buffer */ void ModbusSendTxBuffer() { // uint8_t i = 0; // append CRC to message uint16_t u16crc = ModbusCalcCRC(_u8BufferSize); _au8Buffer[ _u8BufferSize ] = u16crc >> 8; _u8BufferSize++; _au8Buffer[ _u8BufferSize ] = u16crc & 0x00ff; _u8BufferSize++; // transfer buffer to serial line PortWrite(_au8Buffer, _u8BufferSize); // keep RS485 transceiver in transmit mode as long as sending //!!! port->flush(); _u8BufferSize = 0; // set time-out for master _u32timeOut = millis() + (unsigned long) _u16timeOut; // increase message counter _u16OutCnt++; }
CSccb::CSccb(unsigned char dev) { m_dev = dev; DIR_REG |= CLK_MASK; TriState(); // set clock as output, data tristate PortWrite(1, 0); // set clock high (idle) // #if 0 volatile unsigned long val; Drive(); PortWrite(0, 0); PortWrite(0, 1); PortWrite(1, 0); PortWrite(1, 1); TriState(); // set clock as output, data tristate val = DATA_REG&DATA_MASK; val = DATA_REG&DATA_MASK; val = DATA_REG&DATA_MASK; #endif }
void MemMapper::Reset() { PortWrite(0, 0); }