Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.13;
Скачать: CL | DM;

Вниз

Программатор 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 вся ветка

Текущий архив: 2005.11.13;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.101 c
3-1128081748
alol
2005-09-30 16:02
2005.11.13
adoconnection не находит нужного провайдера


14-1129701653
Иксик
2005-10-19 10:00
2005.11.13
Есть ли у нас на форуме кто-нибудь из Симферополя?


2-1129801370
webpauk
2005-10-20 13:42
2005.11.13
Рисунок поверх всего


14-1129710010
Nadyafra
2005-10-19 12:20
2005.11.13
Срочно требуется ПРОГРАММИСТ DELPHI/ORACLE (от 1300-2000 у.е.)


11-1110838556
VNavigator
2005-03-15 01:15
2005.11.13
Drag n Drop