发新帖我要提问
12
返回列表
打印
[应用相关]

关于usb的iap程序。

[复制链接]
楼主: lvpeng1979
手机看帖
扫描二维码
随时随地手机跟帖
21
lvpeng1979|  楼主 | 2007-11-29 21:54 | 只看该作者 回帖奖励 |倒序浏览

20楼叙述的图


做擦除操作时,在设备不断的发送给pc等待时间(擦除8k扇区时是1s,32k时是2s,64k时是4s)时截的图。此时iap程序运行在程序最后的语句while(1);长时间没有得到请求DFU_GETSTATUS,程序进不了下面的擦除操作。
void DFU_Status_Out (void)
{
    DEVICE_INFO *pInfo = &Device_Info;
    u32 i,Addr,DATA;
    if(pInfo->USBbRequest == DFU_GETSTATUS)
    {  
        if(DeviceState ==STATE_dfuDNBUSY)
 {
     if (wBlockNum == 0 )   /* Decode the Special Command*/
            {
                if ( (Load_Buffer[0] ==  CMD_GETCOMMANDS) &&(wlength == 1) )
                {
                }
                else if  (( Load_Buffer[0] ==  CMD_SETADDRESSPOINTER )&&(wlength == 5))
                {
                    Pointer  = Load_Buffer[1];
                    Pointer += Load_Buffer[2] << 8;
                    Pointer += Load_Buffer[3] << 16;
                    Pointer += Load_Buffer[4] << 24;
                }
                else if (( Load_Buffer[0] ==  CMD_ERASE )&&(wlength == 5))
                {
                    Pointer  = Load_Buffer[1];
                    Pointer += Load_Buffer[2] << 8;
                    Pointer += Load_Buffer[3] << 16;
                    Pointer += Load_Buffer[4] << 24;
                    if  ( Pointer < 0x60000000 )  /* Internal Flash */
                    {
                        Internal_FLASH_WritePrConfig(Internal_FLASH_SectorMask(Pointer),DISABLE);
                        Internal_FLASH_SectorErase(Internal_FLASH_SectorMask(Pointer));
                    }
 

使用特权

评论回复
22
浪淘沙| | 2007-11-29 23:05 | 只看该作者

从你的变量来看,你的状态机处于状态3至状态4的转换阶段

似乎是收到了一个GET_STATUS的命令,程序已经从GETSTATUS函数中退出,此时设备已准备好响应的数据,通过IN Token发回给PC,等到PC的ACK响应后将进入DFU_Status_Out函数进行擦除操作,但PC的ACK没有收到,这就是你停的位置。

但这里非常奇怪的是GET_STATUS命令应该是:
  USBbmRequestType = 0xA1
  USBbRequest = 0x04
可是你的这两个变量都是0x00;这里看不到USBwValue、USBwIndex和USBwLength,不知是否也已经被破坏。没有程序语句可以改变这些变量的值,他们只会在设备正确收到Control命令时才被更新,而DFU操作中没有0x00 0x00这样的命令,所以只有一种可能,它们被意外地改变了!


进一步分析,设备收不到PC的ACK有两种可能,1)PC收到IN数据后,没发ACK;2)PC没收到IN数据或IN数据有错。估计第1种可能性很小,第2种可能性很大,这种情况也很可能因为破坏USBbmRequestType和USBbRequest的同样原因而造成。

使用特权

评论回复
23
浪淘沙| | 2007-11-30 10:07 | 只看该作者

你的硬件环境是什么?

另外,如果你在做开发的项目,请联系ST的代理商以获得直接的支持;我们这样交谈效率很低,很多时候在绕圈子,抓不到要点,你累我也累。

使用特权

评论回复
24
lvpeng1979|  楼主 | 2007-11-30 20:30 | 只看该作者

硬件是str711人

这是项目的最后问题,深圳这边的力源能解决我就不会在这里打字了,跟他们交流也是在兜圈子,他们说把问题转给st的人,但后来说st的人没理。

使用特权

评论回复
25
lvpeng1979|  楼主 | 2007-11-30 20:36 | 只看该作者

硬件是str711fr2

硬件是str711fr2,用的j-link。软件环境是iar。整个项目就这个问题就完成了。dfu的应用初次接触,所以有这样的问题。

使用特权

评论回复
26
浪淘沙| | 2007-11-30 21:02 | 只看该作者

如果你在深圳,事情就好办了

你让力源的人带你到ST深圳的办公室,并把你的板子带去,让他们用USB分析仪抓一下通信的过程,然后发给我,这样可以比较容易发现问题。

使用特权

评论回复
27
lvpeng1979|  楼主 | 2007-12-1 09:53 | 只看该作者

我在深圳南山科技园

好的,这个周末再研究研究,仍有问题我下个周联系力源,谢谢。

使用特权

评论回复
28
香水城| | 2007-12-4 15:11 | 只看该作者

ST深圳的办公室也在南山科技园

使用特权

评论回复
29
浪淘沙| | 2007-12-5 12:03 | 只看该作者

我已经通知ST深圳的工程师,他们会帮你采集数据

希望能解决你的问题

使用特权

评论回复
30
lvpeng1979|  楼主 | 2007-12-11 12:09 | 只看该作者

我的问题解决了

我的问题解决了,用um0412.zip的底层的库函数,重新写了pc端的dfu。开始还是duf1.1的文档还搞清楚,所以出现这些问题。谢谢两位。我的产品也要试生产了

使用特权

评论回复
31
香水城| | 2007-12-11 21:25 | 只看该作者

恭喜楼主

有机会到深圳出差,请你喝茶。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则