- 打卡等级:初来乍到
- 打卡总天数:6
- 最近打卡:2025-04-17 09:50:59
高级会员
- 积分
- 755
|
发表于 2024-9-12 16:25:43
|
显示全部楼层
本帖最后由 zhx 于 2024-9-12 16:36 编辑
void usb_init()
{
P3M0 &= ~0x03; //P3.0/P3.1 和 USB 的 D-/D+共用 PIN 脚,
P3M1 |= 0x03; //需要将 P3.0/P3.1 设置为高阻输入模式
IRC48MCR = 0x80; //使能内部 48M 的 USB 专用 IRC
while (!(IRC48MCR & 0x01));
IRCBAND |= 0x80; //选择 IRC48M 作为 USB 时钟源,B1000_0000
IRCBAND &= ~0x40;
USBCLK = 0x00; //
USBCON = 0x90; //使能USB,上拉1.5K
usb_write_reg(FADDR, 0x00);
usb_write_reg(POWER, 0x08);
usb_write_reg(INTRIN1E, 0x3f);
usb_write_reg(INTROUT1E, 0x3f);
usb_write_reg(INTRUSBE, 0x07);
usb_write_reg(POWER, 0x00);
DeviceState = DEVSTATE_DEFAULT;
Ep0State.bState = EPSTATE_IDLE;
InEpState = 0x00;
OutEpState = 0x00;
UsbInBusy = 0;
UsbOutBusy = 0;
RxRptr = 0;
RxWptr = 0;
TxRptr = 0;
TxWptr = 0;
EUSB = 1; //使能 USB 中断
}
USB 初始化,用的是 内部 48M
void PllConfig(void)
{
//选择PLL输出时钟
// CLKSEL &= ~CKMS; //选择PLL的96M作为PLL的输出时钟
CLKSEL |= CKMS; //选择PLL的144M作为PLL的输出时钟
USBCLK &= ~PCKI_MSK;
USBCLK |= PCKI_D4; //PLL输入时钟4分频
USBCLK |= ENCKM; //使能PLL倍频
delay(); //等待PLL锁频
//选择HSPWM/HSSPI时钟
// CLKSEL &= ~HSIOCK; //HSPWM/HSSPI选择主时钟为时钟源
CLKSEL |= HSIOCK; //HSPWM/HSSPI选择PLL输出时钟为时钟源
HSCLKDIV = 0; //HSPWM/HSSPI时钟源不分频
}
//====================================
PLL 用内部时钟 40M,4分频 10M, *12 ,PLL输出120M
USB 没有用PLL
PLL 准备 给 HSPWM 和TFPC 用
现在是
HSPWMA_CFG = 0x03; //使能PWMA相关寄存器异步访问功能
或
DMAIR = 0x3F; //选择 PLL 时钟(和 CPU 时钟异步)作为 TFPU 时钟源
PLL 分配给 PWM 或 TFPU USB 就不正常
注释这两句,USB 就正常
USB 模拟串口,发送内容原样返回
|
|