This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好,
我是CAN总线的初学者,更广泛地说,我是数字通信的初学者。
我已经阅读了有关CAN的F2.8379万d手册,我已经了解了一些内容,但我无法理解使用该模块的最佳方式。
我知道32个邮件对象及其配置,但如何使用它们?
想象一下:我有一台计算土豆和胡萝卜的机器(每台5字节……大量蔬菜!!) 而且,主中继器必须要求它知道数量和机器状态(1个字节表示故障)。
什么是最佳配置:1个TX消息对象填充了6个字节(1+5个土豆编号)或(1+5carROTTES编号),1个RX消息对象保存在不同的中,注册不同的值(变量msg ID)?
还是2个TX消息对象(每个要发送的值对应1个)和2个RX消息对象(对应于2个TX消息对象)?
或其他方式?
如果有多个msg对象,节点如何知道哪个对象读取? 在环回示例中,这很容易,因为CAN核心会将消息发送给自己(而且在同一代码中),但是当总线上有32个不同的消息对象和50个节点时,如何使用CANMessageGet函数。
另外,在环回示例中,发送和接收功能之间有一个次级延迟:这是否意味着即使CAN模块没有读取收到的消息,也会将其存储到下一次发送?
最后,是否所有节点都需要具有相同的消息对象配置?
我对所有这些问题都很抱歉,但他们真的可以帮我。
非常感谢,祝您度过美好的一天,
热雷梅
您好,Jeremy:
您可以为TX或RX配置所有32个CAN消息对象,也可以配置10个TX消息对象和22个RX消息对象的组合,或其任意组合。 请注意 ,一个消息对象可以保存最多8个字节的数据,这些数据可用于TX或RX。 32个消息对象可以表示大量数据。
对于你用的蔬菜柜台,假设你有50台机器,计算土豆和胡萝卜。 这50台机器将全部连接到CANBUS,以组成50个节点(如果您添加另一个节点,仅监控或接收来自蔬菜计数机的数据,则为51个节点)。 可以为每台机器的马铃薯计数分配1个TX消息对象,为胡萝卜计数分配另一个TX对象。 您决定将8字节中的5字节用于计数,并且可以将其余3字节用于其他目的 (如故障 或状态代码)。 每个消息对象都有其唯一标识符。 在CAN中,这通常称为仲裁ID,它是识别 或关联消息对象的一种方法。 默认情况下,仲裁ID为11位字段(但如果使用扩展选项,则有一个选项可扩展此29位)。 在蔬菜计数示例中,您可能需要为每个计数机分配唯一ID, 假设您选择使用标准arbID宽度11位,并使用机器编号的上8位和下3位 来保存所计数蔬菜类型的信息(马铃薯为001,胡萝卜为010,等等) ,这样:
机器计数器1: 马铃薯计数器的ARB ID = 0000 0001 001
胡萝卜计数器的ARB ID = 0000 0001 010
机器计数器 2: 马铃薯计数器的ARB ID = 0000 0010 001
胡萝卜计数器的ARB ID = 0000 0010 010
等等
当所有机器都准备好传输蔬菜计数数据时,您可以为所有50台机器相应地定义2个TX消息对象,填充5个字节的计数器和3个字节中的其余部分,以用于故障代码(或某些其他状态数据) 并通过上面定义的arbID相应地标识这些对象。 对于监控CANBUS的节点,所有唯一的消息对象都将可用。 CAN具有arbID的掩码选项,因此您可以将其设置为仅从特定机器接收数据(例如,如果您只想 从机器32接收胡萝卜计数数据) 通过在《技术参考手册》的CAN部分中讨论的掩码/过滤选项。 如何使用邮件对象实际上是由应用程序决定的。 我刚才用 您的例子说明了一种简单的方法。
希望这有助于说明消息对象的使用。
此致,
约瑟夫
您好,
非常感谢您的准确回答,对我来说更清楚了。 让我补充一下我的情况:我们仍然有蔬菜机器,每种都有2个TX味精(如Joseph建议的),但现在我们有一个监控机器,可以发送每种蔬菜的开始/停止顺序和数量设定点(每帧6字节)。
蔬菜机只能与监控机通信,而不能在它们之间通信。
在监控机器上,我是否需要为 每台机器的每种蔬菜类型创建TX消息对象(本例中为2个具有固定ARB ID的机器)? 还是每种蔬菜仅2个TX消息,且ARB ID可变,用于寻址机器?
在补码中,我需要添加两个RX msg来接收来自蔬菜机器的数据,对吗? 是否需要远程/传输对象帧?
在RX消息对象中,ARB ID包含收发器ID,而在TX消息中,它包含收件人ID -我对此赠方/收件人概念有问题。
我对我的初学者问题感到抱歉,但我认为基本情况可能会让我们放弃,
再次感谢您的帮助,祝您度过美好的一天。
此致,
热雷梅
您好,Jeremy:
有多种方法可以使用您的主管机实施扩展示例。 您指出的两个选项都适用(每台机器每种蔬菜类型的TX消息或每种蔬菜类型具有可变ARB ID的2个TX消息对象)。 同样,这确实取决于您要如何编写应用程序代码。
我认为更有效的方法是首先定义您的系统所需的参数,例如主管和计数机的具体任务,每种类型的蔬菜计数限制是什么, 或者,如果您希望某些机器输出特定数量的蔬菜,或者如果每台机器都具有统一的输出量。 您可以在系统启动过程中从超级定位程序传递这些初始参数。 您可以通过固定的ARB ID为每种蔬菜类型的停止计数传递来自主管的广播消息(TX消息),也可以将此信息封装到单个TX对象的8字节消息中,或者另外, 您还可以单独传输特定机器的特定停止计数。
在系统启动过程中, 计数机器不会继续其计数任务,除非收到来自主管的初始参数,因此您可能在计数机器中有多个已定义的RX对象,这些对象没有消息筛选器 (意味着他们将接收来自主管的消息,该消息适用于CAN总线中的所有节点)。 另一个RX对象将允许筛选,以便特定机器仅接收来自主管的特定数据包。 您还可以在主管/机器中定义一个消息对象,将传输的数据与特定任务相关联,例如请求有关当前 蔬菜计数的信息,状态检查(空闲/忙碌/机器停机等)或强制停止或重新启动计数序列。 一旦这些信息通过CAN总线从监控器传递到机器,就可以开始计数。
另外,请注意CAN通信中一个非常重要的方面,这使其成为处理消息流量的有效方式,即仲裁。 Hareesh在下面提供的链接中可能会介绍这些内容(我强烈建议查看这些内容)。 CAN通信中的仲裁是一种管理哪个节点在通过CAN总线传输数据时获得优先权的方法。 仲裁ID最低的节点 首先传输其数据。 同样,回到 蔬菜计数系统的示例,最好分配 节点中编号最低的主管的ID,这样当它传输数据时,它将始终优先于其余机器。
至于远程帧,我不认为系统中有必要使用您提供的示例,但您可以像某种消息一样使用它,将其作为从计数机开始运行的一些时间间隔传输。
如果 有多个节点 同时传输,TX消息对象中的ARB ID将指示节点何时可以传输的顺序(最低的ARB ID最先传输,最高的ARB ID编号最后传输)。 在消息接收过程中,ARB ID可与消息过滤相关联(如果设置了umask,则仅接收与RX对象中定义的ARB ID相同的已传输消息)。 手册中将详细介绍这些内容。
希望这有助于...
此致,
约瑟夫
您好,Joseph:
谢谢你的回复,很抱歉我迟到了,我尝试实施CAN BUS,不要问愚蠢的问题……但它没有赢!!
您的最后一条消息再次帮助我,我现在正在处理代码示例。 现在,让我们省去蔬菜(在现实生活中,我必须与许多他们拥有自己的状态机和大约20个设定点,标志,输入/输出的整流器进行交流)。
我已经从CCS示例开始,并尝试制作自己的。 我正在处理F2.8379万D启动板。
在CCS示例中,我不了解什么:为什么两个msg对象具有相同的msgid? 如果我已正确理解,消息ID是消息对象的n°(1-32),ID掩码是仲裁,对吗? 此外,msg声明和CANSetmessage函数中的msgid也不同(1和2)。 我不理解逻辑。
然后我尝试实现我自己的代码:我正在使用CAN A和CAN B,它们由两个MCP2551组成。 Cana send和"开始顺序"(msgData[0]的0或1)和CANB应读取此顺序。 我正在通过UART将其显示在控制台中。
目前,我可以发送消息(并通过示波器读取帧),但CANB看不到任何内容。
我想我还有一个基本配置问题,你能帮我吗?
再次感谢您的精确支持!!
热雷梅
您好,Jeremy:
很高兴听到您终于在处理CAN代码示例。 您似乎设置正确,但只需确保我的以下假设正确:
您正在使用外部传输示例,因为您已使用CAN收发器连接2个CAN模块
您已为要使用的CAN-A和B RX/TX引脚正确分配GPIO配置
对于以下有关示例的问题:
为什么两个消息对象具有相同的消息ID? 在示例中,请注意ui32MsgIDMask设置为0。 这意味着消息ID不涉及掩码。 在这种情况下,接收者必须匹配来自传输对象的确切ID。 如果将IDMask设置为其他内容,则将应用消息筛选。 根据屏蔽的位数,可将接收器配置为从符合屏蔽标准的TX消息ID接收数据。
如果我理解正确,消息ID是msg对象的n*(1-32),ID掩码是仲裁,对吗? 元素ui32MsgID是消息ID或仲裁ID。 这是节点标识时使用的唯一ID。 在此示例中,代码ui32MsgID与消息对象编号(1到32)不同。 消息对象将是CANMessageSet(Cana_base, object#,…中的第二个参数。 和CANMessageGet (Cana_base,object#,…)。
在您的硬件配置中,您是否在CANA中传输数据,在CANB中接收数据? 在这种情况下,您需要将CANMessageGet的代码更改为CANMessageGe (CANB_BASE,2,&sRXCANMessage,TRUE),并确保为CANB配置了正确的GPIO引脚。 这可能是CANB未接收数据的原因。
此致,
约瑟夫
您好,Joseph:
再次感谢您的回复。
要回答您的问题:
"
您正在使用外部传输示例,因为您已使用CAN收发器连接2个CAN模块
这是一个回放示例,我已修改了代码,用于我自己的测试。 CANA向CANB发送消息(8字节,但我只使用一位)。
您已为要使用的CAN-A和B RX/TX引脚正确分配GPIO配置
是的,我正在使用GPIO6-7 (CANB)和18-19 (Cana) 2.8379万D启动板(输入为异步,PushPull中为输出)
对于以下有关示例的问题:
为什么两个消息对象具有相同的消息ID? 在示例中,请注意ui32MsgIDMask设置为0。 这意味着消息ID不涉及掩码。 在这种情况下,接收者必须匹配来自传输对象的确切ID。 如果将IDMask设置为其他内容,则将应用消息筛选。 根据屏蔽的位数,可将接收器配置为从符合屏蔽标准的TX消息ID接收数据。
如果我理解正确,消息ID是msg对象的n*(1-32),ID掩码是仲裁,对吗? 元素ui32MsgID是消息ID或仲裁ID。 这是节点标识时使用的唯一ID。 在此示例中,代码ui32MsgID与消息对象编号(1到32)不同。 消息对象将是CANMessageSet(Cana_base, object#,…中的第二个参数。 和CANMessageGet (Cana_base,object#,…)。
好的,我将尝试不同的配置,以便完全理解它。
在您的硬件配置中,您是否在CANA中传输数据,在CANB中接收数据? 在这种情况下,您需要将CANMessageGet的代码更改为CANMessageGe (CANB_BASE,2,&sRXCANMessage,TRUE),并确保为CANB配置了正确的GPIO引脚。 这可能是CANB不接收数据的原因。"
我认为它适合GPIO和HW,我还测量了每个模块的RX TX和CANH-CANL电压,在示波器上,它看起来像具有正确电平的帧。
我仍然无法使用CANB读取帧。 我有一些奇怪的事情,当我使用GetMessage函数时,RX对象的msgLen被擦除并置于0:
您是否知道原因? 我的问题可能是由于错误类型的转换/消化?
我还尝试了许多标志(除了"MSG_OBJ_NO_FLAG"),结果与我不能更改msgRXdata (或MsgDataCANB[0])相同。 我会尝试中断,但我不确定是否能解决我的问题。
编辑:我是从这两个例子中得到启发的,你看到什么是完全的无正常的吗? (除了寄存器/常量不同,因为它不是同一个组件)
https://e2e.ti.com/support/microcontrollers/tiva_arm/f/908/p/37.6339万/1324292</s>132.4292万
感谢您的支持,祝您度过美好的一天。
此致,
热雷梅
您好,Jeremy:
根据您之前的帖子,您表示您正在使用MCP2551收发器将数据从Cana传递到CANB,因此我想确认使用了外部传输示例代码。 环回示例是一项测试,用于确认发送到TX引脚的内容是否在同一CAN模块的RX引脚中接收。 这就是您在CANB上看不到任何内容的原因。 您应使用外部传输示例,因为这 将演示您要尝试完成的任务。 外部传输示例显示了两个CAN节点如何 处理CAN总线上的数据。 第一个节点是CANA通过CAN RT/TX引脚连接到MCP2551收发器 ,第二个节点是CANB 通过CAN RT/TX引脚连接到第二 个MCP2551收发器与CAN总线。 两个收发器均连接至CAN总线 和CANL/CANH线路。
外部传输示例应适合您。
此致,
约瑟夫
您好,Joseph:
感谢您的快速回复。
我已经解决了这个问题,事实上有两个:首先我的主板在一个MCP2551 +5V引脚上接触不良,我使用的是包含ADC,PWM和其它外周的“全局”代码... 您说得对,GPIO配置错误,CAN配置良好,但PWM配置是在...之后调用的。 白痴的错误!!
感谢您的支持,下一步是深化和掌握msgid,掩码ID和状态中断。 如果我还有其他问题,我会回到我的岗位:)
谢谢,祝您度过美好的一天!
此致,
热雷梅
Jeremy,
每个消息对象只有一个掩码。 根据您设置掩码的方式(换言之,您写入的掩码"值"),您将能够接收一组满足掩码筛选条件的MSGID。
是否可以为度量值创建一个消息对象,为具有不同掩码的设定点创建一个消息对象,以了解传输/接收了哪个度量/设定点?
是的,这是可能的。
此外,我想添加大量信息,如Emiter,Receiver,broadcasting或not (例如,对所有计算机进行setpoit刷新或stop),是否可以通过多个掩码+ID过滤? 或者我是否有义务使用数据帧?
这个问题太具体,我很遗憾不能准确回答。 正如前面的文章中提到的,您最了解您的应用程序,因此您可以更好地使用模块的功能来满足应用程序要求。 我很乐意澄清有关本模块中任何特定位/寄存器/功能的问题。 我不太理解您的问题“我是否有义务使用数据帧?”。 数据帧是在CAN节点之间传输数据的唯一机制。
如果您需要深入了解"接受掩码过滤"的工作原理,我建议您下载app.note http://www.ti.com/lit/an/spra876b/spra876b.pdf并查看LAM.C.示例 如果您安装了c2000ware,则应在C:\ti\c2000\C2000Ware_1_00_01_00\device_support\F2833x\examples\CAN_LAM目录2000目录中2833中看到它。 (您可能需要编辑路径以反映您拥有的c2000ware版本)。 请注意,此app.note是为早期C2000器件中的eCAN模块编写的,而不是为您正在使用的DCAN模块编写的。 但是,掩码/过滤概念非常相似(唯一的例外是,与DCAN相比,掩码位在eCAN中的作用相反)。 该代码示例经过了很好的评论,并清楚地说明了筛选的工作方式。 DCAN的类似app.note也在计划中,但时间表目前并未冻结。
另一种情况是,最好是打开一个新帖子,而不是在旧帖子中添加更多问题,尤其是当新问题与您的原始帖子无关时。 否则,想要回答您最后一个帖子的人可能会试图阅读原始帖子,但却意识到您的许多旧问题已经得到回答。
说明:您需要安装app.note附带的zip文件,以便查看我引用的示例。 这些示例应安装在C:\TI\C2000\C2000Ware_1_00_01_00\DEVICE_support\F2833x\examples中2000中。2833。 我附上了该测试案例,以防您不想安装示例代码。
Jeremy,
我很遗憾,我仍然不明白您对"如果我使用一个msg对象,那么对于三种不同的度量,只有一个掩码,我是否有义务选择一个带数据帧的掩码?"这一问题的关注点。 数据帧是CAN协议中最常见的帧。 数据帧是数据从一个节点传输到另一个节点的方式。 如果您不使用数据框架,您还会如何移动数据? 您是否可以重新表述您的问题?
Hareesh,您好!
没问题,我知道数据是通信的基础,但我的所有帖子都是关于仲裁的。 我已经谈到数据帧作为仲裁的补充:
例如,我使用一个消息对象在三个不同的CAN帧上发送三个浮点数。
消息对象n°17
消息ID:0b1.0101万010101</s>1.0101万
数据帧(5字节) : 数据[4] | 数据[3]-数据[0]
使用: 度量类型 | FloatValue
接收邮件对象n°17时:
IF (data[4]== 0.0001万){
Xposition =浮点值;
}
否则,如果(ddata[4]== 0.001万){
Yposition =浮点值;
}
否则,如果(data[4]== 0.0011万){
Zposition =浮点值;
}
就像这样,只有一个邮件对象,我可以发送三个不能在一个框架中发送的不同值。 这就是为什么我把数据帧称为仲裁扩展的原因。
您对这种方式有何看法?
谢谢!
热雷梅
Jeremy,
在CAN协议上下文中使用的"仲裁"(或更准确地说,MessageID的非破坏性,按位进行仲裁)具有完全不同的含义。 我们仅在两个或多个节点尝试同时启动传输时解决总线上的争用时使用该术语。 话虽如此,你所概述的似乎是一种可行的办法。 但是,您知道有许多方法可以对应用程序进行编码。 虽然我很乐意帮助您解决您在设备上使用模块的特定位/寄存器/功能时遇到的困难,但我帮助您如何对应用程序进行编码的能力相当有限。 感谢您的理解。