Совместное использование ATMega128L и CS8900A-CQ3
Подключил 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;
}
если я сначала читаю 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. Я запутался окончательно.
Начал смотреть аппартную часть, и возникло сомнение куда подключать пин SBHE, в одних схемах он подключен к питанию в дргих посажен на землю. В моем случае он подключен к питанию. Подскажите кто знает наверняка куда его сажать?
Помогите как прочитать принятый фрэйм?!!!!!!
|