查看: 7521|回复: 9

[求助] IMXRT1052-USB VCP 在 OCRAM 中无法识别

[复制链接]

该用户从未签到

1

主题

7

帖子

0

新手上路

Rank: 1

积分
28
最后登录
2019-9-9
发表于 2019-8-30 11:29:15 | 显示全部楼层 |阅读模式
问题:
在官方的SDK DEMO中 ,分散加载文件里的DATA段都是放在DTCM里,VCP的DEMO是正常可以运行的;
我把m_data_start 地址修改到OCRAM里去,即0x2020_0000里,发现VCP就不能被PC识别到驱动了,经过调试发现,在pc获取设备描述符的时候,1052获取到PC的数据描述符setup请求 usb ehci qh setupBuffer 中的数据变成0x00000000 0x00000000了,而正常放在dtcm里的时候,数据是正常的 0x01000680 0x00400000。很是奇怪啊!!!
疑问:
1、我直接下载正点原子的VCP代码也是可以用的!他的数据区也是放在OCRAM里!!!,不知道他在其他地方有什么改动没有?
2、感觉和DMA有什么关系一样!猜测如果USB EHCI 的数据是直接通过DMA方式放到 QH里,那么DMA应该是在OCRAM里正常跑而不是DTCM里正常跑啊!现在结果却相反了!
3、在调试串口DMA也发现了类似的问题!!!按道理说DMA的noncache 区域应该放在OCRAM里,IMXRT芯片手册说了,只有OCRAM区域才能被正常被外设访问!!!
回复

