Ethernet-контроллер W5300. Регистры

Кратко пробежимся по некоторым наиболее необходимым регистрам нашего W5300. Этот материл может показаться скучноватым, но зато он дает общую картину регистров. Можно перейти к следующей статье и возвращаться за пояснениями. У W5300 регистры делятся на две основные группы: регистры основного назначения и регистры сокетов. Еще есть регистр режима и два регистра косвенного обращения к памяти.

MR (Mode Regiser) — регистр режима. С его помощью можно осуществить сброс контроллера, включить режим теста памяти, режим PPPoE, поменять местами старший и младший биты как на шине данных, так и в самих регистрах, задать прямой или косвенный режим адресации, задать ширину шины данных 8 или 16 бит.
IMR (Indirect Mode Registers) — регистры косвенного обращения к памяти. Их два — IDM_AR (регистр адреса) и IDM_DR (регистр данных). На них не будем останавливаться, так как они скорее для исключительного случая. Хотя… если на начальном этапе поиграться, паять на макетке и не ждать больших скоростей, то этот вариант «то, что доктор прописал».

Регистры основного назначения

Регистры общего назначения в основном содержат локальные адреса, IP адреса, размеры областей буфера приемника и передатчика.
IR (Interrupt Register) — регистр прерываний. Говорит нам о типе прерывания: IP-конфликт, передача ICMP-пакета, прерывания от сокетов и др.
IMR (Interrupt Mask Register) – регистр маски прерываний.
Система здесь хитрая. Сигнал прерывания INT генерируется только в том случае, если:
а) произошло какое-то прерывание и следовательно k-тый бит IR установился в «1»;
б) мы в нашей программе прописали «1» в тот же k-тый бит в IMR.
Т. е. вы как бы разрешаете те или иные прерывания.
SHAR (Source Hardware Address Register) – конфигурирует МАС-адрес нашего устройства.
GAR (Geteway IP-address Register) – конфигурирует IP-адрес основного шлюза.
SUBR (Subnet Mask Register) – конфигурирует маску подсети.
SIPR (Source IP Address Register) – конфигурирует IP-адрес нашего устройства.
RTR (Retransmission Timeout-period Register) – конфигурирует время перерыва между повторными передачами (тайм-аут). Единица измерения этого времени 100 мкс=0,1 мс. Т. е., например, мы хотим установить тайм-аут 400 мс, RTR=400мс/0,1мс=4000 (0x0FA0).
RCR (Retransmission Retry-Count Register) – конфигурирует количество перепосылок. Когда количество перепосылок становится больше чем (RCR+1), устанавливается бит прерывания по тайм-ауту (регистр Sn_IR бит TIMEOUT). При TCP-соединении, кроме установки прерывания по тайм-ауту, регистр Sn_SSR меняет свое состояние на «SOCK_CLOSED». Ну со всеми этими регистрами мы еще познакомимся дальше.
TMSR (TX Memory Size Register) – определяет внутреннюю память передатчика для каждого сокета. Память для сокета может быть объемом от 0 до 64 кБ. Общая память приемника и передатчика равна 128 кБайтам.
RMSR (RX Memory Size Register) – определяет внутреннюю память приемника для сокетов. Память приемника для одного сокета может быть также от 0 до 64 кБ.
MTYPER (Memory Type Register). Память разделена на 16 разделов: 8 разделов памяти приемника и 8 разделов памяти передатчика. Биты MTYPER определяют какого типа будет соответствующий раздел памяти: если 1, то память передатчика, если 0 – память приемника.
Из регистров основного назначения, эти регистры наиболее значимые, есть еще несколько регистров, но их мы пока трогать не будем.
Есть еще один регистр, о котором пожалуй стоит знать
IDR (Identification Register) – он показывает ID контроллера.
Пока может не очень понятно, но на примере в следующей статье будет понятно.

Регистры сокетов

