Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Программатор SEEPROM для серии 93Сxx   Найти похожие ветки 

 
Proger121   (2005-08-21 16:17) [0]

Всем привет.
Ктонибудь сталкивался с программированием этих микросхем через лпт?
Может компонент есть какой или ктото уже чтонибудь в этом плане делал?
Подскажите плз..


 
Defunct ©   (2005-08-21 19:25) [1]

Сталкивался. Ничего сложного там нет.

> Может компонент есть какой или ктото уже чтонибудь в этом плане делал?

компонента такого нет, т.к. нет стандартой схемы включения 93Cxx через LPT порт. Обвязка же для работы с LPT в Delphi под все ОС, в инете есть. Дальше просто работаешь с 93Cxx сигналами на основе datasheet"а. (стробируешь по STOBE, читаешь по ACK, данные выдаешь по SELECT. Питание 93Cxx можно организовать по INIT.


 
Defunct ©   (2005-08-21 19:36) [2]

схему включения можешь сделать по аналогии
http://www.ic-prog.com/funcard.jpg

вместо Reset - CS
вместо SCK - SK
вместо MISO - DI
вместо MOSI - DO


 
ssk ©   (2005-08-22 08:56) [3]

поищи программатор Ponyprog


 
Proger121   (2005-08-22 15:19) [4]

Куда что подключать я разобрался.
Прока не понятно
Сlk задовать таймером и с каким интервалом?
В доках на память период измеряеся в нс а в таймере минимальное значение 1 = 1мсек. (Вроде так)

Может кто алгоритм подскажет пошаговый допустим на запись?

Другие програматоры это все понятно, у самого несколько.
Хочется чтение мелкосхем и их запись организовать в своей программе.
Если кто может помочь я отблагадарю - шабашка одним словом.
пишите на мыло seller@japan.com
Буду рад любой помощи.


 
Defunct ©   (2005-08-22 17:01) [5]

Proger121   (22.08.05 15:19) [4]

> Сlk задовать таймером и с каким интервалом?

(нижеприведенная процедура шьет в т.ч. 93Cxx):

procedure TDuplexDataChannel.WriteByte;
var
  i : integer;
begin
  CS.Acquire;
  try
     fConverter.WHex( B );
     for i := 7 downto 0 do
     begin
        fPortD.WBit( sSCLK, 0 );
        fPortD.WBit( sMOSI, fConverter.RBit( i ));
        fLPT.WritePort( LPT2, 0, fPortD.RHex );
        sleep( 0 );
        fPortD.WBit( sSCLK, 1);
        fLPT.WritePort( LPT2, 0, fPortD.RHex );  // Запись строба
 //       sleep( 0 );
       if fFastMode then
          Sleep(0)
       else
          Sleep(1)
       end;
     fPortD.WBit( sSCLK, 0 );
     fLPT.WritePort( LPT2, 0, fPortD.RHex );
     if fFastMode then
        Sleep(0)
     else
        Sleep(1)
  finally
     CS.Release
  end
end;


 
Proger121   (2005-08-22 17:38) [6]

Defunct © Спаибо.
Вобщем без таймера делается, через Sleep.
а fLPT и fPortD это от куда берется?
Если не сложно напиши мне плз... на мыло.
Я уже пЫва заготовил :)


 
Proger121   (2005-08-22 18:10) [7]

Еще есть вопрос такой.
В доках на память вот что написано
Write mode:

DI  1  0  1  A5 A4 A3 A2 A1 A0 D15 D14 D13 D12 D11 ... D2 D1 D0
DO                                                            BSY RDY
Значит по DI на каждый такт посылаем 1, 0, 1, а вот A5, A4, A3 и тд.. это сами данные или что?


 
Proger121   (2005-08-22 19:26) [8]

Разобрался что к чему.
Получилось записать в память то что хотел по заданному адресу.
Буду дальше разбираться :)

Спасибо всем кто ответил.


 
Defunct ©   (2005-08-22 19:59) [9]

> а fLPT и fPortD это от куда берется?

а fLPT это обёртка LPT порта, в инете таких пруд пруди.
fPortD/fConverter - обёрта для работы с битами.


> Получилось записать в память то что хотел по заданному адресу.

поздравляю!
считай уже все готово ;>

читать практически точно также.


 
Defunct ©   (2005-08-22 20:07) [10]

> Proger121

ты ж тока учитывай, что у разных 93C разная ширина адреса и данных.


 
Proger121   (2005-08-22 22:26) [11]

fPortD/fConverter можно ссылочку на эту обертку ?
я пока пользуюсь LPTIO
Читать буду 11 пином LPT. вроде так.
А  на счет разная шина - это распиновка имеется ввиду?
И адреса данных имеется ввиду размер? как например 93C46 и 93C56


 
Defunct ©   (2005-08-23 00:26) [12]

