|
|
  |
w3150 и внешняя память., HELP |
|
|
|
Mar 28 2007, 10:32
|
Частый гость
 
Группа: Новичок
Сообщений: 75
Регистрация: 17-08-06
Из: Минск
Пользователь №: 19 630

|
Приветствую всех! Народ , помогите пожалуйста - может кто имел дело с аппаратным стеком w3150. Проект горит - дальше некуда, а я даже пингануть не могу.... Работает связка NM7010B ( модуль на основе W3150) и LPC2214. Модуль висит на CS2, BCFG2 настроил на минимальное быстродействие, работаю в IAR 4.40. Инициализацию регистров BCFG и PINSEL провожу в mac файле. Возникает ряд вопросов: 1) При соединении устройства с компьютером напрямую используется стандартный патч-корд, или же крос-овер? 2) Насколько я понимаю, работа со стеком проходит как работа с обычной внешней памятью. Для этого мне достаточно инициализировать корректными значениями регистр BCFG ? Или же необходимо выполнить еще какие-то действия, чтобы контроллер увидел стек? 3) Может кто работал с родным wiznetовским драйвером ( у меня версия 1.2 ). Подскажите пожалуйста в файле iinchip_conf.h в участке кода, где определяютя базовый адрес модуля и базовые адреса памяти приема и передачи ставить ставить нулевой адрес и соответственно COMMON_BASE + 0x4000 для TXBUF и соответственно COMMON_BASE + 0x6000 для RXBUF или же там стоит указывать в качестве базового адреса адрес 82000000 - начальный адрес для 2 блока внешней памяти, на адресах которого висит стек ? Т.е :
/** * __DEF_IINCHIP_MAP_xxx__ : define memory map for iinchip */ #define __DEF_IINCHIP_MAP_BASE__ 0x8000 \\ какой адрес необходимо указать? #if (__DEF_IINCHIP_BUS__ == __DEF_IINCHIP_DIRECT_MODE__) #define COMMON_BASE __DEF_IINCHIP_MAP_BASE__ #else #define COMMON_BASE 0x0000 #endif #define __DEF_IINCHIP_MAP_TXBUF__ (COMMON_BASE + 0x4000) /* Internal Tx buffer address of the iinchip */ #define __DEF_IINCHIP_MAP_RXBUF__ (COMMON_BASE + 0x6000) /* Internal Rx buffer address of the iinchip */
Может быть у кого есть простейший вариант прошивки для арма? Хотя - бы чтобы можно было пингануть, убедится, что модуль жив? Или может у кого есть опыт - указать, что я неправильно делаю...Очень прошу помочь.....
|
|
|
|
|
Mar 28 2007, 11:07
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Я использовал wiznet подключенный к LPC2103 шина иммитировалсь софтом в индирект моде Чтобы wiznet заработал и стал отвечать на пинги нужно только записать в него MAC и IP адреса напрямую с компом конечно только кросс кабелем Вот кусок инициализации с wiznet ом очень удобно работать в indirect mode здесь wzRead читает регистр данных wzWrite запсиывает, wzSetAddr устанавливает адрес у меня еще к тому же было 2 wiznetа подсоеденино поэтому еще параметр chip есть просто биты чип селекта Код #ifndef __W3150_H__ #define __W3150_H__
#define WZ_MODE 0x00
#define WZ_GATEWAY 0x01 #define WZ_SUBNET 0x05 #define WZ_MAC 0x09 #define WZ_IP 0x0F
#define WZ_RXMEM_CFG 0x1A #define WZ_TXMEM_CFG 0x1B
//Mode reg ************************** #define WZS_MODE 0x00 #define WZM_CLOSED 0 #define WZM_TCP 1 #define WZM_UDP 2 #define WZM_IPRAW 3 #define WZM_MACRAW 4 #define WZM_PPPoE 5
//Command reg *********************** #define WZS_CMD 0x01 #define WZC_OPEN 0x01 #define WZC_LISTEN 0x02 #define WZC_CONNECT 0x04 #define WZC_DISCON 0x08 #define WZC_CLOSE 0x10 #define WZC_SEND 0x20 #define WZC_SENDMAC 0x21 #define WZC_SENDKEEP 0x22 #define WZC_RECV 0x40
//*********************************** #define WZS_INT 0x02 #define WZS_STA 0x03 #define WZS_SPORT 0x04 #define WZS_MAC 0x06 #define WZS_IP 0x0C #define WZS_DPORT 0x10 #define WZS_TTL 0x16
#define WZS_TXFS 0x20 #define WZS_TXRD 0x22 #define WZS_TXWR 0x24
#define WZS_RXS 0x26 #define WZS_RXRD 0x28
typedef struct { uint8_t DefGateway[4]; uint8_t IpMask[4]; uint8_t Mac[6]; uint8_t Ip[4]; uint8_t MemCfg[2]; } wzFullStaticIpConfig;
#pragma inline=forced uint8_t wzRead(void) { uint_fast8_t r; RDOn(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); __no_operation(); r=AD0_PORT; RDOff(); return r; }
#pragma inline=forced void wzWrite(uint8_t d) { AD0_PORT=d; __no_operation(); WROn(); __no_operation(); __no_operation(); __no_operation(); WROff(); }
#pragma inline=forced void wzSetAddr(unsigned addr,unsigned chip, bool read) { A0_PORT=chip | (1<<A0_PIN); FIO0DIR2=0xFF; wzWrite(addr); A0_PORT=chip | (1<<A1_PIN); wzWrite(addr>>8); A0_PORT=chip | (1<<A1_PIN) | (1<<A0_PIN); if (read) FIO0DIR2=0x00; }
#pragma inline=forced static void wzFullStaticInit(const wzFullStaticIpConfig *Cfg, unsigned chip) { uint8_t *tmp; uint8_t Len;
A0_PORT=chip; FIO0DIR2=0xFF; wzWrite(0x80); wzWrite(0x07); wzSetAddr(WZ_GATEWAY,chip,false); tmp=(uint8_t *)Cfg; Len=18; do { wzWrite(*tmp++); }while(--Len); wzSetAddr(WZ_RXMEM_CFG,chip,false); wzWrite(*tmp++); wzWrite(*tmp++); }
/#endif /*__W3150_H__*/
|
|
|
|
|
Mar 28 2007, 12:25
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Sarez @ Mar 28 2007, 10:18)  Спасибо большое!!!! Сейчас буду пробовать. Обратите внимание (сам на это налетел): У ARM многобайтовые переменные хранятся в формате Little Endian(младший байт по меньшему адресу) а у визнета - Big Endian. Т.е. даже если вы его повесите как внешнюю память, то писать все равно придется побайтно или перед записью перетасовывать байты. Это относится и к 4-байтным указателям и к регистрам IP-адресов и к регистрам портов. Вот моя инициализация для LPC2214 (визнет висит на CS3): Код BCFG3 = (0<<LPC_IDCY) | (0x7<<LPC_WST1) | (0<<LPC_RBLE) | (0x7<<LPC_WST2) | (0<<LPC_WP) | (0<<LPC_BM) | (0<<LPC_MW); // задержки можно уменьшать, не было времени проверить. { uint32_t Tmp = PINSEL2 & (0xF00C160F); PINSEL2 = Tmp | (1UL<<2)| //P1[26..31] = JTAG (0UL<<3)| //P1[16..25] = GPIO (1UL<<4)| // P2.[0..15] = D[0..15], P1.0 = CS0, P1.1 = OE, P3.31 = BLS0, P3.30 = BLS1, // P2[16..29] = GPIO, P2[30, 31] = GPIO/AN, P3[28, 29] = GPIO/AN (0UL<<6)|(0UL<<7)| // P3.29 = GPIO, P3.28 = GPIO (1UL<<8)| // P3.27 = WE (1UL<<11)| // P3.26 = CS1 (0UL<<13)| // P3.23 = GPIO // (1UL<<14)| // P3.25 = CS2 (1UL<<16)| // P3.24 = CS3 (0UL<<20)|(0UL<<21)|(0UL<<22)| // P2[28..31] = GPIO (1UL<<23)|(1UL<<24)| //P3.0 = A0, P3.1 = A1 (6UL<<25); //P3[2..19] = A[2..19] }
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|