请选择 进入手机版 | 继续访问电脑版
查看: 1574|回复: 1

[分享] LPC51/54/55 芯片的USB ISP

[复制链接]
  • TA的每日心情
    开心
    3 天前
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3297

    主题

    6542

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    31909
    最后登录
    2024-3-29
    发表于 2020-10-13 16:41:26 | 显示全部楼层 |阅读模式
    LPC51/54/55 芯片的USB ISP
    11.png
    NXP的USB集成USB全速,高速以及双高速的PHY接口,广泛应用于各类USB通信,数据传输的应用场景。


    − 高速速率支持 480 Mbps
    − 全速速率支持 12 Mbps
    − 低速支持 1.5 Mbps

    1. 问题描述


    在LPC55s6x/LPC55s2x 的内部ROM bootloader中支持UART, I2C, SPI和USB接口。在ISP模式的时候,PIO0_5引脚必须拉地。USB1可以正常的工作在ISP模式,使用BLHOST可以擦写片上的Flash,但是USB0却不能正常ISP? 为什么?

    解答:
    12.png
    13.png
    根据参考手册,USB0或者USB1都可以支持ISP。那么使用USB0的话需要什么特别的操作么?在ISP引脚为低的时候,LPC55S69 BOOT ROM默认是支持高速的USB ISP。而USB1才是高速的USB,USB0是全速的USB。如果是LPC55的话,只需要引脚PIO0_5拉低就好,默认使用的是USB1端口。
    14.png
    如果需要使用全速的USB端口,需要通过软件配置使能,全速和高速的USB端口使用 ISP的时候都是使用HID协议,blhost 工具都可以自动识别。

    如果需要使能 USB0,唯一的办法是设置 CMPA : BOOT_CFG bit9 为1,然后复位芯片,这样USB0的ISP就使能了。
    15.png
    注意:配置CMPA区域有可能会锁住芯片。如果没有特殊的需求,建议不要改变这个CMPA,只使用USB1就可以了。

    2. 问题描述:如何使用BLHOST来烧写 LPC54xxx芯片?


    解答:


    参考应用文档目录在SDK的中间件软件组件目录middleware\mcu-boot\doc。


    从kex.nxp.com下载 LPC 的 SDK


    编译 flashloader 工程来生成 flashloader.bin,其中工程位于sdk的目录 sdk\boards \lpcxpresso\bootloader_examples\flashloader


    使用 dfu-util.exe 或者MCUXpresso的 IDE来加载 flashloader.bin 到芯片的RAM中


    dfu-util 工具可以从如下链接下载


    http://dfu-util.sourceforge.net/releases/


    配置ISP引脚,然后复位芯片,使得芯片进入USB DFU boot模式。
    16.png
    LPC54S0xx 的USB0 全速的端口连接PC机,执行下面的命令加载 :flashloader.bin,$ dfu-util.exe –D flashloader.bin


    使用 blhost来编程或者擦除 LPC540xxM/LPC54S0xxM flash


    一旦 flashloader 二进制文件加载到LPC54S0xx平台,开始执行的时候,这个时候需要通过LPC54S0xx的USB1(高速) 连接到主机PC,flashloader 将开始接收命令。


    blhost -u 0x1fc9,0x01a2 -- get-property 12
    blhost -u 0x1fc9,0x01a2 -- fill-memory 0x2000d000 4 0xc0000004
    blhost -u 0x1fc9,0x01a2 -- configure-memory 0xa 0x2000d000
    blhost -u 0x1fc9,0x01a2 -- get-property 25 0xa
    blhost -u 0x1fc9,0x01a2 -t 100000 -- flash-erase-region 0x10000000 0x100000
    blhost -u 0x1fc9,0x01a2 -t 100000 -- write-memory 0x10000000 xxx.bin


    注意: xxx.bin 文件是需要加载Flash中的目标文件。


    如果需要LPC546xx的USB DFU的参考例程,可以留言。


    3. 问题描述 LPC5460x USB 0 MSC 启动注意事项,对于引脚和晶振要求。
    问题解答:


    为了使用 USB 0 MSC Boot,引脚 PIO0_22需要连接用来检测 VBUS。
    17.png
    如果使用 LPC546xx空芯片通过 USB MSC device boot加载代码到Flash中,对晶振有什么要求呢?


    a. 如果是USB1 MSC,是高速接口,则需要使用外部的 12Mhz。


    b. 如果是USB0 MSC,是全速接口,可以使用内部的FRO@48MHz,不需要外部的12Mhz,但是建议不要链接多个Hub。关于FRO内部Trim的精度是±1 %,USB全速的容忍误差是±0.25% 或者2,500ppm,因此FRO不能满足USB的这个精度要求,勘误手册有描述,不能通过多个Hub来调整FRO时钟,当使用 USB0 MSC boot时,最好不要连接Hub。
    18.png
    c. 作为全速的USB模式的时候, USB0 和 USB1都可以运行在ROM Bootloader免晶振模式。USB0 也可以支持 DFU 模式。
    19.png
    4. 问题描述:使用 LPC51U68,在USB模式下使用代码唤醒 ISP功能。
    解答:
    可以参考 usb_device_cdc_vcom_lite例程,使用如下代码进入ISP模式。
    USB_DeviceStop(s_cdcVcom.deviceHandle);
    BOARD_BootClockFROHF48M();
    command[0] = 57;
    command[1] = 2;    // 2: USB
    ((IAP_ENTRY_T)FSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION)(command, result);


    注意:对于LPC55xx,USB DFU更新不再存在。取而代之的是HID/blhost系统(实际上是ROM代码架构和API已经修改),没有用于reinvoke的API,由于不知道ROM的第一个函数入口地址,跳转不起作用。但可以执行软件复位,让MCU重新启动进入ROM。


    5. 问题描述:在LPC55使用的时候,访问或者是读取芯片一个空的Flash区域的时候,会产生HardFault。


    解答:


    在使用读Flash里面的数据前,先调用 ROM_API Flash_VerifyErase来避免Hardfault。有一个参考文档链接如下:


    https://www.nxp.com.cn/docs/en/application-note/AN12949.pdf


    因此在执行访问或者读之前,首先判断Flash的区域是否为空,SDK里面提供了 FLASH_VerifyErase 用于空芯片的检查。在读Flash里面的内容时候,不知道里面是否为空,使用FLASH_VerifyErase 来确认,如果内容为空的话,数据是全0xFF,读或者访问会直接导致hardfault,如果Flash不为空的话,就可以正常的访问和读取。


    6. LPC546xx 在用户应用程序中进入 ISP的参考代码
    1. /* IAP command definitions */

    2. #define IAP_PREWRRITE_CMD           50        /*!< Prepare sector for write operation command */

    3. #define IAP_WRISECTOR_CMD           51        /*!< Write Sector command */

    4. #define IAP_ERSSECTOR_CMD           52        /*!< Erase Sector command */

    5. #define IAP_BLANK_CHECK_SECTOR_CMD  53        /*!< Blank check sector */

    6. #define IAP_REPID_CMD               54        /*!< Read PartID command */

    7. #define IAP_READ_BOOT_CODE_CMD      55        /*!< Read Boot code version */

    8. #define IAP_COMPARE_CMD             56        /*!< Compare two RAM address locations */

    9. #define IAP_REINVOKE_ISP_CMD        57        /*!< Reinvoke ISP */

    10. #define IAP_READ_UID_CMD            58        /*!< Read UID */



    11. status_t Chip_IAP_ReinvokeISP( void )
    12. {
    13. uint32_t command[9], result[4];
    14. uint8_t Param[8];
    15. uint8_t *p=Param;
    16. Param[0] = 0;
    17. Param[1] = 8; //usb 8// 6 usart
    18. Param[2] = 0;
    19. Param[3] = 0;
    20. Param[4] = 0;
    21. Param[5] = 0;
    22. Param[6] = 0;
    23. Param[7] = 8;

    24. command[0] = IAP_REINVOKE_ISP_CMD; //57
    25. command[1] = (uint32_t )p;

    26. iap_entry(command, result);
    27. return translate_iap_status(result[0]);
    28. }
    复制代码
    调用 Chip_IAP_ReinvokeISP后,就可以进入USB ISP模式,和使用ISP1引脚进入ISP 后的功能一样。 当连接 USB口后,可以发现设备 CRP DISABLED,然后打开 CRP DISABLED,删除文件 firmware.bin,将应用程序固件的名字改为 firmware.bin,然后将其拷贝到CPR DISABLED, 按复位就可以看到应用程序代码正常工作了。


    7. LPC11xx 如何进入ISP?


    在进入 ISP时,如果有中断的话,需要先关闭中断,然后再进入 ISP。
    1. #include "LPC11xx.h"/* LPC11xx definitions */
    2. #define IAP_LOCATION 0x1FFF1FF1
    3. typedef void (*IAP)(unsignedint [], unsignedint[]);
    4. IAP iap_entry;
    5. void ISP_Enter(void)
    6. {
    7.     unsigned long command_IAP[5];
    8.     unsigned long result_IAP[4];
    9.      __disable_irq();
    10.     iap_entry = (IAP) IAP_LOCATION;
    11.     command_IAP[0] = IAP_REINVOKE_ISP_CMD;
    12.     iap_entry(command_IAP, result_IAP);
    13. }
    复制代码




    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    21 分钟前
  • 签到天数: 1468 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    92151
    最后登录
    2024-3-29
    发表于 2020-10-13 22:15:31 | 显示全部楼层
    这个方式支持LPC54Sxx系列的芯片嘛?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 21:46 , Processed in 0.123340 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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