void SMI::read(byte HB, byte LB, byte target[]) { start(); //OP code opRead(); putAddress(HB, LB); //send register address readTurnA(); getData(target, 2); }
/** * Set bits in EEPROM 4-wire interface. * * @param u32Wires Values of DI, CS, SK. * @remarks The value of DO bit in 'u32Wires' is ignored. */ void EEPROM93C46::write(uint32_t u32Wires) { if (u32Wires & WIRES_CS) { if (!(m_u32InternalWires & WIRES_SK) && (u32Wires & WIRES_SK)) { /* Positive edge of clock */ if (m_eState == STANDBY) { if (u32Wires & WIRES_DI) { m_eState = READING_DI; m_eOp = OP_DECODE; m_u16Mask = OPADDR_MSB; m_u16Word = 0; } } else { if (m_eState == READING_DI) { if (u32Wires & WIRES_DI) { m_u16Word |= m_u16Mask; } } else if (m_eState == WRITING_DO) { m_u32InternalWires &= ~WIRES_DO; if (m_u16Word & m_u16Mask) { m_u32InternalWires |= WIRES_DO; } } else return; /* Next bit */ m_u16Mask >>= 1; if (m_u16Mask == 0) { switch (this->m_eOp) { case OP_READ: m_eState = opRead(); break; case OP_WRITE: m_eState = opWrite(); break; case OP_WRITE_ALL: m_eState = opWriteAll(); break; case OP_DECODE: m_eState = opDecode(); break; default: ; } } } } else if (m_eState == WAITING_CS_RISE) { m_u32InternalWires |= WIRES_DO; /* ready */ m_eState = STANDBY; } }
/** * Decode opcode and address from 'opAddr' member. * * Decodes operation and executes it immediately if possible; otherwise, stores * the decoded operation and address. * * @returns New state */ EEPROM93C46::State EEPROM93C46::opDecode() { switch (m_u16Word>>6) { case 3: /* ERASE */ storeWord(m_u16Word & ADDR_MASK, 0xFFFF); return WAITING_CS_FALL; case 2: /* READ */ m_eOp = OP_READ; m_u16Addr = m_u16Word & ADDR_MASK; return opRead(); /* Load first word */ case 1: /* WRITE */ m_eOp = OP_WRITE; m_u16Addr = m_u16Word & ADDR_MASK; m_u16Word = 0; m_u16Mask = DATA_MSB; return READING_DI; case 0: switch (m_u16Word>>4) { case 0: /* ERASE/WRITE DISABLE */ m_fWriteEnabled = false; return STANDBY; case 1: /* WRITE ALL */ m_eOp = OP_WRITE_ALL; m_u16Word = 0; m_u16Mask = DATA_MSB; return READING_DI; case 2: /* ERASE ALL */ /* Re-use opWriteAll */ m_u16Word = 0xFFFF; return opWriteAll(); case 3: /* ERASE/WRITE ENABLE */ m_fWriteEnabled = true; return STANDBY; } } return m_eState; }