> А  на счет разная шина
не шина а ширина! ;>
> И адреса данных имеется ввиду размер?
да.
кол-во слов и кол-во бит в слове.

> fPortD/fConverter можно ссылочку на эту обертку ?
я ее сам писал, поделиться могу т.к. уже выкладывал.
Ты б и сам такое смог написать ;>

const
  pACK   = 6;
  pDuplex = 5; { Двунаправленный порт }
  sReset  = 4; { Pin 6, Четвертый бит региста данных }
  sMOSI   = 5; { Pin 7, Пятый бит регистра данных }
  sMISO   = 7; { Pin 10, Седьмой бит регистра данных }
  sSCLK   = pACK; { Pin 8, сигнал АCK порт B}

  Platform_Type = 32;

type
  TRegister = object
  private
     fValue     : Cardinal;
     fMax       : Cardinal;
     fCarry     : Byte;
     fWL        : Byte;

  public
     procedure   WHex( Value : Cardinal );
     procedure   WBit( N, Bit: Byte);
     function    RBit(N:Byte):Byte;
     function    RHex:Cardinal;
     function    Carry:Byte;
     function    Parity:Byte;
     constructor Init(WordLength:Byte);
     destructor  Done;
  end;

...
...
{******************************}
{******** TRegister ***********}
{******************************}
var ZMask, AMask : Array[0..Platform_Type] of Cardinal;

constructor TRegister.Init(WordLength: Byte);
begin
 if (WordLength > 0) and (WordLength <= Platform_Type) then
    begin
       fWL := WordLength;
       fMax := AMask[WordLength] - 1;
    end
 else
    raise Exception.Create("Could not initialize register");
end;

function TRegister.Carry: Byte;
begin
 Result := fCarry;
 fCarry := 0
end;

function TRegister.Parity: Byte;
var
 i           : integer;
 ActiveCount : integer;
begin
 ActiveCount := 0;
 for i := 0 to fWL - 1 do
     if RBit(i)<>0 then
        inc(ActiveCount);

 Result := (ActiveCount and 1);
end;

function TRegister.RBit(N: Byte): Byte;
begin
 if N < fWL then
    Result := Byte((fValue and AMask[N]) <> 0 )
 else
    raise Exception.Create("index out of bound")
end;

function TRegister.RHex: Cardinal;
begin
 Result := fValue
end;

procedure TRegister.WBit(N, Bit: Byte);
begin
 if N < fWL then
    begin
      if Bit <> 0 then
         fValue := fValue or AMask[N]
      else
         fValue := fValue and ZMask[n]
    end
 else
    raise Exception.Create("index out of bound");
end;

procedure TRegister.WHex(Value: Cardinal);
begin
 if Value > fMax then
    begin
       fValue := Value and fMax;
       fCarry := 1
    end
 else
    begin
       fValue := Value;
       fCarry := 0
    end
end;

destructor TRegister.Done;
begin
end;
{******************************}
procedure Platform_Init;
var
 i : integer;
 A : Cardinal;
begin
 for i := 0 to Platform_Type - 1 do
 begin
    A := 1 shl i;
    AMask[i] := A;
    ZMask[i] := not A
 end
end;

initialization

 Platform_Init

finalization

end.


 
Proger121   (2005-08-23 09:46) [13]

ОООО!
Вот спасибо тебе.
Буду дальше разбираться


 
proger121   (2005-08-23 20:56) [14]

Опять в тупик уперся :(
не понятно как данные читаются
что значит 16 битный и 8 битный режим
это значит по 8 бит или по 16 данные считываются за раз?

Если в памяти записано допустим

66 77 88 FF и т.д.

то как считать допустим данные по адресу h02 (88)
что нужно послать по DI ?
Посылаем команду на чтение 1100(помоему), адрес ячейки 00000010, и ждем ответа от микросхемы?
так не так ?


 
Proger121   (2005-08-23 21:57) [15]

Ну вот и с этим уже разобрался!
теперь все в кучку надо собрать :)
читать и писать мы теперь умеем :)


 
Proger121   (2005-08-23 21:59) [16]

еще и со второго байта начинает передавать а потом первый.
Ну такое в доке гдето видел нада потом байты свапить !


 
Defunct ©   (2005-08-24 00:31) [17]

Proger121   (23.08.05 21:59) [16]

Берешь приведенную обертку, делаешь
fConverter.Init(8)

перед чтением данных записываешь в него 1 - WHex(1),
при Carry - считываешь принятый байт, и опять записываешь 1. Carry сбрасывается автоматом.
это позволит работать и в 8-ми и в 16-ти разрядном режимах практически одинаково.

