Exemplo n.º 1
0
        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];
            }
        }
Exemplo n.º 2
0
        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);
            }
        }