CAN接受怎么接4茨才收到【请教strongchen大哥】
- UID
- 147340
- 性别
- 男
|
CAN接受怎么接4茨才收到【请教strongchen大哥】
用的是dp256的MCU,和上位机通信时候出现一直没在意一个问题:上位机发送一个帧都要发送5次,下位机才能收到。观察了前四次都收的是乱帧,会不会是和CAN的接受里面的前后台结构有关系呢?它有三个后台缓存,只有一个前台缓存是用来发送的,帧到前台的判断条件是不是接受满的标志位RXF清零??我用的CAN底层就是P&E生成的,RXF清零是在接收中断最后清的,
恳请strongchen大哥指点一下,项目要提交前发现这个问题的,急啊! |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
RXF标志置1表示接收到新的message。此时用户可以去读新的message,并应将RXF清零。否则无法再接收新的message。 |
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
RXF标志置1是硬件自动完成的吧??给RXF写入1是对它清零,是这个意思吗?
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
用单帧调试工具看,发送四次才能正确接收到数据,又是怎么回事呢? |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
我想会不会是CAN的3级后台缓存里本身的数据被我接受到了,而且中断接受之前要清除缓存里面的所有内容?? |
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
CAN的标志符验收过滤器怎么用啊??
还是要接受4次才能正确收到 怎么回事呢?? |
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
问题还没有解决 我的中断接受程序是这样的 还请strongchen大哥帮忙看看
interrupt void CAN1_InterruptRx(void)
{
if (SerFlag & FULL_RX_BUF) { /* Is any char already present in the receive buffer? */
SerFlag |= CAN1RFLG_OVRIF_MASK; /* If yes then set internal flag OVERRUN */
}
SerFlag |= FULL_RX_BUF; /* Set flag "full RX buffer" */
ErrFlag |= SerFlag; /* Add new error flags into the ErrorFlag status variable */
CAN1RFLG = CAN1RFLG_RXF_MASK; /* Reset the reception complete and release the RX buffer */
} |
|
|
|
|
|
- UID
- 104380
- 性别
- 男
|
你应该在收、发两部分同时进行调试。发的部分一个message一个message地发,每发一个message,看看接收部分能否进中断。 |
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
AN2283里面详细介绍了中断接受的过程 第二步提到硬件标志符接受过滤,当接受的消息帧ID和硬件过滤器(包括接受和屏蔽寄存器)相匹配,且RXF=0时,就会从RxBG变成RxFG^^^^^
这里的硬件过滤是什么意思 我程序中好像没有完成过滤嘛 要不怎么会是乱数据都去读呢 不该变成前台的数据的 |
|
|
|
|
|
- UID
- 147340
- 性别
- 男
|
我理解的中断接收过程是:
先进入中断接受,通过了所谓的硬件过滤了,从后台复制到前台,然后CPU会去读寄存器(就是执行读函数),并且将数据存放在RAM上,这个都能解释,也很好懂。但是,中断里面有个清楚RXF标志的操作,表明已经读取完毕了,要清空缓存,让新的数据进来。那这样不就是和先进入中断接受函数,再在执行读的操作矛盾了么,中断的最后是清楚标志,而我的理解是中断以后才去读数据,说明书上写得很清楚是RXF清零以后不能再读,防止数据不完整……
还在困惑中………… |
|
|
|
|
|