![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программатор SEEPROM для серии 93Сxx [D7]
Proger121 © (2005-08-21 16:17:00)Всем привет.
Ктонибудь сталкивался с программированием этих микросхем через лпт?
Может компонент есть какой или ктото уже чтонибудь в этом плане делал?
Подскажите плз..
Proger121 (2005-09-07 15:57:00) [1]Все работает.
Уже доделал программу до конца.
Проблема была в дохлой микросхеме.:)
Теперь все типы 46,56,66 читает, пишет, стирает.
Все гуд.
Спасибо всем кто ответил.
Особенное спасибо Defunct'у!!!
Defunct (2005-09-04 18:41:00) [2]> Proger121
> Все остальное если посылать через эту процедуру эфекта не дает.
так не бывает.
У тебя что-то с задержками не то.
Приведи код SendDataToPort()
Proger121 (2005-09-03 20:01:00) [3]Помогите.
Так и не получается записать :(
Proger121 (2005-08-27 12:26:00) [4]Почемуто с чтением все окей.
Делаю вот так
запрос на чтение адреса 0
SendDataToport('110000000');
showmessage(GetDataPort);
все работает как часы.
Все остальное если посылать через эту процедуру эфекта не дает.
хотя я и стирал предварительно и CS переключал как в спецификации указано.
Пытался даже после команды EWEN записывать.
эфект 0
:(((((((((((((((((
Proger121 (2005-08-26 22:05:00) [5]Все ! я здаюсь.
Записать так и не получается :(
как раньше делал немогу вспомнить.
Может гдето в другом глюк образовался :(
Proger121 (2005-08-26 15:28:00) [6]Странна но DO сразу после записи 1 выдает.
и так ниче не получилось.
Proger121 (2005-08-26 08:15:00) [7]Окей. Буду пробовать.
Defunct (2005-08-26 03:04:00) [8]> DO перещелкнуть (0->1)
Всмысле, дождаться пока перещелкнет.
Defunct (2005-08-26 03:01:00) [9]Proger121 (26.08.05 0:01) [22]
> Наверно нада еще CLK не останавливать сразу после стирания
CS надо передернуть (1/0/1) после подачи адреса, и DO перещелкнуть (0->1), смотри в datasheet'е там же ж все как на ладони. Фантазировать не нужно ;>
Proger121 (2005-08-26 00:01:00) [10]Чето и так не получилось.
Наверно нада еще CLK не останавливать сразу после стирания
а сначала делать в 0 а потом в еденицу.
Proger121 (2005-08-25 23:48:00) [11]АААА!!!!!
Вот в чем дело!!!!
Стирать нада сначало.
Defunct - тебе куда пиво отправлять ???
Defunct (2005-08-25 21:51:00) [12]proger121 (25.08.05 16:55) [19]
А стирать кто за тебя будет?
Если в ячейке данные уже записаны (т.е. не FFFF) то их надо предварительно стереть. С другой стороны записывать (FFFF не имеет смысла, т.к. при стирании имеем FFFF).
по командам все верно.
запись 101
чтение 110
стирание 111
proger121 (2005-08-25 16:55:00) [13]Чето я намутил не то.
Читать получается без проблем.
уже утилку написал которая дампы делает - все ок.
Но чето записать не получается. хотя раньше получалось.
посылаю 101-команда
000001-адрес
1111111111111111-данные.
тоесть посылаю подряд 1010000011111111111111111
пои иде FFFF должно прописаться, но ниче вообще не меняется.
А и еще самое интересное.
Чтобы читать данные написал функцию которая посылает данные
SendLpt('.....') потом жду ответ
все приходит как положено тоесть сама функция рабочая.
Через нее шлю команду на запись
SendLpt('1010000011111111111111111') и не записывается.
может команда другая?
и ниче не происходит.
Defunct (2005-08-24 00:39:00) [14]> перед чтением данных записываешь
при чтении записываешь очередной принятый бит так:
fConverter.WHex( (fConverter.RHex shl 1) or <Принятый Бит>);
if fConverter.Carry > 0 then <Сохранить fConverter.RHex>
Defunct (2005-08-24 00:31:00) [15]Proger121 (23.08.05 21:59) [16]
Берешь приведенную обертку, делаешь
fConverter.Init(8)
перед чтением данных записываешь в него 1 - WHex(1),
при Carry - считываешь принятый байт, и опять записываешь 1. Carry сбрасывается автоматом.
это позволит работать и в 8-ми и в 16-ти разрядном режимах практически одинаково.
> Посылаем команду на чтение 1100(помоему), адрес ячейки 00000010, и ждем ответа от микросхемы?
Все подряд идет, послал команду чтения, закинул адрес и читаешь данные пока CS не снят.
Proger121 (2005-08-23 21:59:00) [16]еще и со второго байта начинает передавать а потом первый.
Ну такое в доке гдето видел нада потом байты свапить !
Proger121 (2005-08-23 21:57:00) [17]Ну вот и с этим уже разобрался!
теперь все в кучку надо собрать :)
читать и писать мы теперь умеем :)
proger121 (2005-08-23 20:56:00) [18]Опять в тупик уперся :(
не понятно как данные читаются
что значит 16 битный и 8 битный режим
это значит по 8 бит или по 16 данные считываются за раз?
Если в памяти записано допустим
66 77 88 FF и т.д.
то как считать допустим данные по адресу h02 (88)
что нужно послать по DI ?
Посылаем команду на чтение 1100(помоему), адрес ячейки 00000010, и ждем ответа от микросхемы?
так не так ?
Proger121 (2005-08-23 09:46:00) [19]ОООО!
Вот спасибо тебе.
Буду дальше разбираться
Defunct (2005-08-23 00:26:00) [20]> А на счет разная шина
не шина а ширина! ;>
> И адреса данных имеется ввиду размер?
да.
кол-во слов и кол-во бит в слове.
> 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.