Подключил 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; }
|