Регистры сокетов отвечают за выбор протокола, прерывания, различные настройки конкретного сокета.
Sn_MR (SOCKETn Mode Register) – конфигурирует тип протокола (TCP, IP, MACRAW, IPRAW), а также некоторые опции сокета n (выравнивание, мультикастинг, MAC-фильтр).
Sn_СR (SOCKETn Command Register) – устанавливает для сокета n такие команды, как OPEN (открыть), CLOSE (закрыть), SEND (отправить), RECV (принять), CONNECT (соединить), LISTEN (слушать) и др.
Sn_IR (SOCKETn Interrupt Register) – говорит о типе прерывания сокета n.
Sn_IMR (SOCKETn Interrupt Mask Register) – конфигурирует прерывания сокета n. Но здесь опять таки не все так просто! Если происходит прерывание:
1) k-тый бит регистра Sn_IR устанавливается в «1»;
2) далее если мы установили k-тый бит регистра Sn_IMR в «1», то бит прерывания от сокета n в регистре IR тоже установится в «1»;
3) теперь если мы и в IMR установили «1», прерывание наконец будет сгенерировано.
Sn_SSR (SOCKETn Status Register) – уведомляет о статусе (состоянии) сокета n. Статус сокета может меняться командами Sn_CR передачей/получением пакета. Статусы могут быть следующими: сокет закрыт, сокет отрыт в режиме UDP, сокет отрыт в режиме MACRAW и т.д.
Sn_PORTR (SOCKETn Source Port Register) – устанавливает номер порта для сокета n. Этот регистр действует только в TCP и UDP режимах.
Sn_DHAR (SOCKETn Destination Hardware Address Register) – устанавливает или в него устанавливается MAC-адрес пункта назначения для сокета n.
Sn_DPORTR (SOCKETn Destination Port Register) – регистр, устанавливающий номер порта получателя для сокета n. Действует только в TCP, UDP и PPPоE режимах.
Sn_DIPR (SOCKETn Destination IP Address Register) – этот регистр устанавливает или в него устанавливается IP-адрес получателя для сокета n.
Sn_MSSR (SOCKETn Maximum Segment Size Register) – устанавливает MTU для сокета n или сообщает об MTU, который уже устнаовлен. Только для TCP/UDP
Sn_PROTOR (SOCKETn Protocol Number Register) – устанавливает номер протокола, применяется только в IPRAW режиме.
Sn_TX_WRSR (SOCKETn TX Write Size Register) – сюда мы пишем размер данных, записываемых во внутреннюю память передатчика.
Sn_TX_FSR (SOCKETn TX Free Size Register) – сообщает о свободной памяти передатчика.
Sn_RX_RSR (SOCKETn RX Received Size Register) – сообщает о размере принимаемых данных.
Sn_TX_FIFOR (SOCKETn TX FIFO Register) – регистр, осуществляющий косвенный доступ к памяти передачтика. Доступ к памяти передатчика не может быть осуществлен напрямую, только через регистр Sn_TX_FIFOR.
Если хост (управляющий конроллер) имеет 8-битную шину данных, то доступна пара регистров Sn_TX_FIFOR0 и Sn_TX_FIFOR1. Когда в память передатчика записывается 1 байт, хост пишет 1 байт в Sn_TX_FIFOR0, а в Sn_TX_FIFOR1 – подставляется «пустышка».
Во время записи данные копируются в память передатчика последовательно. Данные из памяти передатчика передаются начиная с младшего с помощью команд SEND или SEND_MAC.

Sn_RX_FIFOR (SOCKETn RX FIFO Register) – осуществляет косвенный доступ к внутренней памяти приемника. Доступ к памяти приемника так же не может быть осуществлен напрямую, лишь через Sn_RX_FIFOR.
Если хост имеет 8-битную шину данных, то доступна пара регистров Sn_RX_FIFOR0 и Sn_RX_FIFOR1.

В соответствии с Sn_MR, информация пакета (Packet Info) добавляется перед данными, принимаемыми из памяти приемника.

Список литературы:
1. High-Performance Internet Connectivity Solution W5300. Version 1.2.5. 2008