Mentor USB Controller EDA仿真系列之Bulk Out传输

系列文章目录

第六章:Mentor USB Controller EDA仿真系列之Bulk Out传输


提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文主要介绍Mentor USB Controller传输Bulk Out包的整个流程,包括前期phy上电、控制器上电以及内部相关状态机运作情况,以及host和device两种情况下的软件配置。并重点介绍了该包传输的整体flow。文章最后对仿真过程中遇到的问题做了介绍并给出了解决该问题的一种方法。

一、前期准备

首先,保证控制器的时钟、复位、phy的接口时序全部是否OK的。

其次,如果传输数据位宽采用16bit模式,则要求控制器时钟要求至少大于30,因为控制器会处理xclk domain到ahb domain的异步转换,而对于16bit的数据位宽xclk为30M,因此要求hclk至少是30M的配置。

二、Bulk Out调试

2.1 完成基础配置

2.1.1 作为host的配置

step1:置位VBUS

step2:使能conn连接中断并配置session有效

step3:while等待device连接中断

step4:配置reset并至少保持协议规定的时间后撤销,force TM=1可以加速仿真(1.5ms足够)

step5:设置REG_FADDR寄存器,配置target device地址

step6:设置REG_INDEX,选择某个端点用于传输

step7:设置REG_EP_TXMAXP,配置最大的发送packet

step8:设置REG_EP_TXTYPE,配置传输包类型为BULK,以及目标端点num

step9:设置REG_EP_TXCSR,配置TXCSR_MODE,使能shared FIFO is set to TX

step10:向对应端点的TX FIFO中初始化8个byte数据,仿真时数据可以是任意的值

step11:设置REG_EP_TXCSR,配置TxPktRdy

完成以上配置,host便开始发生bulk out包

2.2.2 作为device的配置

step1:完成系统时钟选择,相关中断配置等基础配置

step2:配置soft_con,然后等待reset中断

step3:一定要等待复位完成后再进行下面的配置,否则配置可能会被reset掉

step4:配置SIE_FAddr,该值需要和host的配置目标device地址一致

step5:配置SIE_Index,该值需要和host的配置的endpoint num一致,大家选择同一端点进行传输

step6:配置SIE_OUTMax,配置最大packet

step7:配置SIE_OUTCSR的D16,配置auto clear

step8:配置SIE_OUTCSR的D12,配置disNyet,bulk out包默认会先回复NYET,这里disable掉,当收到OK的数据后就会直接回复ACK

2.2 通信flow

step1/2: 当作为host上电:保证USB phy能正常输出xclk给controller,controller的NRSTX需要同xclk做同步释放,当xclk到来时,controller首先会拉起DPPULLDOWN和DMPULLDOWN,即将两个15K电阻下拉,此时bus状态DP/DM呈现下拉,即2‘b00。

step1/2:当作为device上电:同host上电

上述两步说明:实际仿真中一定要cover住host和device分别先后上电两种情况,因此实际应用中真的有可能存在谁先上电的问题,保证验证case的完备性,注意针对mentor的controller,当device先上电时,软件一般需要对device进行二次reset,原因如下:device先上电会导致device的1.5k上拉电阻拉起来,而后host上电后在check id之前会有一段时间处于DP/DM都pulldown,即总线会出现SE0,这个SE0会让device误认为host在发reset,进而其状态机开始转起来了,但其实此时仅仅是因为host刚上电来那么一段SE0(这段时间有点长,刚好满足判断SE0的时间宽度),会导致device状态机错乱,因此需要host settle好后,二次复位device,让device恢复到初始状态。

step3:当两者都上电完成后,host通过配置session来开启状态机,device通过配置softcon来开启状态机;对于host的状态机 U1.U1.OpState,当软件写session有效后,状态机首先将id_pullup置起来,进入check id状态,根据自己的ID pin状态是0,状态机会跳转到等待VBUS OK,VBUS OK后会跳转到等待device连接状态。对于device状态机U1.U1.OpState,当软件写softcon有效后,状态机首先将id_pullup置起来,进入check id状态,根据自己的ID pin状态是1,将DP下拉电阻撤销,转而将1.5K上拉电阻拉上,host的两个下拉拉不过该上拉,总线呈现chirpJ,表示device连接上总线。

step4: host看到总线出现的chirpJ,按照协议认为device连接上了,状态机会产生connect中断,此时host收到中断后会第一时间发起复位操作。

step5:由于device已经连接到总线上了,自己的1.5K上拉电阻把总线拉到了chirpJ,但是因为host发了reset,该reset为强驱动,会把总线拉到SE0态,此时device被强行拉到了SE0态,按照协议会认为host正在发reset,进而自己的状态机会根据high speed使能,在reset期间回复chirpK。如果device不是high speed设备或者关闭了high speed使能,则不会回复chirpK。

step6:host正在发送reset期间,一旦收到chirpK信号,会认为device支持high speed并使能了,正在进行高速握手,因此host会回复多组交替的chirpJ和chirpK。如果host关闭了high speed功能,则不会回复交替的chirpJ和chirpK。

step7:当device收到host发送过来的多组交替的chirpJ和chirpK,device认为host正在响应high speed握手过程。进而device完成整个high speed握手过程,状态机会跳到High Speed IDLE,等待host发送数据。

step8:当host按照协议至少回复3组交替chirpJ和chirpK以后,就可以撤销复位,当撤销完复位后,host就会每隔125us发送sof包(full speed每隔1ms),来保证总线处于激活状态,指定软件使能suspendm,host停止发送sof包。

step9:后续如果总线IDLE时间超过3ms,则会进入suspendm

2.2 遇到问题

2.2.1 当device接收完数据时,向host回复了NYET

     按照期望,device应该回复ACK才对,但是此时却回复了NYET包,分析代码,因为bulk out传输用到了endpoint2,所以主要代码为U7.U2,HSState为main fsm,然后去datasheet中搜索NYET相关的信息,发现RXCSR的D12寄存器DisNyet/ PID Error,该bit的物理含义专门针对bulk/intr两种包,默认是0,即不会disable,即针对bulk、intr包这种大量数据传输的包,device默认会先回复NYET,这样做也是为了给软件预留足够的时间去完成系统配置,当软件完成所有配置工作后,需要将该bit设置为1,即disable掉NYET,转而回复ACK,来与host进行通信。


总结

1. 首先保证phy能正常输出xclk,该clk是接给controller使用的,要想phy能正确产生xclk,则phy的driver必须正确

2. 其次,xclk的hclk的关系必须满足条件,否则异步转换数据可能不正确

3. 对于bulk out包,仔细品,这是host向device进行大量数据传输而准备的,因此在进行传输数据之前,为了防止数据无法全部正常接收,默认情况下device会先回复NYET,直到device完成准备好数据接收,对于仿真而言,可以直接设置disable NYET,表示device早早准备好了接收数据。

4. 同时对于bulk out包,host首先会发ping包,收到ping包的ACK后,才会发bulk out包;而对于bulk in包,host就不会先发ping包。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

love混世_魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值