65

帖子

0

TA的资源

一粒金砂(初级)

21
 

PC不发请求,设备不会自动发数据

因为设备所处的状态不对,当然PC端会陷入循环。而设备的状态不对,不是因为操作不对(你已经说擦除和编程都正确完成),也不是因为硬件有问题(USB可以正确地收发数据),所以我只能怀疑PC端软件有问题,要知道Firmware是不会检测PC命令是否错误。

你最好还是检查一下编程结束时几个变量的数值,这些数据非常重要,它们可以告诉我们现在Firmware运行到状态图中的什么地方了。只有知道了你的程序状态转换的路径才能有效地分析原因。

我没用过Bus Hound,不知道如何解读你抓到的数据,这里有时间的信息吗?能看见ACK或NAK吗?各个域的意义都是什么?
此帖出自stm32/stm8论坛
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

22
 

20楼叙述的图


做擦除操作时,程序耗时的时刻停留在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));
                    }
............................
 
 
 
此帖出自stm32/stm8论坛
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

23
 

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));
                    }
 
此帖出自stm32/stm8论坛
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

24
 

从你的变量来看,你的状态机处于状态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的同样原因而造成。
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

25
 

你的硬件环境是什么?

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

回复

75

帖子

0

TA的资源

一粒金砂(初级)

26
 

硬件是str711人

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

回复

72

帖子

0

TA的资源

一粒金砂(中级)

27
 

硬件是str711fr2

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

回复

77

帖子

0

TA的资源

一粒金砂(初级)

28
 

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

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

回复

80

帖子

0

TA的资源

一粒金砂(初级)

29
 

我在深圳南山科技园

                                 好的,这个周末再研究研究,仍有问题我下个周联系力源,谢谢。
此帖出自stm32/stm8论坛
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

30
 

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

                                  
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

31
 

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

                                 希望能解决你的问题
此帖出自stm32/stm8论坛
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

32
 

我的问题解决了

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

回复

72

帖子

0

TA的资源

一粒金砂(初级)

33
 

恭喜楼主

                                 有机会到深圳出差,请你喝茶。
此帖出自stm32/stm8论坛
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

34
 

感谢你们

                                 你们帮了我忙。我应该感谢你们。我应该尽地主之仪。我的邮件是lvpeng52@hotmail.com 电话13828808770
此帖出自stm32/stm8论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
福禄克有奖直播:高精度测温赋能电子制造 报名中!
直播时间:2025年2月28日(周五)上午10:00
直播主题:高精度测温赋能电子制造
小伙伴们儿快来报名直播吧~好礼等你拿!

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表