关于CAN总线的发送缓冲区

fanqieci 2012-12-25 04:16:13
最近在看can总线协议。发现有些问题想要求答案。
书上提到can控制器由3个发送缓冲器组成,每个发送缓冲器的长度是4个字,可以存放一个完整的can报文。
一个完整的报文应该由TFS,TID,TDA,TDB组成吧,就数据部分加起来就有8个字节了。另外两个部分加起来也有8个字节,这样合起来应该有16个字节吧?一个发送缓冲器怎么存放的下。
还有can控制器里有3个发送缓冲器,是不是这三个缓冲器存放的数据不一样?那数据的输入到底是有什么差别。三个缓冲器谁先发送应该和内部优先级有关吧?是不是在总线上还有一个优先级。就是不同节点竞争总线的时候会出现一个仲裁吧。这样一个数据发送就经过两次仲裁?
can的发送过程到底是什么样的。谁能给个答复。或者指引一条明路。我觉得好迷茫啊。
...全文
3782 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
booksyhay 2013-01-04
  • 打赏
  • 举报
回复 1
我最近在学习NXP的LPC1765,刚好可以解释你的疑问。 1,这款CPU的字长是32位的,每个字是4个字节,4个字就是16个字节,可以存放TFS,TID,TDA和TDB。即一个CAN帧的内容。 2,它只有一个接收缓冲区,却有三个发送缓冲区。这三个缓冲区的作用是一样的,我也觉得没有必须搞三个,只需要一个就够了。 下面先说一下,假如只有一个发送缓冲区时的发送过程。 先将要发送的CAN帧内容写入寄存器中,然后启动发送。 示例代码: pCANx->TFI1 = *(UINT32*)(&pFrame->stFrameInfo) & 0xC00F0000; pCANx->TID1 = pFrame->uiId; pCANx->TDA1 = pFrame->unData.auiData[0]; pCANx->TDB1 = pFrame->unData.auiData[1]; /*Write transmission request*/ pCANx->CMR = CAN_CMR_STB1 | CAN_CMR_TR; 操作完CMR寄存器后,并没有发送完成,甚至还没有开始发送。 就像去医院看病,此时还只能算是挂了个号,前面还要排队,排到你了如果医生有优先级更高的病人你还得等待。 这时硬件开始尝试向总线发送数据。首先是仲裁过程,需要根据总线上的状态及其他MCU发送帧的ID来判断。 如果仲裁失败,等一下再重试。直至发送成功。 这里涉及到一个优先级问题,根据CAN协议的规定,仲裁过程中ID小的优先级高。 再来说有三个发送缓冲区的情况。 假设现在总线上很忙,程序中又连续请求三个发送缓冲区,那么CPU怎么处理呢? 当然首先得等到总线上有空闲,然后,再根据TFI中的优先级来决定先发送哪一个。
yklaochen 2013-01-03
  • 打赏
  • 举报
回复
先别管3个发送缓冲器,只用1个。每个缓冲器都有8个数据寄存器,每次可以发送8个字节的数据,8个数据寄存器 赋值后,启动发送,数据就由硬件自动发送了。由于数据发送很慢,相对于赋值的时间来讲,所以启动1个发送缓冲器后还有数据等待发送时,就不必等待一帧数据发送完,可以讲剩余的数据直接赋值到另外2个发送缓冲器,硬件就自动按照优先级自己发送了。总线总裁是硬件自动完成的,可以不考虑,而且总裁不占用发送时间,是靠标示符的不同由硬件自动判断的。
rejoice818 2012-12-28
  • 打赏
  • 举报
回复
用什么MCU?CAN协议也有几种,做什么产品的呀?
yisiyou 2012-12-27
  • 打赏
  • 举报
回复
上位机下位机一致性
AnYidan 2012-12-26
  • 打赏
  • 举报
回复
优先级比较要看具体的协议,我没有看到具体的规定,但总线上只能有一条message, J1939 的每条 essage 都有 优先级设置,但总线仲裁应该是根据 id
fanqieci 2012-12-26
  • 打赏
  • 举报
回复
引用 1 楼 AnYidan 的回复:
4个字,一个字 = ?bytes 1 transmit buffer 可以放一个完整的 can message, 每个 transmit buffer 中的内容不一样,你可以同时放3个 messages, 之后依次发出,也可以检测哪个transmit buffer 为空,在其中放入 message.... 先看 manual, 后看 source c……
那这三个buffer发送前是不是要进行优先级比较呢。如果CAN总线上还有其他的CAN控制器,那么两个CAN控制器是不是还要进行优先级仲裁。双重比较?
palleexu 2012-12-26
  • 打赏
  • 举报
回复
总线上同时只能有一个优先级最高的ID进行发送的,看哪个节点的(发送或接收)ID优先级最高了
風輕雲淡 2012-12-25
  • 打赏
  • 举报
回复
看看DataSheet
AnYidan 2012-12-25
  • 打赏
  • 举报
回复
4个字,一个字 = ?bytes 1 transmit buffer 可以放一个完整的 can message, 每个 transmit buffer 中的内容不一样,你可以同时放3个 messages, 之后依次发出,也可以检测哪个transmit buffer 为空,在其中放入 message.... 先看 manual, 后看 source code

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