找回密码
 立即注册
查看: 346|回复: 4

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

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

积分
755
发表于 2024-9-12 14:58:18 | 显示全部楼层 |阅读模式
又遇到问题: 如果HSPWM 或 TFPU 用到 PLL,USB就不好用,自认为USB用的是 内部 48MHz
附件是测试工程,USB模拟串口,发送的数据原样返回,实际上没有用串口
    DMAIR = 0x3F; //选择 PLL 时钟


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

USB 就不好用了
E1.rar (45.67 KB, 下载次数: 51)

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4851

回帖

8390

积分

超级版主

DebugLab

积分
8390
发表于 2024-9-12 16:06:32 | 显示全部楼层
截图202409121606158459.jpg
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4851

回帖

8390

积分

超级版主

DebugLab

积分
8390
发表于 2024-9-12 16:10:45 | 显示全部楼层

USB用内部固定48M时钟
PLL输入频率范围8M~16M
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

积分
755
发表于 2024-9-12 16:25:43 | 显示全部楼层
本帖最后由 zhx 于 2024-9-12 16:36 编辑
Debu*** 发表于 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 模拟串口,发送内容原样返回




回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

积分
755
发表于 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
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-4 04:06 , Processed in 0.187266 second(s), 77 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表