Обсуждаем цифровые устройства...
Ответить

помогите понять 93с46 на сетевухе.

Пт янв 20, 2006 21:59:02

Есть сетевуха ISA NE2000 на чипе UM9008F, нашёл её описание в DM9008F.pdf где-то в гугле, на этой сетевухе напаян ЕЕПРОМ 94C46.

У самой сетевухи есть команда работы с еепром "на прямую" иначе никак. Есть команда с параметром, биты параметра есть НОГИ самой 93c46, т.е. одной записью в этот регистр я изменяю значения на ногах 93с46.
Теперь лезу в даташит 93c46 и ищу как же с него читать.
нахожу чт-то типа: 110{address[7]}{data[8]}. Ну в даташите вроде описано как и чё.
Тока у меня не получается :) Допустим я правильно понял работу с сетевухой (ну инициализацию она проходит с горем пополам). Помогите с 93с46.
У неё есть Select, Clock, DataIn и DataOut.
Чтобы что-то прочитать я должен:
- Выставить S в 1 на всю протяжённость операции.
- Менять значение C с каждым "шагом".
- Передать туда 110 по O
- передать 7 бит смещения (128 байт) по тому же О
- после передачи 7ого бита адреса прочиать 0 с I не меняя C
- прочитать с I 8 бит как значение по данному смещению опять же меняя C. В каком положении должен быть O?
- опустить S в ноль.
Всё. И так 127 раз с увеличением смещения.
Это верно?

Пт янв 20, 2006 22:24:02

Так. Во-первых, я так понимаю, что Клок должен меняться два раза при каждой операции. То есть: в момент выставления данных С=0, выставили данные, подождпли, делаем С=1. Подождали, делаем С=0, меняем данные.

Потом я не очень понимаю, почему мы читаем вход а подаем на выход?

Пт янв 20, 2006 22:58:36

С млей строны это оут :) В смысле со стороны сетевухи :)

Сб янв 21, 2006 08:27:09

никто не в курсе почему в таблице параметров в даташите есть ещё 2 столбика с адресом и датой?

Не получается блин!

Сб янв 21, 2006 08:45:23

Ничего не выходит. Всё время 0 получаю.
unsigned char cr;
Код:
for (unsigned char c = 0; c < 128; c++) {
   cr= 0x88; //Выставляем SLECKT И прочее
   cr |= _BV(1);
   WriteRTL(CONFIGD,cr);
    cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
   WriteRTL(CONFIGD,cr);

    cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
   WriteRTL(CONFIGD,cr);
   cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
   WriteRTL(CONFIGD,cr);
   

   cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)) & ~_BV(1); //Инвентируем CLOCK и снимаем DATAOUT
   WriteRTL(CONFIGD,cr);
   cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
   WriteRTL(CONFIGD,cr);

   for (int a = 0; a < 7; a++) {
      cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
      //Так сложно для отладки
      if (c & _BV(a)) {
         cr |= _BV(1);
         printf("1");
      } else {
         cr &= ~_BV(1);
         printf("0");
      }
      WriteRTL(CONFIGD,cr);
      cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
      WriteRTL(CONFIGD,cr);
   }
   printf(" ");
   unsigned char s=0x0;
   s |= (ReadRTL(CONFIGD) & 1);
   for (int a = 0; a < 8; a++) {
      cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)) & ~_BV(1) & ~_BV(0); //Инвентируем CLOCK и снимаем DATA_IN
      WriteRTL(CONFIGD,cr);
      cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
      WriteRTL(CONFIGD,cr);
      if (ReadRTL(CONFIGD) & 1) {
         s |= _BV(a+1); 
         printf("1");
      } else {
         printf("0");
      };
   }
   printf (" BYTE: 0x%x\n",s);
   cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)) & ~_BV(3) & ~_BV(1) & ~_BV(0); //Инвентируем CLOCK и снимаем DATA_IN
   WriteRTL(CONFIGD,cr);
   cr = (cr & ~_BV(2)) | ((~ (cr & _BV(2)) ) & _BV(2)); //Инвентируем CLOCK
   WriteRTL(CONFIGD,cr);
//Завершаем операцию
   WriteRTL(CONFIGD,0);
}


на выходе получается что-то вроде :
0011111 00000000 BYTE: 0x0
1011111 00000000 BYTE: 0x0
0111111 00000000 BYTE: 0x0
1111111 00000000 BYTE: 0x0

Хочу заметить, что DATA_IN и DATA_OUT это с моей стороны, со стороны 93c46 они наоборот. Для меня OUT для 93c46 - IN.

Сб янв 21, 2006 09:18:04

"93C46 работает в режиме 16-и битной адресации если ножка 7 (ORG) не подключена к лог. нулю."
Как это понимать. Если она в воздухе весит это как?

Сб янв 21, 2006 10:26:47

Spider писал(а):"93C46 работает в режиме 16-и битной адресации если ножка 7 (ORG) не подключена к лог. нулю."
Как это понимать. Если она в воздухе весит это как?


Подозреваю это надо понимать так: если не лог 0, значит лог 1, значит работаем в 16 бит. адресации. Если висит в воздухе - значит лог 1 на ней нет - значит в 16 бит. адресации не работаем. Но возможно что я не прав.

Сб янв 21, 2006 13:30:55

Не, просто когда нога висит в воздухе, вообще нельзя быть уверенным, какой на ней уровень. Может быть как 1 так и 0. Зависит от расположения звезд, направления ветра и политической обстановки на ближнем Кавказе. :))

Сб янв 21, 2006 15:28:53

Итак. Значит надо её куда-то прислюнить? Если на хемлю это 0, а если на питание 1? Я правильно понял?

Сб янв 21, 2006 15:29:56

Прална мыслите, товарищ :)

Сб янв 21, 2006 16:48:28

Странно. Ну дык на сетевухе оно никуда не прислюнено. Значит работает :)

Сб янв 21, 2006 19:08:23

Господа! Вынул я 93с46 из кроватки на сетевухе и воткнул туда 3 диода (GND->DataOut,Clock,Select) "играясь" с комангдами сесетевухи (CONFIGD) удаётся зажигать и тушить диоды. Всё клёва, т.е. команды до микрухи пои доходят (надо пологать) Теперь немного о 4ой ноге, та что DataIn (со стороны сетевухи), что бы я туда ни писал она всегда 0 (и правильно, ведь от туда тока читать). Теперь мне моя логика подсказывает, что если я замкну на эту ногу +5V (выставлю туда лог. 1) и буду читать значения с регистра CONFIGD, то должен получать 1 в младшем бите. Ну как сказать... НЕ ПОЛУЧАЮ! Получаю только то что последним туда записал :( если записал туда 0, то и читаю 0. Как читать-то?
Ответить