在线时间4063 小时
UID3441752
注册时间2017-11-21
NXP金币759412
TA的每日心情 | 开心 3 天前 |
---|
签到天数: 266 天 [LV.8]以坛为家I
管理员
- 积分
- 31909
- 最后登录
- 2024-3-29
|
LPC51/54/55 芯片的USB ISP 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? 为什么?
解答:
根据参考手册,USB0或者USB1都可以支持ISP。那么使用USB0的话需要什么特别的操作么?在ISP引脚为低的时候,LPC55S69 BOOT ROM默认是支持高速的USB ISP。而USB1才是高速的USB,USB0是全速的USB。如果是LPC55的话,只需要引脚PIO0_5拉低就好,默认使用的是USB1端口。
如果需要使用全速的USB端口,需要通过软件配置使能,全速和高速的USB端口使用 ISP的时候都是使用HID协议,blhost 工具都可以自动识别。
如果需要使能 USB0,唯一的办法是设置 CMPA : BOOT_CFG bit9 为1,然后复位芯片,这样USB0的ISP就使能了。
注意:配置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模式。
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。
如果使用 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。
c. 作为全速的USB模式的时候, USB0 和 USB1都可以运行在ROM Bootloader免晶振模式。USB0 也可以支持 DFU 模式。
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的参考代码
- /* IAP command definitions */
- #define IAP_PREWRRITE_CMD 50 /*!< Prepare sector for write operation command */
- #define IAP_WRISECTOR_CMD 51 /*!< Write Sector command */
- #define IAP_ERSSECTOR_CMD 52 /*!< Erase Sector command */
- #define IAP_BLANK_CHECK_SECTOR_CMD 53 /*!< Blank check sector */
- #define IAP_REPID_CMD 54 /*!< Read PartID command */
- #define IAP_READ_BOOT_CODE_CMD 55 /*!< Read Boot code version */
- #define IAP_COMPARE_CMD 56 /*!< Compare two RAM address locations */
- #define IAP_REINVOKE_ISP_CMD 57 /*!< Reinvoke ISP */
- #define IAP_READ_UID_CMD 58 /*!< Read UID */
- status_t Chip_IAP_ReinvokeISP( void )
- {
- uint32_t command[9], result[4];
- uint8_t Param[8];
- uint8_t *p=Param;
- Param[0] = 0;
- Param[1] = 8; //usb 8// 6 usart
- Param[2] = 0;
- Param[3] = 0;
- Param[4] = 0;
- Param[5] = 0;
- Param[6] = 0;
- Param[7] = 8;
- command[0] = IAP_REINVOKE_ISP_CMD; //57
- command[1] = (uint32_t )p;
- iap_entry(command, result);
- return translate_iap_status(result[0]);
- }
复制代码 调用 Chip_IAP_ReinvokeISP后,就可以进入USB ISP模式,和使用ISP1引脚进入ISP 后的功能一样。 当连接 USB口后,可以发现设备 CRP DISABLED,然后打开 CRP DISABLED,删除文件 firmware.bin,将应用程序固件的名字改为 firmware.bin,然后将其拷贝到CPR DISABLED, 按复位就可以看到应用程序代码正常工作了。
7. LPC11xx 如何进入ISP?
在进入 ISP时,如果有中断的话,需要先关闭中断,然后再进入 ISP。
- #include "LPC11xx.h"/* LPC11xx definitions */
- #define IAP_LOCATION 0x1FFF1FF1
- typedef void (*IAP)(unsignedint [], unsignedint[]);
- IAP iap_entry;
- void ISP_Enter(void)
- {
- unsigned long command_IAP[5];
- unsigned long result_IAP[4];
- __disable_irq();
- iap_entry = (IAP) IAP_LOCATION;
- command_IAP[0] = IAP_REINVOKE_ISP_CMD;
- iap_entry(command_IAP, result_IAP);
- }
复制代码
|
|