Делаю так:
Код
uint16_t tmp;
uint32_t id;
GICR_INT0 = 0;
MCUCR |= (1 << ISC01) | (1 << ISC00);
// Сброс микросхемы
PORTD_Bit4 = 0;
__delay_cycles((unsigned long) (FREQUENCY * 1.1E-2));
PORTD_Bit4 = 1;
isp_write_register_32(ISP_REG_CHIP_ID, &id);
__delay_cycles((unsigned long) (FREQUENCY * 1.1E-2));
// Инициализация интерфейса
tmp = ISP_HMC_EDGE_TRIGGERED_INTERRUPT_MASK |
ISP_HMC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_HMC_ACTIVE_HIGH_DREQ_MASK |
ISP_HMC_ACTIVE_HIGH_DACK_MASK | ISP_HMC_COMMON_DMA_MASK |
ISP_HMC_COMMON_INT_MASK | ISP_HMC_DEVICE_DMA_MASK;
isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp);
tmp |= ISP_HMC_INTERFACE_LOCK_MASK;
isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp);
isp_write_register_16(ISP_REG_UNLOCK_DEVICE, ISP_UNLOCK_DEVICE_CODE);
isp_write_register_16(ISP_REG_MODE, ISP_MODE_SOFT_RESET_MASK);
isp_write_register_16(ISP_REG_MODE, 0);
// Основная инициализация
isp_write_register_16(ISP_REG_OTG_CONTROL_CLEAR, 0xFFFF);
isp_write_register_16(ISP_REG_OTG_CONTROL_SET, ISP_OTGC_HC2_DISABLE_MASK |
ISP_OTGC_DP_PULLUP_MASK | ISP_OTGC_SOFT_SELECT_HC_DC_MASK);
isp_write_register_16(ISP_REG_INTERRUPT_CONFIGURATION,
ISP_INTC_ACTIVE_HIGH_INTERRUPT_MASK | ISP_INTC_PULSED_INTERRUPT_MASK |
(1 << ISP_INTC_DATA_DEBUG_MODE_OUT_POS) |
(1 << ISP_INTC_DATA_DEBUG_MODE_IN_POS) |
(1 << ISP_INTC_CONTROL_0_DEBUG_MODE_POS));
isp_write_register_16(ISP_REG_INTERRUPT_PULSE_WIDTH, 0x0F);
isp_write_register_32(ISP_REG_INTERRUPT_ENABLE, ISP_INTE_BUS_RESET_MASK |
ISP_INTE_HIGH_SPEED_MASK | ISP_INTE_VBUS_MASK);
isp_write_register_16(ISP_REG_ADDRESS, ISP_ADDR_DEVICE_ENABLE_MASK);
// Включение прерывания
GICR_INT0 = 1;
isp_write_register_16(ISP_REG_MODE, ISP_MODE_CLOCK_ALWAYS_ON_MASK |
ISP_MODE_GLOBAL_INTERRUPT_ENABLE_MASK | ISP_MODE_CLOCK_ALWAYS_ON_MASK);
isp_read_register_16(ISP_REG_HW_MODE_CONTROL, &tmp);
tmp |= ISP_HMC_GLOBAL_INTERRUPT_ENABLE_MASK;
isp_write_register_16(ISP_REG_HW_MODE_CONTROL, tmp);
Но бит VBUSSTAT в регистре MODE не работает. То есть, что есть на пине VBUS напряжение, что нет - ничего не меняется. Ставил бит OTG_DISABLE как сказано в даташите, но VBUS по прежнему не детектируется. Плюс ко всему энумерация не начинается, если OTG_DISABLE установлен.
Знающие люди, подскажите пожалуйста правильную последовательность инициализации периферийного контроллера.