打印
[信息]

【实战经验】使用 CCM 导致以太网通信失败

[复制链接]
1454|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 香水城 于 2017-8-17 14:02 编辑

使用 CCM 导致以太网通信失败

问题:
该问题由某客户提出,发生在STM32F407IGT6 器件上。据其工程师讲述:在其产品设计中使用了STM32 的以太网接口进行通信。在软件最初的调试中,该接口工作正常。后来为了满足软件对内存容量的需求,启用了STM32 的CCM 存贮器,但启用后发现以太网接口不能通信。所使用的开发工具为Keil MDK,相关的内存分配如表(一):

调研
进一步了解得知,在其软件中,使用了动态内存对以太网的数据报文进行了缓存,并且数据在以太网MAC 和内存中的缓存之间的传输是通过以太网的DMA 功能进行的。于是,修改内存分配如表(二),然后得新测试。测试结果表明,以太网接口可以正常通信了。
结论:
对STM32 的CCM 存贮器使用不当。因为以太网的DMA 与CCM 存贮器之间没有数据通道,它们之间的数据传输数据是不能实现的。

处理:
修改内存分配,如表(二)。

建议:
为进一步提高对数据的处理性能,在STM32F4 中设有CCM 存贮器。与常规的存贮器不同,CCM 存贮器是CPU 独享的存贮器。CCM 存贮器与CPU 之间的数据传输不经过总线矩阵,以提高CPU 对CCM存贮的访问效率,如图(一)所示。这样的组织结构也决定了,只有CPU 才能够访问CCM 存贮器,而DMA 以及其它的外设与CCM 存贮器之间没有数据通道,也就无法对其访问。在通常的应用中,适合将程序的栈放在CCM 存贮器中,以提高中断的响应速度,以及对子程序的调用速度。同时,如果使用C语言编程,函数的局部变量是定义在栈上的,所以把栈放在CCM 存贮器中,也可以提高CPU 对函数的局部变量的访问速度。对于一些算法的实现,比如DSP 计算或浮点数计算,适合于把参与计算数据及计算出的结果存放在CCM 存贮存器中,这样可以提高计算的效率。如果希望动态的管理CCM 存贮器,则最好将其与常规存贮器加以区分。因为两种存贮器的属性不同,用途也不同。CCM 存贮器不能由DMA 访问,而常规存贮器会降低CPU 对数据的处理效率。

对应的PDF:使用 CCM 导致以太网通信失败
更多实战经验请看:【ST MCU实战经验汇总贴】


沙发
jcx0324| | 2015-8-11 11:32 | 只看该作者
CCM段不能用DMA访问

使用特权

评论回复
板凳
yklstudent| | 2015-8-11 11:43 | 只看该作者
版主请教个问题,LwIP服务器端下,直接采用tcp_echoserver_send函数发送数据,为什么几次收发数据后,就没**常接收到数据了呢,能指点下方向吗?

使用特权

评论回复
地板
mmuuss586| | 2015-8-11 12:38 | 只看该作者

使用特权

评论回复
5
amanda_s| | 2015-8-13 16:11 | 只看该作者
yklstudent 发表于 2015-8-11 11:43
版主请教个问题,LwIP服务器端下,直接采用tcp_echoserver_send函数发送数据,为什么几次收发数据后,就没* ...

收发的数据量大吗?
这时还能ping通吗?
用抓包工具(比如wireshark)抓下数据看看,有没有数据发出,问题是在哪一端。
从底层往上调试跟踪一下。

使用特权

评论回复
6
yklstudent| | 2015-8-13 16:20 | 只看该作者
amanda_s 发表于 2015-8-13 16:11
收发的数据量大吗?
这时还能ping通吗?
用抓包工具(比如wireshark)抓下数据看看,有没有数据发出,问题 ...

wireshark好用吗?
我的问题解决了,是要调用pbuf_free()函数释放缓冲区(大概是这个意思),然后就可以正常接收/发送了。

使用特权

评论回复
7
amanda_s| | 2015-8-13 16:38 | 只看该作者
yklstudent 发表于 2015-8-13 16:20
wireshark好用吗?
我的问题解决了,是要调用pbuf_free()函数释放缓冲区(大概是这个意思),然后就可以正 ...

好用啊,而且是免费的。:lol

使用特权

评论回复
8
yklstudent| | 2015-8-13 16:47 | 只看该作者
amanda_s 发表于 2015-8-13 16:38
好用啊,而且是免费的。

我很少用这个,倒是用网络调试助手直接调试通信的,下次试试看

使用特权

评论回复
9
myxiaonia| | 2015-8-14 07:45 | 只看该作者
yklstudent 发表于 2015-8-13 16:47
我很少用这个,倒是用网络调试助手直接调试通信的,下次试试看

wireshark可以看到完整的以太网包,调试助手是不行的

使用特权

评论回复
10
yklstudent| | 2015-8-14 08:27 | 只看该作者
myxiaonia 发表于 2015-8-14 07:45
wireshark可以看到完整的以太网包,调试助手是不行的

恩,我去找找怎么用

使用特权

评论回复
11
putron09| | 2015-8-14 17:48 | 只看该作者
学习了

使用特权

评论回复
12
938612765| | 2016-6-2 16:14 | 只看该作者
程序卡在ETH_MACDMA_Config()里面,经过调试发现EthInitStatus = ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);这条语句执行完后的EthInitStatus = 0;说明没有初始化成功。继续调试进入ETH_Init(&ETH_InitStructure, DP83848_PHY_ADDRESS);,发现:
   do
    {
      timeout++;
    } while (!((tmp=ETH_ReadPHYRegister(PHYAddress, PHY_BSR)) & PHY_Linked_Status) && (timeout < PHY_READ_TO));

    /* Return ERROR in case of timeout */
    if(timeout == PHY_READ_TO)
    {
      return ETH_ERROR;
    }

tmp = 0x7849,(tmp是自己定义的一个变量用于调试的),经过查询相关资料,正常BSR的值为0x786d,仔细对照BSR的各个位的定义,发现第二位LinkStatus = 0 ,这就表示连接link is down
同时第5位的Auto-Negotiate Complete = 0 ,这就表示auto-negotiate process not completed,说明自动协商没有成功。


初步诊断为连接问题,检查硬件连接暂时没有发现问题。希望高手能指导一二,万分感谢!

使用特权

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

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:STM32技术专家

596

主题

17108

帖子

287

粉丝