使用道具 举报

  • TA的每日心情
    奋斗
    2020-11-28 10:06
  • 签到天数: 147 天

    连续签到: 1 天

    [LV.7]常住居民III

    24

    主题

    267

    帖子

    0

    高级会员

    Rank: 4

    积分
    975
    最后登录
    2021-10-22
    发表于 2019-8-30 12:41:51 | 显示全部楼层
    我使用USB2当主机,插上键盘,怎么按键盘都没什么屌用。。。。
    #define CONTROLLER_ID kUSB_ControllerEhci1
    初始化打印就一句话 host init done;
    怎么破?
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2019-9-9
     楼主| 发表于 2019-8-30 13:14:38 | 显示全部楼层
    walkout 发表于 2019-8-30 12:41
    我使用USB2当主机,插上键盘,怎么按键盘都没什么屌用。。。。
    #define CONTROLLER_ID kUSB_ControllerEhci ...

    具体你要跟一下HOST的协议了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-11-28 10:06
  • 签到天数: 147 天

    连续签到: 1 天

    [LV.7]常住居民III

    24

    主题

    267

    帖子

    0

    高级会员

    Rank: 4

    积分
    975
    最后登录
    2021-10-22
    发表于 2019-8-30 13:23:40 | 显示全部楼层
    jingjin221 发表于 2019-8-30 13:14
    具体你要跟一下HOST的协议了!

    我直接移植官方的demo
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-11-28 10:06
  • 签到天数: 147 天

    连续签到: 1 天

    [LV.7]常住居民III

    24

    主题

    267

    帖子

    0

    高级会员

    Rank: 4

    积分
    975
    最后登录
    2021-10-22
    发表于 2019-8-30 17:46:12 | 显示全部楼层
    我好像和你情况差不多,我USB2 host之前一直没反应,下载官方的代码可以,寻思着只有内存分配不一样,果然,我把堆定义在0x20000000开始的位置可以,  place in DATA_region                        { last block HEAP };

    换成0x20200000开始的位置就不行了place in DATA2_region                        { last block HEAP };
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2019-9-9
     楼主| 发表于 2019-8-30 22:05:12 | 显示全部楼层
    I.MXRT1020芯片的RAM空间分为四种类型:ITCM,DTCM,OCRAM以及外部SDRAM,其中前面三个属于芯片内部RAM,合计256K,支持用户静态分配,SDRAM属于外置RAM,最大支持到1.5G扩展空间。ITCM和DTCM是直接挂在芯片内核总线,速度可以达到与内核同频的528M,OCRAM挂在Sys AXI 64位总线,速度只能到达132M,外部SDRAM速度则可达到266M,而同时RT1020内又有各16K的指令cache和数据cache,用于提高代码在外部Nor Flash中XIP执行的效率。从速度的角度看,将所有的用户代码分配在ITCM/DTCM,能够发挥到最大性能,从存储空间大小的角度看,代码存放在SDRAM或者外部Flash最简单,而从USB/DMA使用的角度来看,RAM空间分配在OCRAM空间最为方便。所以这些不同RAM类型速度/大小的差异和cache的存在,就决定了要想让RT1020性能发挥到最大,就需要用户根据客户实际应用手动修改RT1020内部RAM空间中ITCM/DTCM/OCRAM的大小分配,并定位关键代码和数据到指定RAM空间中运行。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2019-9-9
     楼主| 发表于 2019-9-6 09:59:35 | 显示全部楼层
    walkout 发表于 2019-8-30 17:46
    我好像和你情况差不多,我USB2 host之前一直没反应,下载官方的代码可以,寻思着只有内存分配不一样,果然 ...

    有找到具体原因吗?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2019-9-9
     楼主| 发表于 2019-9-6 11:12:53 | 显示全部楼层
    终于找到原因了!
    在野火论坛上的一个帖子给了我提示,谢谢这位哥们儿!!!
    我对比了官方SDK和原子哥代码的MPU配置,发现在配置OCRAM区域时有所不同!!!
    官方的如下
        /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
    原子哥的如下
    MPU->RBAR=ARM_MPU_RBAR(6,0X20200000);                        //region 6,起始地址0X2020 0000,OCRAM首地址,相同地址段设置,region大的覆盖小的
    MPU->RASR=ARM_MPU_RASR(0,ARM_MPU_AP_FULL,0,1,1,0,0,ARM_MPU_REGION_SIZE_256KB);        //可执行,全访问,写回,允许共享,允许cache,禁止缓存,禁止子region,256KB大小

    此处不同的有属性有 “允许共享” 和 “是否缓存”

    最后验证出,问题就是出在 共享这个属性上!!!把OCRAM的共享属性给使能就OK了!!!
    具体原因后面再查文档!!!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    1

    主题

    7

    帖子

    0

    新手上路

    Rank: 1

    积分
    28
    最后登录
    2019-9-9
     楼主| 发表于 2019-9-6 11:13:24 | 显示全部楼层
    walkout 发表于 2019-8-30 17:46
    我好像和你情况差不多,我USB2 host之前一直没反应,下载官方的代码可以,寻思着只有内存分配不一样,果然 ...

    终于找到原因了!
    在野火论坛上的一个帖子给了我提示,谢谢这位哥们儿!!!
    我对比了官方SDK和原子哥代码的MPU配置,发现在配置OCRAM区域时有所不同!!!
    官方的如下
        /* Region 6 setting: Memory with Normal type, not shareable, outer/inner write back */
    MPU->RBAR = ARM_MPU_RBAR(6, 0x20200000U);
    MPU->RASR = ARM_MPU_RASR(0, ARM_MPU_AP_FULL, 0, 0, 1, 1, 0, ARM_MPU_REGION_SIZE_256KB);
    原子哥的如下
    MPU->RBAR=ARM_MPU_RBAR(6,0X20200000);                        //region 6,起始地址0X2020 0000,OCRAM首地址,相同地址段设置,region大的覆盖小的
    MPU->RASR=ARM_MPU_RASR(0,ARM_MPU_AP_FULL,0,1,1,0,0,ARM_MPU_REGION_SIZE_256KB);        //可执行,全访问,写回,允许共享,允许cache,禁止缓存,禁止子region,256KB大小

    此处不同的有属性有 “允许共享” 和 “是否缓存”

    最后验证出,问题就是出在 共享这个属性上!!!把OCRAM的共享属性给使能就OK了!!!
    具体原因后面再查文档!!!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2020-11-28 10:06
  • 签到天数: 147 天

    连续签到: 1 天

    [LV.7]常住居民III

    24

    主题

    267

    帖子

    0

    高级会员

    Rank: 4

    积分
    975
    最后登录
    2021-10-22
    发表于 2019-9-12 16:50:57 | 显示全部楼层
    jingjin221 发表于 2019-9-6 11:13
    终于找到原因了!
    在野火论坛上的一个帖子给了我提示,谢谢这位哥们儿!!!
    我对比了官方SDK和原子哥代 ...

    我改了试试
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-9-10 02:20 , Processed in 0.107647 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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