private void ReadFromEEPROM(ushort address, int count, byte[] dest, int start, bool resetFIFO) { #region /Проверка аргументов/ if (_Protocol.Transport == null) { throw new ArgumentNullException("protocol", "Не задан транспорт для протокола"); } if (!_Protocol.Transport.Connected) { throw new IOException("Связь с устройством не установлена"); } if (address >= _EEPROMSize) { throw new ArgumentOutOfRangeException("address"); } if (dest == null) { throw new ArgumentNullException("dest"); } if (start < 0 || start >= dest.Length) { throw new ArgumentOutOfRangeException("start"); } if (count < 1 || count > _EEPROMBlockSize || (address + count) > _EEPROMSize || (start + count) > dest.Length) { throw new ArgumentOutOfRangeException("count"); } #endregion /Проверка аргументов/ if (resetFIFO) { // сбрасываем FIFO DoAction(EnumAction.Reset, false); } //конфигурируем доступ к eeprom W10Register w10 = new W10Register(W10Register.EnumEEPROMAction.Read, (ushort)count, address); _Protocol.PrepareWriteRequest(w10); R4RegisterBase r4 = new R4RegisterBase(); double maxTryTime = 1; //сек DateTime startTime = DateTime.Now; while (true) { _Protocol.SendRequestAndReadRegister(r4); if ((DateTime.Now - startTime).TotalSeconds > maxTryTime) { throw new IOException("Превышено время ожидания завершения операции"); } if (!r4.EEPROMStatus) { throw new IOException("Ошибка записи/чтения EEPROM"); } if (r4.EEPROMReady) { break; } } Register <ushort> r15 = new Register <ushort>(15, _EEPROMBlockSize); _Protocol.SendRequestAndReadRegister(r15); for (int i = 0; i < count; i++) { dest[start + i] = (byte)r15.Data[i]; } }
private void WriteToEEPROM(byte[] src, int start, int count, ushort address, bool resetFIFO) { #region /Проверка аргументов/ if (_Protocol.Transport == null) { throw new ArgumentNullException("protocol", "Не задан транспорт для протокола"); } if (!_Protocol.Transport.Connected) { throw new IOException("Связь с устройством не установлена"); } if (src == null) { throw new ArgumentNullException("src"); } if (start < 0 || start >= src.Length) { throw new ArgumentOutOfRangeException("start"); } if (address >= _EEPROMSize) { throw new ArgumentOutOfRangeException("address"); } if (count < 1 || count > _EEPROMBlockSize || (address + count) > _EEPROMSize || (start + count) > src.Length) { throw new ArgumentOutOfRangeException("count"); } #endregion /Проверка аргументов/ _Protocol.ClearRequest(); if (resetFIFO) { // сбрасываем FIFO DoAction(EnumAction.Reset, false); } Register <uint> w15 = new Register <uint>(15, _EEPROMBlockSize / 2); //2 ushort в 1 uint for (int i = 0, j = 0; i < count; i += 2, j++) { uint val = src[start + i]; if (i + 1 < count) { val += (uint)(src[start + i + 1] << 16); } w15.Data[j] = val; } _Protocol.PrepareWriteRequest(w15); //конфигурируем доступ к eeprom W10Register w10 = new W10Register(W10Register.EnumEEPROMAction.Write, (ushort)count, address); _Protocol.PrepareWriteRequest(w10); R4RegisterBase r4 = new R4RegisterBase(); double maxTryTime = 1; //сек DateTime startTime = DateTime.Now; while (true) { _Protocol.SendRequestAndReadRegister(r4); if ((DateTime.Now - startTime).TotalSeconds > maxTryTime) { throw new IOException("Превышено время ожидания завершения операции"); } if (!r4.EEPROMStatus) { throw new IOException("Ошибка записи/чтения EEPROM"); } if (r4.EEPROMReady) { break; } Thread.Sleep(100); } }