zhx 发表于 2024-9-12 14:58:18

又遇到问题: 如果HSPWM 或 TFPU 用到 PLL,USB就不好用 | 已解决

又遇到问题: 如果HSPWM 或 TFPU 用到 PLL,USB就不好用,自认为USB用的是 内部 48MHz
附件是测试工程,USB模拟串口,发送的数据原样返回,实际上没有用串口
    DMAIR = 0x3F; //选择 PLL 时钟


    HSPWMA_CFG = 0x03;            //使能PWMA相关寄存器异步访问功能

USB 就不好用了


出一个时钟配置工具就好了

DebugLab 发表于 2024-9-12 16:06:32


DebugLab 发表于 2024-9-12 16:10:45


USB用内部固定48M时钟
PLL输入频率范围8M~16M

zhx 发表于 2024-9-12 16:25:43

本帖最后由 zhx 于 2024-9-12 16:36 编辑

DebugLab 发表于 2024-9-12 16:10
USB用内部固定48M时钟
PLL输入频率范围8M~16M
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 模拟串口,发送内容原样返回




zhx 发表于 2024-9-12 17:58:27

找到原因了:

usb_init 中

    IRC48MCR = 0x80;   //使能内部 48M 的 USB 专用 IRC
    while (!(IRC48MCR & 0x01));
    IRCBAND |= 0x80;   //选择 IRC48M 作为 USB 时钟源,B1000_0000
    IRCBAND &= ~0x40;
//   // USBCLK = 0x00;   // 这句把PLL倍频给禁止了
    USBCON = 0x90;   //使能USB,上拉1.5K
页: [1]
查看完整版本: 又遇到问题: 如果HSPWM 或 TFPU 用到 PLL,USB就不好用 | 已解决