请教有关CAN总线接收数据的几个问题。 点击:3600 | 回复:6



yeslet

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年3月13日
发表于:2003-05-12 15:05:00
楼主
我在做一个毕业设计,有点问题想问各位CAN高手:   系统为:89C51+82C200+82C250,其中89C51的INT0脚与82C200的INT脚相连,   89C51用中断方式响应进行接收,82C200初始化为:所有中断位均开放。      我的问题是:   1、82C200有两个接收缓冲器(0和1),在初始化后接收到第一帧数据A,   那么是保存到缓冲器0中吗?中断寄存器IR中的IR.0应是1吧(接收中断   位置位)?同时在INT管脚是不是给出一个下降沿脉冲?   2、此时89C51响应中断而读取缓冲器0中的数据,如果在读取没有完成之   前,总线上又有新的一帧数据B到来,且符合接收条件,这时82C200应该   是将新的数据保存到缓冲器1中吗?并且IR.3=1(超载中断位置位)吧?同   时会在INT管脚输出一个下降沿脉冲吗?   3、如果89C51在响应第一个CAN中断后没有关闭INT0中断,则将会响应第二   个中断而进入了中断嵌套,此时如果访问82C200的接收缓冲器,则访问的   是缓冲器0还是缓冲器1呢,读取到的是数据A还是数据B呢?当第二次中断   进行完后,由于中断嵌套而被打断了的第一次中断继续执行时,继续访问的   又将是哪一个缓冲器,读取到的是哪一个数据?   4、如果89C51在响应第一个CAN中断后先关闭了INT0中断(直到中断返回前   才开放),此时继续访问的是哪一个缓冲器,读取到的是哪一个数据?对于   第二次中断,单片机如何进行响应,是不是无法响应了?这样的话,数据B   是不是无法接收到?即是不是在响应中断的时候不应该关闭INT0中断呢?      恳请高手解答!!!!万分感谢!!



yunri

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 13回
  • 年度积分:0
  • 历史总积分:43
  • 注册:2003年5月05日
发表于:2003-05-07 16:12:00
1楼
你好,我用的是SJA1000,它每次响应中断读取数据后(读数过程中,关中断),中断为再次产生,再接着读取缓冲1中的数据就可以了。

yeslet

  • 精华:1帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年3月13日
发表于:2003-05-07 20:31:00
2楼
谢谢!问题是缓冲器0和1是共用一个地址的呀,是不是82C200自动决定 访问哪一个? 另外,你所说的是全部读取了数据0后才有新的数据1发过来的?还是在读取数据0的过程中,又有新的数据来了?此时“中断为再次产生”是什么意思? 劳驾指点一下!!!

yunri

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 13回
  • 年度积分:0
  • 历史总积分:43
  • 注册:2003年5月05日
发表于:2003-05-07 20:54:00
3楼
在实际应用中好像是SJA1000(82C200)自动的接收的数据存到各个缓存,但读数时可以都从第一个缓存读出,芯片会自动把接收的数据转到第一个缓存里。 在读取数据0里的数据时,其它的缓存也可以同时接收数据吧(这个我也不肯定了,没具体试过,最少是可以一次把数据都接收过去,存支各个缓存里),数据缓存里有数据待取时就会有中断产生,当你访问过中断寄存器后,中断会复位,等取完第一贞数据后,可能是把其它缓存的数据又送到数据0里了,所以会再次产生中断。 其实CAN我也是初学,不对的地方希望有大侠来指点一下。:)

awa405

  • 精华:4帖
  • 求助:0帖
  • 帖子:17帖 | 63回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2002年12月13日
