Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
RT-Thread一般讨论
例程里enc28j60 bug
发布于 2011-12-19 11:03:34 浏览:22804
订阅该版
enc28j60.c里初始化代码434行: ```// enable interrutps spi_write_op(ENC28J60_BIT_FIELD_SET, EIE, EIE_INTIE|EIE_PKTIE|EIR_TXIF);``` EIE寄存器里并没有EIR_TXIF这一位,那是EIR寄存器里的。不知写这里是什么意思。 第542行: ```// Reset the transmit logic problem. See Rev. B4 Silicon Errata point 12. if( (spi_read(EIR) & EIR_TXERIF) ) { spi_write_op(ENC28J60_BIT_FIELD_CLR, ECON1, ECON1_TXRTS); }``` 注意,是ECON1_TXRST,而不是ECON1_TXRTS,这个问题害我调了一周。板子运行一些时间就ping不通,只能收数据,不能发。 ![ping结果.jpg](https://oss-club.rt-thread.org/uploads/3694_bf54db54ccdbd89a33df50eb587353dc.jpg)
查看更多
28
个回答
默认排序
按发布时间排序
zyb
2011-12-19
这家伙很懒,什么也没写!
还有enc28j60_interrupt_disable(),enc28j60_interrupt_enable()中,我觉得只关闭或打开全局中断位EIE_INTIE就可以了,没必要读出EIE所有位,保存给一个变量,开中断时再写入。浪费CPU资源。
bernard
2011-12-19
这家伙很懒,什么也没写!
这个玩意太久没维护了,没相应的开发板。 这块得找个维护人~~谁愿意?另外,新的SPI驱动框架会好些,可以与具体的SPI无关了。
caai
2011-12-19
这家伙很懒,什么也没写!
>还有enc28j60_interrupt_disable(),enc28j60_interrupt_enable()中,我觉得只关闭或打开全局中断位EIE_INTIE就可以了,没必要读出EIE所有位,保存给一个变量,开中断时再写入。浪费CPU资源。 --- 你是用的什么CPU+28J60? 我用STM32好像还稳定,就是不能PING大包。 >这个玩意太久没维护了,没相应的开发板。 >这块得找个维护人~~谁愿意?另外,新的SPI驱动框架会好些,可以与具体的SPI无关了。 --- 我有这个硬件,也想来做这个维护,可我对LWIP不熟....
bernard
2011-12-19
这家伙很懒,什么也没写!
>>还有enc28j60_interrupt_disable(),enc28j60_interrupt_enable()中,我觉得只关闭或打开全局中断位EIE_INTIE就可以了,没必要读出EIE所有位,保存给一个变量,开中断时再写入。浪费CPU资源。 > >--- > > > >你是用的什么CPU+28J60? 我用STM32好像还稳定,就是不能PING大包。 > > >>这个玩意太久没维护了,没相应的开发板。 >>这块得找个维护人~~谁愿意?另外,新的SPI驱动框架会好些,可以与具体的SPI无关了。 > >--- > > >我有这个硬件,也想来做这个维护,可我对LWIP不熟.... --- 我记得我有硬件时曾试过,在STM32上能够ping通大包。 做为对这类驱动的维护,需要在每次发布前(或者平常有时间的时候,svn代码有改动的时候)在自己的硬件上进行相应的测试,以保证它能够正常工作。希望(仅是希望而不是强制、必须)对于论坛上(仅限于www.rt-thread.org这边论坛)的一些这类驱动提问进行相关的回答。 另外,因为下一个版本添加了新的SPI框架,到时也需要迁移到新的框架上。相对来说,工作主要局限于这个驱动,这个驱动没啥问题,工作量也不会太大。
zyb
2011-12-19
这家伙很懒,什么也没写!
我用的就是STM32,官方例程,就改几个管脚定义。其它没动。打开电脑CMD窗一直ping板子。板子重启10次,就会有一次ping不通了。如果发生ping不通的情况,就再也别想ping通了,等多久都没用。数据包根本发不出。如果一开始ping的通,开10小时左右也会发生ping不通的问题。 代码里那句明显是错了,RTS和RST是两个完全不一样的功能,很容易眼花。 还有,在例程的app线程初始化lwip后。加代码实现TCP客户端,相当于串口转网口的简单代码。大数据量双向收发,只需10分钟。app线程就停止了,这线程的我每2秒打出一个信息来,停止后信息也不出了。但这里可以ping通,其它线程似乎正常。经过慢长的等待,大约一两个小时,这线程又会活过来,然后每2秒打出要的信息。 ``` uint32_t count=0; while(1) { msleep(20); if ((count++%100)==1) { Trace(2,"count:%d",count); } bytes_received = recv(sock, recv_data, sizeof(recv_data), MSG_DONTWAIT); if (bytes_received > 0) { GPIO_PullDown(LED_TCP_ACT); uart_write(RS232,recv_data,bytes_received); } bytes_received=uart_read(RS232,recv_data,sizeof(recv_data)); if (bytes_received>0) { send(sock,recv_data,bytes_received, 0); } } ```
zyb
2011-12-19
这家伙很懒,什么也没写!
板子是我为了测试RTT和Enc28J60自已画的一块板,对STM32很熟,用它做过很多项目。电路肯定是没问题的。
bernard
2011-12-19
这家伙很懒,什么也没写!
>板子是我为了测试RTT和Enc28J60自已画的一块板,对STM32很熟,用它做过很多项目。电路肯定是没问题的。 --- 完整的好的驱动是什么样的?ping大包测试是否也没问题?
caai
2011-12-19
这家伙很懒,什么也没写!
>我用的就是STM32,官方例程,就改几个管脚定义。其它没动。打开电脑CMD窗一直ping板子。板子重启10次,就会有一次ping不通了。如果发生ping不通的情况,就再也别想ping通了,等多久都没用。数据包根本发不出。如果一开始ping的通,开10小时左右也会发生ping不通的问题。 --- 我刚才用我的板子试了一下,重启10几次,每次PING 1000字节的包。很稳定,延时是5ms,每次PING一分钟左右,没有任何丢包。 我的硬件还是从板子上用2.54的排线引到28J60模块上的。 软件用的是rtt 0.4.0 beat1 编译器是MDKV4.03q 我今天晚上开一晚上来测试一下吧,五个窗口都PIN 1000字节包。
zyb
2011-12-19
这家伙很懒,什么也没写!
可能我的网络环境不一样,我这局域网电脑比较多。插上网线后灯就一直疯狂的闪,也一直进入接收中断。 但有一点可以确定,我在1楼说的驱动里那条语句肯定是写错了。J60的errata手册上第12条是这样写的:>Before attempting to transmit a packet (setting >ECON1.TXRTS), reset the internal transmit logic >by setting ECON1.TXRST and then clearing >ECON1.TXRST. The host controller may wish to >issue this Reset before any packet is transmitted >(for simplicity), or it may wish to conditionally reset >the internal transmit logic based on the Transmit >Error Interrupt Flag (EIR.TXERIF), which will >become set whenever a transmit abort occurs. >Clearing ECON1.TXRST may cause a new transmit >error interrupt event (EIR.TXERIF will become >set). Therefore, the interrupt flag should be cleared >after the Reset is completed. --- ,上面是让setting ECON1.TXRST,而不是ECON1.TXRTS。并且在Microchip公司的官方代码也是设置TXRST,以重启发送logic. 在这里设置RTS毫无道理。
zyb
2011-12-19
这家伙很懒,什么也没写!
发送失败的问题,改正这个BUG后已彻底解决。我现在是想不明白那个app线程为何会停止1个多小时。是否RTT的任务调度有问题,我准备用在正式产品上。 还有一个问题,STM32的工程里,所有UART接收都改为了中断的方式,为何不用DMA呢? 5个UART,按115200波特率来算,1秒钟共115200*5/10=56000字节, 就是说1秒钟要处理5万6千次中断 [s:166] ,并且ISR里的代码还挺多。这样是否会导致CPU开销过大? [s:186]
撰写答案
登录
注册新账号
关注者
0
被浏览
22.8k
关于作者
zyb
这家伙很懒,什么也没写!
提问
4
回答
27
被采纳
0
关注TA
发私信
相关问题
1
有关动态模块加载的一篇论文
2
最近的调程序总结
3
晕掉了,这么久都不见layer2的踪影啊
4
继续K9ii的历程
5
[GUI相关] FreeType 2
6
[GUI相关]嵌入式系统中文输入法的设计
7
20081101 RT-Thread开发者聚会总结
8
嵌入式系统基础
9
linux2.4.19在at91rm9200 上的寄存器设置
10
[转]基于嵌入式Linux的通用触摸屏校准程序
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
2024 RT-Thread睿赛德开发者大会共探商业共赢的开源生态
2
rt-thread 小内存算法源码分析
3
env中添加lvgl软件包后,keil编译包--c99错误
4
【NXP-MCXA153】 定时器驱动移植
5
GD32F450 看门狗驱动适配
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
freemodbus
flash
cubemx
packages_软件包
BSP
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
Debug
中断
编译报错
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
C++_cpp
MicroPython
本月问答贡献
a1012112796
20
个答案
3
次被采纳
红枫
8
个答案
2
次被采纳
踩姑娘的小蘑菇
7
个答案
2
次被采纳
三世执戟
7
个答案
1
次被采纳
Ryan_CW
5
个答案
1
次被采纳
本月文章贡献
YZRD
3
篇文章
6
次点赞
catcatbing
3
篇文章
6
次点赞
lizimu
2
篇文章
12
次点赞
qq1078249029
2
篇文章
2
次点赞
xnosky
2
篇文章
1
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部