Всем привет, подниму тему. У меня также аналогичная проблема: не работает код, созданный в IAR для чипа CY7C68013A.
Суть в том, что я пилю (по приколу)
USB HID Game Pads эмулятор для 10-ти кнопочных джойстиков для NES (от старых добрых 8-битных дендей).
Там уже все работает при использовании компиляторов KEIL C51 и SDCC (хотя, с SDCC тоже какие-то непонятки возникают, но это другая история).
Но вот, с IAR какая то засада: ось не может проенумеровать USB дескрипторы устройства. Например, при попытке получить «Device Descriptor», ось получает какую то хрень у которой все поля заполнены нулями (вместо содержимого этого дескриптора). Я уже понавырывал на себе все волосы, но так и не понял что за фигня.
Я в коде не использую таблицу автовекторов (и все эти джампы), а делаю поллинг влагов регистров USB в main цикле.
К примеру, этот код:
static BOOL ep0_std_descriptor_proc(void)
{
BYTE XDATA *pdesc =
(BYTE XDATA *)hid_ep0_std_desc_get();
if (pdesc) {
SUDPTRH = usb_word_msb_get(pdesc);
SUDPTRL = usb_word_lsb_get(pdesc);
return TRUE;
}
return FALSE;
}
выполняется, но, кажется, что не работают фичи с SUDPTRH и SUDPTRL.
@sladkoejka, я еще не пробовал Ваш фикс с асм-ов с размещением таблицы векторов по нулевому адресу.
Может есть другое решение? Например, что-то поправить в файле скрипта линковщика: lnk51ew_CY7C68013A.xcl ?
Я как бы не очень спец по ассемблерам и 8051 (уже 15 лет назад проходил и забыл), но в том файле
декларирована куча всяких переменных, возможно имеет смысл их переопределить? Или что-то еще?