Имхо, изменить нужно
1. Инициализацию PLL. Код для 23
SCS = SCS_FASTGPIO | SCS_OSCRANGE0 | SCS_OSCEN; // 1 to 20 MHz oscillator
while( !SCS_bit.OSCSTAT )
;
PLLCON = PLL_DISABLE;
PLLFEED = 0xAA; PLLFEED = 0x55;
CLKSRCSEL = CLKSRC_MAIN_OSC; // PLL clock source
PLLCFG = (12-1); // 12MHz->288MHz
PLLFEED = 0xAA; PLLFEED = 0x55;
PLLCON = PLL_ENABLE;
PLLFEED = 0xAA; PLLFEED = 0x55;
while( !PLLSTAT_bit.PLOCK )
;
CCLKCFG = 6-1; // 1/6 Fpll
USBCLKCFG = 6-1; // 1/6 Fpll - 48 MHz
PLLCON = PLL_ENABLE | PLL_CONNECT;
PLLFEED = 0xAA; PLLFEED = 0x55;
PCLKSEL0 = 0;
PCLKSEL1 = 0;
// USBCLKCTRL should be written after PCONP.USB
// but before any other USB register access
USBCLKCTRL = USBCCR_DEV_CLK_EN | USBCCR_AHB_CLK_EN;
while ( (USBCLKST & (USBCCR_DEV_CLK_EN | USBCCR_AHB_CLK_EN)) != (USBCCR_DEV_CLK_EN | USBCCR_AHB_CLK_EN) )
;
<\pre>
2. У 21 и 23 разный VIC. Код для 23
VICINTSELECT = 0; // Assign all interrupt channels to IRQ
VICINTENCLEAR = ~0; // Disable all interrupts
VICSOFTINTCLEAR = ~0; // Clear all software interrupts
VICPROTECTION = 0; // VIC registers can be accessed in User or privileged mode
VICADDRESS = 0; // Clear interrupt
for ( int j = 0; j < 32; j++ )
{
(&VICVECTADDR0)[j] = 0;
(&VICVECTPRIORITY0)[j] = VIC_LOW_PRIORITY;
}
// now enable needed IRQs
(&VICVECTADDR0)[VIC_USB] = (unsigned long)USB_ISR;
(&VICVECTPRIORITY0)[VIC_USB] = VIC_HIGH_PRIORITY;
// ... add other vectors here
VICINTENABLE = (1<<USB) | ... other interrupts;
<\pre>
3. И последнее. Сам USB Device у 21 и 23 одинаковый, но ИАР назвал одни и те же регистры разными именами.
Муторно, но догадаться несложно. Например
21 DEVINTCLR
23 USBDEVINTCLR
У Кейла, по-моему, такой проблемы нет.