|
|
  |
Совместное использование ATMega128L и CS8900A-CQ3, При совместном включении CS8900A-CQ3 с ATMega128L микроконтроллер ATMe |
|
|
|
Sep 23 2007, 18:10
|
Участник

Группа: Участник
Сообщений: 39
Регистрация: 22-09-07
Пользователь №: 30 755

|
Цитата(jt777 @ Sep 19 2007, 13:34)  Мега работает на 4 МГц. Напряжение питание довел до уровня 3,25 В, Но мега все равно отключается как только подключаю CS8900A-H.  Проверьте все супервизоры если есть таковые, может один пичек проходит в момент старта и все ресетиться. И почему так падает напряжение??? Толщина проводника или слабость блока питания?
|
|
|
|
|
Jan 5 2008, 14:50
|

Участник

Группа: Участник
Сообщений: 19
Регистрация: 18-09-07
Из: Украина
Пользователь №: 30 612

|
Подключил CS8900A к ATMega128, написал функции чтения/записи для работы с CS8900A, все работает нормально, удалось передать кадр в сеть и удачно получить на своем компьютере. Начал писать функции для того что бы прочитать принятый кадр из CS8900A, тут та и начались проблемы. Начинаю пинговать свое устройство, читаю регистр статуса RxEvent, устанавливается флаг RxOK и флаг Broadcast, сигнализирующий что принят широковещательный запрос. Читаю RxStatus Word, тоже нормально считывается (читаю с порта 0), а дальше, когда начинаю считывать с того же порта 0 длину принятого кадра считывается 0. Читаю как положено сначала старший байт потом младший. Пробовал обращаться непосредственно к регистру RxLength, через указатель регистра тоже самое. Может кто с подобной проблемой сталкивался подскажите пожалуйста. Ниже привожу функцию которой пытаюсь прочитать данные из порта 0:
#define dir_data DDRD //направление шины данных #define read_data PIND //Для чтения данных с шины данных #define IOR (0b00010000) #define IOW (0b00100000)
unsigned int ReadHB1ST8900(unsigned char Address) { unsigned int ReturnValue; ReturnValue=0; data = 0; dir_data = 0x00; // настройка порта данный на ввод addr = IOR | IOW | (Address + 1); // установка адреса. Старший байт addr &= ~IOR; // строб чтения delay_us(100); ReturnValue = read_data;// читаю данные с шины данных delay_us(10); addr = IOR | IOW | Address; // установка адреса. Младший байт ReturnValue =ReturnValue<<8; // сдвиг влево addr &= ~IOR; // строб чтения delay_us(100); ReturnValue |= read_data; // читаю данные с шины данных. Получение младшего байта delay_us(10); addr |= IOR; // Завершаю процедуру чтения dir_data = 0xff; // настройка порта данный на вывод
return ReturnValue; }
|
|
|
|
|
Jan 5 2008, 17:05
|
Участник

Группа: Validating
Сообщений: 56
Регистрация: 15-10-06
Пользователь №: 21 335

|
А в сторону avrlib'а посмотреть ? он правда CS8900 поддерживает - но может поможет ? Procyon AVRlib
Сообщение отредактировал Maddy - Jan 5 2008, 17:06
|
|
|
|
|
Jan 6 2008, 21:56
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата Начинаю пинговать свое устройство, читаю регистр статуса RxEvent, Тогда 0 в RxLength - ожидаемый результат, т.к. после чтения этого регистра emac выбрасывает текущий фрейм. Reading the RxEvent register signals to the CS8900A that the host is finished with the current frame, and wants to start processing the next frame.Поэтому читать надо RxStatus - потом RxLength и только после того как фрейм вычитан и обработан - прочитать RxEvent чтобы мак перешел к следующему фрейму. PS: В вашей функции задержки в 10-100us не нужны, ну максимум вставить 1 NOP или продублировать обращение к порту. Мега дрыгает ногами медленнее сигналов ISA шины, так что задержки - лишние. Ну и подключить CS89 к внешней шине не судьба была? Чтение регистров было бы много проще: Код #define nic_ReadReg( addr )\ (*(V8 *)(NIC_BASE + (addr))) #define nic_WriteReg(addr, val)\ (*(V8 *)(NIC_BASE + (addr)) = (val))
|
|
|
|
|
Jan 8 2008, 07:35
|

Участник

Группа: Участник
Сообщений: 19
Регистрация: 18-09-07
Из: Украина
Пользователь №: 30 612

|
спасибо за предложение Уважаемый defunct, я попробовал то, что Вы говорите, но вот тут снова проблема, если я сначала читаю RxEvent и потом RxStatus, то в RxStatus как и положено точное значение RxEvent, затем я EEPROM меги читаю принитый фрейм, причем тоже читается и считавается он через 2 байта. т.е. читается 2 байта как положено принятого фрейма потом пропуск 2 принятых байт снова 2 байта и т.д. И, что еще интересно читаю я не как написано с Resive/Transmit Data (Port 0) потом с Port 1 и снова Port0 и т.д., а читается с начала с адреса 0002h (Port1), потом 0001h (Port0), снова 0001h и 0000h. По другому если читаю 0001h потом 0000h, 0001h и т.д. считывает 0. Я запутался окончательно. Скорее всего я, что то упустил, может ошибка в алгоритме? Алгоритм следующий: 1. Инициализация CS8900 1.1 Сброс CS8900; 1.2 Установка MAC адреса CS8900; 2. Настройка приемника 2.1 В RxCTL устанавливаю биты Promiscuous, Broadcast, CRCerrorA, вобшем устанавливаю все биты что бы любой кадр был принят; 3. Разрешаю баботу приемника.
|
|
|
|
|
Jan 10 2008, 20:36
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(jt777 @ Jan 8 2008, 10:35)  затем я EEPROM меги читаю принятый фрейм, причем тоже читается и считавается он через 2 байта. т.е. читается 2 байта как положено принятого фрейма потом пропуск 2 принятых байт снова 2 байта и т.д. Странно, такое впечатление что у Вас что-то с адресами напутано или в железе или в программе. Если работаете в режиме IO-Space, то порты у вас 16-ти разрядные. Было бы неплохо принимать не в eeprom, а в ОП меги, чтобы исключить побочный эффект медленной записи eeprom (если я правильно понял ваш пост). Цитата И, что еще интересно читаю я не как написано с Resive/Transmit Data (Port 0) потом с Port 1 и снова Port0 и т.д., а читается с начала с адреса 0002h (Port1), потом 0001h (Port0), снова 0001h и 0000h. По другому если читаю 0001h потом 0000h, 0001h и т.д. считывает 0. ?? В ДШ написано что, весь фрейм читать из порта 0 (0x0000).. В "MemoryMode" фрейм лежит начиная с адреса 0x404 Цитата 1. Инициализация CS8900 .... Раз RxStatus показывает наличие фрейма, то с инициализацией надо полагать все Ок.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|