发表于:2003-05-08 16:20:00
4楼
回复内容见[]中 1、82C200有两个接收缓冲器(0和1),在初始化后接收到第一帧数据A,     那么是保存到缓冲器0中吗?[yes] 中断寄存器IR中的IR.0应是1吧(接收中断     位置位)?[yes] 同时在INT管脚是不是给出一个下降沿脉冲?[开漏输出,注意上拉10k电阻或者与其他中断源引脚线或输出]     2、此时89C51响应中断而读取缓冲器0中的数据,如果在读取没有完成之     前,总线上又有新的一帧数据B到来,且符合接收条件,这时82C200应该     是将新的数据保存到缓冲器1中吗?并且IR.3=1(超载中断位置位)吧?[yes] 同     时会在INT管脚输出一个下降沿脉冲吗?[yes]     3、如果89C51在响应第一个CAN中断后没有关闭INT0中断,则将会响应第二     个中断而进入了中断嵌套,此时如果访问82C200的接收缓冲器,则访问的     是缓冲器0还是缓冲器1呢,读取到的是数据A还是数据B呢? [注意所有82c200的中断都是触发INT0中断,不同的是进入中断后检测82c200的中断控制器的相应位,而不是中断嵌套,现在如果读取,假如还没有访问过接收缓存,则为数据A,访问过了就是数据B] 当第二次中断     进行完后,由于中断嵌套而被打断了的第一次中断继续执行时,继续访问的     又将是哪一个缓冲器,读取到的是哪一个数据? [没有中断嵌套]     4、如果89C51在响应第一个CAN中断后先关闭了INT0中断(直到中断返回前     才开放),此时继续访问的是哪一个缓冲器,读取到的是哪一个数据?对于     第二次中断,单片机如何进行响应,是不是无法响应了?这样的话,数据B     是不是无法接收到?即是不是在响应中断的时候不应该关闭INT0中断呢? [有个焦点需要注意,所有的中断,包括接收和发送中断都是共用了单片机的INT0中断资源,所以在INT0里才进行对于中断控制器各个标志位的判别和处理,至于说响应不响应与软件编写有关,和INT0中断本身的响应没有关系,对于82c200,接收是采用双缓存技术,用户对于接收缓存的访问都是针对一个地址(起始为20)的,建议采用SJA1000,拥有更大的缓存,完全兼容82c200]

yeslet

  • 精华:1帖
  • 求助:0帖
  • 帖子:2帖 | 5回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2003年3月13日
发表于:2003-05-09 19:48:00
5楼
谢谢各位!! 请问awa405: 对第三个问题我还有疑问: 3、如果89C51在响应第一个CAN中断后没有关闭INT0中断,则将会响应第二       个中断而进入了中断嵌套,此时如果访问82C200的接收缓冲器,则访问的       是缓冲器0还是缓冲器1呢,读取到的是数据A还是数据B呢?   [注意所有82c200的中断都是触发INT0中断,不同的是进入中断后检测82c200的中断控制器的相应位,而不是中断嵌套,现在如果读取,假如还没有访问过接收缓存,则为数据A,访问过了就是数据B]    ~~~~~~~~~~~~~~这样的话, 那数据A不就没有读取完吗? 假如在读取数据A的ID部分时,数据B就到来了,8051响应中断然后读 取82C200中断寄存器而得知是超载中断,按你的说法,那此时8051读取的就会是数据B了。这样数据A没有读取的部分不就丢失了吗?

awa405

  • 精华:4帖
  • 求助:0帖
  • 帖子:17帖 | 63回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2002年12月13日
发表于:2003-05-12 15:05:00
6楼
我觉得你没有理解82c200接到INT0的中断机制。其实,在每一次进入中断服务程序之后,对于82c200的中断位的响应就完全由你自己控制了,也就是说,你可以先检测它是不是接受中断,然后接收一帧数据,或者先检测是不是超载,然后再连续接收两帧数据。当接收第一帧数据时,第二帧数据正好接受到了,单片机的中断机制不会打断你的接收过程,因为你还在INT0中断中,你如果不检测超载标志,那么接收完成退出INT0中断后,还会响应INT0中断,但这也不存在中断嵌套问题,也不存在数据A被冲掉的问题。最后再强调一句,82c200的所有中断是共享INT0中断的,只有进入INT0中断后判断相应标志位才能够确定是什么中断。

热门招聘
相关主题

官方公众号

智造工程师