> Посылаем команду на чтение 1100(помоему), адрес ячейки 00000010, и ждем ответа от микросхемы?
Все подряд идет, послал команду чтения, закинул адрес и читаешь данные пока CS не снят.


 
Defunct ©   (2005-08-24 00:39) [18]

> перед чтением данных записываешь

при чтении записываешь очередной принятый бит так:
fConverter.WHex( (fConverter.RHex shl 1) or <Принятый Бит>);

if fConverter.Carry > 0 then <Сохранить fConverter.RHex>


 
proger121   (2005-08-25 16:55) [19]

Чето я намутил не то.
Читать получается без проблем.
уже утилку написал которая дампы делает - все ок.
Но чето записать не получается. хотя раньше получалось.
посылаю 101-команда
       000001-адрес
       1111111111111111-данные.
тоесть посылаю подряд 1010000011111111111111111
пои иде FFFF должно прописаться, но ниче вообще не меняется.

А и еще самое интересное.
Чтобы читать данные написал функцию которая посылает данные
SendLpt(".....") потом жду ответ
все приходит как положено тоесть сама функция рабочая.
Через нее шлю команду на запись
SendLpt("1010000011111111111111111") и не записывается.
может команда другая?

и ниче не происходит.


 
Defunct ©   (2005-08-25 21:51) [20]

proger121   (25.08.05 16:55) [19]

А стирать кто за тебя будет?
Если в ячейке данные уже записаны (т.е. не FFFF) то их надо предварительно стереть. С другой стороны записывать (FFFF не имеет смысла, т.к. при стирании имеем FFFF).

по командам все верно.
запись 101
чтение 110
стирание 111


 
Proger121   (2005-08-25 23:48) [21]

АААА!!!!!
Вот в чем дело!!!!
Стирать нада сначало.
Defunct - тебе куда пиво отправлять ???


 
Proger121   (2005-08-26 00:01) [22]

Чето и так не получилось.
Наверно нада еще CLK не останавливать сразу после стирания
а сначала делать в 0 а потом в еденицу.


 
Defunct ©   (2005-08-26 03:01) [23]

Proger121   (26.08.05 0:01) [22]
> Наверно нада еще CLK не останавливать сразу после стирания


CS надо передернуть (1/0/1) после подачи адреса, и DO перещелкнуть (0->1), смотри в datasheet"е там же ж все как на ладони. Фантазировать не нужно ;>


 
Defunct ©   (2005-08-26 03:04) [24]

> DO перещелкнуть (0->1)

Всмысле, дождаться пока перещелкнет.


 
Proger121   (2005-08-26 08:15) [25]

Окей. Буду пробовать.


 
Proger121   (2005-08-26 15:28) [26]

Странна но DO сразу после записи 1 выдает.
и так ниче не получилось.


 
Proger121   (2005-08-26 22:05) [27]

Все ! я здаюсь.
Записать так и не получается :(
как раньше делал немогу вспомнить.
Может гдето в другом глюк образовался :(


 
Proger121   (2005-08-27 12:26) [28]

Почемуто с чтением все окей.
Делаю вот так
запрос на чтение адреса 0
SendDataToport("110000000");
showmessage(GetDataPort);
все работает как часы.
Все остальное если посылать через эту процедуру эфекта не дает.
хотя я и стирал предварительно и CS переключал как в спецификации указано.
Пытался даже после команды EWEN записывать.
эфект 0
:(((((((((((((((((


 
Proger121   (2005-09-03 20:01) [29]

Помогите.
Так и не получается записать :(


 
Defunct ©   (2005-09-04 18:41) [30]

> Proger121
> Все остальное если посылать через эту процедуру эфекта не дает.

так не бывает.
У тебя что-то с задержками не то.
Приведи код SendDataToPort()


 
Proger121   (2005-09-07 15:57) [31]

Все работает.
Уже доделал программу до конца.
Проблема была в дохлой микросхеме.:)
Теперь все типы 46,56,66 читает, пишет, стирает.
Все гуд.
Спасибо всем кто ответил.
Особенное спасибо Defunct"у!!!



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.041 c
2-1129469248
Megabyte
2005-10-16 17:27
2005.11.13
Вопрос по IBX


6-1122714955
CAMCOH
2005-07-30 13:15
2005.11.13
Помогите плз с переходом Indy 9 - Indy 10


11-1111072940
uuzh
2005-03-17 18:22
2005.11.13
2 ECM Порт FBL под KOL


1-1129891440
DelphiLexx
2005-10-21 14:44
2005.11.13
Движение компонента


14-1129728847
Shst
2005-10-19 17:34
2005.11.13
Вопрос про Select





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский