private void RiseX24C01(int bit) { switch (mode) { case EpromMode.Addressing: if (cbit < 7) { caddress &= ~(1 << cbit); caddress |= bit << cbit++; } else if (cbit < 8) { cbit = 8; if (bit != 0) { nextmode = EpromMode.Read; cdata = data[caddress]; } else { nextmode = EpromMode.Write; } } break; case EpromMode.Ack: output = 0x00; break; case EpromMode.Read: if (cbit < 8) { output = (cdata & 1 << cbit++) != 0 ? 0x10 : 0x00; } break; case EpromMode.Write: if (cbit < 8) { cdata &= ~(1 << cbit); cdata |= bit << cbit++; } break; case EpromMode.AckWait: if (bit == 0) { nextmode = EpromMode.Idle; } break; } }
public void HardReset() { pscl = false; psda = false; mode = EpromMode.Idle; nextmode = EpromMode.Idle; cbit = 0; caddress = 0; cdata = 0; isRead = false; output = 0x10; }
public void LoadState(System.IO.BinaryReader stream) { stream.Read(data, 0, data.Length); mode = (EpromMode)stream.ReadInt32(); nextmode = (EpromMode)stream.ReadInt32(); psda = stream.ReadBoolean(); pscl = stream.ReadBoolean(); output = stream.ReadInt32(); cbit = stream.ReadInt32(); caddress = stream.ReadInt32(); cdata = stream.ReadInt32(); isRead = stream.ReadBoolean(); }
private void RiseX24C02(int bit) { switch (mode) { case EpromMode.Data: if (cbit < 8) { cdata &= ~(1 << (7 - cbit)); cdata |= bit << (7 - cbit++); } break; case EpromMode.Addressing: if (cbit < 8) { caddress &= ~(1 << (7 - cbit)); caddress |= bit << (7 - cbit++); } break; case EpromMode.Read: if (cbit < 8) { output = (cdata & 1 << (7 - cbit++)) != 0 ? 0x10 : 0x00; } break; case EpromMode.Write: if (cbit < 8) { cdata &= ~(1 << (7 - cbit)); cdata |= bit << (7 - cbit++); } break; case EpromMode.NotAck: output = 0x10; break; case EpromMode.Ack: output = 0x00; break; case EpromMode.AckWait: if (bit == 0) { nextmode = EpromMode.Read; cdata = data[caddress]; } break; } }
private void Start() { switch (device) { case EpromDevice.X24C01: mode = EpromMode.Addressing; cbit = 0; caddress = 0; output = 0x10; break; case EpromDevice.X24C02: mode = EpromMode.Data; cbit = 0; output = 0x10; break; } }
private void FallX24C01() { switch (mode) { case EpromMode.Addressing: if (cbit == 8) { mode = EpromMode.Ack; output = 0x10; } break; case EpromMode.Ack: mode = nextmode; cbit = 0; output = 0x10; break; case EpromMode.Read: if (cbit == 8) { mode = EpromMode.AckWait; caddress = (caddress + 1) & 0x7F; } break; case EpromMode.Write: if (cbit == 8) { mode = EpromMode.Ack; nextmode = EpromMode.Idle; data[caddress] = (byte)cdata; caddress = (caddress + 1) & 0x7F; } break; } }
private void FallX24C02() { switch (mode) { case EpromMode.Data: if (cbit == 8) { if ((cdata & 0xA0) == 0xA0) { cbit = 0; mode = EpromMode.Ack; isRead = (cdata & 0x01) == 1; output = 0x10; if (isRead) { nextmode = EpromMode.Read; cdata = data[caddress]; } else { nextmode = EpromMode.Addressing; } } else { mode = EpromMode.NotAck; nextmode = EpromMode.Idle; output = 0x10; } } break; case EpromMode.Addressing: if (cbit == 8) { cbit = 0; mode = EpromMode.Ack; nextmode = (isRead ? EpromMode.Idle : EpromMode.Write); output = 0x10; } break; case EpromMode.Read: if (cbit == 8) { mode = EpromMode.AckWait; caddress = (caddress + 1) & 0xFF; } break; case EpromMode.Write: if (cbit == 8) { cbit = 0; mode = EpromMode.Ack; nextmode = EpromMode.Write; data[caddress] = (byte)cdata; caddress = (caddress + 1) & 0xFF; } break; case EpromMode.NotAck: mode = EpromMode.Idle; cbit = 0; output = 0x10; break; case EpromMode.Ack: case EpromMode.AckWait: mode = nextmode; cbit = 0; output = 0x10; break; } }
private void RiseX24C02(int bit) { switch (mode) { case EpromMode.Data: if (cbit < 8) { cdata &= ~(1 << (7 - cbit)); cdata |= bit << (7 - cbit++); } break; case EpromMode.Addressing: if (cbit < 8) { caddress &= ~(1 << (7 - cbit)); caddress |= bit << (7 - cbit++); } break; case EpromMode.Read: if (cbit < 8) output = (cdata & 1 << (7 - cbit++)) != 0 ? 0x10 : 0x00; break; case EpromMode.Write: if (cbit < 8) { cdata &= ~(1 << (7 - cbit)); cdata |= bit << (7 - cbit++); } break; case EpromMode.NotAck: output = 0x10; break; case EpromMode.Ack: output = 0x00; break; case EpromMode.AckWait: if (bit == 0) { nextmode = EpromMode.Read; cdata = data[caddress]; } break; } }
private void RiseX24C01(int bit) { switch (mode) { case EpromMode.Addressing: if (cbit < 7) { caddress &= ~(1 << cbit); caddress |= bit << cbit++; } else if (cbit < 8) { cbit = 8; if (bit != 0) { nextmode = EpromMode.Read; cdata = data[caddress]; } else { nextmode = EpromMode.Write; } } break; case EpromMode.Ack: output = 0x00; break; case EpromMode.Read: if (cbit < 8) output = (cdata & 1 << cbit++) != 0 ? 0x10 : 0x00; break; case EpromMode.Write: if (cbit < 8) { cdata &= ~(1 << cbit); cdata |= bit << cbit++; } break; case EpromMode.AckWait: if (bit == 0) nextmode = EpromMode.Idle; break; } }
private void Stop() { mode = EpromMode.Idle; output = 0x10; }