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.

CAN 通信 若干个邮箱优先级别问题

Other Parts Discussed in Thread: TMS320F28335

您好,我用的是TMS320F28335,我最近做的项目中包含如下的一下can总线通信系统:

  A -DSP中有2个邮箱,标识符分别为:0x8000FFFF   (发送邮箱);0x8FFFFFFF(接收邮箱)。

  B-DSP中与A对应的也有2个邮箱,0x8000FFFF   (接收邮箱);0x8FFFFFFF(发送邮箱)。

然后我是把A中的AD采样数据结果寄存器中的数字量发给B,用仿真器和B连接,来观察B对应的邮箱里的数据,观察接收是否正常。

把B中的一个数值常量整型25发送给A,让A稳定输出一25V电压值。

【问题是】,

一、如果让2个DSP中的上述的4个邮箱都工作时,用示波器观测can总线上的波形:木有任何波形,就是数据没有被传送;

二、如果分别让2个DSP中的2个邮箱,就是一个发,另一个DSP接收数据,是能正常工作的。

【我是这么想的】好像是 仲裁机制的问题,优先级高的一直在占用总线,而不会退出,优先级低的始终获取不了传送数据权限。

也不知道我这样认为对不对?您是怎么处理 在2块或者多块DSP,之间进行若干个邮箱之间进行数据通信的,怎么做才能让每个邮箱都有权获取总线特权,都可以实时的进行数据传输呢?

我的qq,1083176055@qq.com期待您的回复,谢谢。

  • TMS320F28335eCAN

    1、内嵌CAN控制器

    TMS320F28335内有2个增强型CAN总线控制器(eCAN),完全兼容CAN2.0B标准。

    eCAN模块的结构

    eCAN模块方块图及接口电路

    eCAN是具有内部32位结构的CAN控制器。eCAN模块由CAN协议核心(CPK)和消息控制器组成,消息控制器又包括三个部分:

    1)存储器管理单元(MMU),包含CPU接口电路、接收控制单元和计时器处理单元;

    2)邮箱RAM,可存储32个消息;

    3)控制寄存器和状态寄存器。

    CPK的功能是根据CAN协议解码所有在CAN总线上接收到的消息,并将这些消息转移到接收缓冲器中;根据CAN协议在CAN总线上发送消息。

    消息控制器的功能是决定由CPK接收到的任意消息,必须由CPU决定是否保留或者舍弃。在模块初始化阶段,CPU指定了程序使用消息控制器的所有消息标识符。

    消息控制器的另一功能是根据消息的优先级将要发送的消息传输到CPK

    计时器处理单元由定时计数器组成,用于在所有接收或发送的消息中添加一个时间标记。

    工作原理:

    1)当CPK接收到一个有效的消息后,消息控制器的接收控制单元决定该消息是否必须存储到邮箱RAM32个消息对象里。

    接收控制单元检查消息状态、标识符以及所有消息对象屏蔽寄存器,从而决定存放消息的合适的邮箱位置。接收到的消息被存储在通过接受过滤的第一个邮箱。

    如果接收控制单元不能决定由哪个邮箱来存储接收到的消息,那么该消息将被舍弃。

    2)当一个消息被发送时,消息控制器传送消息到CPK的发送缓冲器。

    在下一总线空闲状态时,开始消息的发送。

    当多条消息需要被发送时,在准备发送的消息中,具有最高优先级的消息将首先由消息控制器转移到CPK

    如果两个邮箱具有相同的优先级,那么具有更高序号的邮箱首先被发送。

    工作模式:

    eCAN模块由两种工作模式,SCC模式和eCAN模式。

    SCC模式是eCAN模式的简化功能模式,该模式只有16个邮箱(邮箱号0-15)可用;没有时间标记功能,可用的接收屏蔽寄存器数目也少。该模式为默认状态。

    工作模式通过寄存器CANMC的第13位(SBC)来选择。

    2eCAN模块的复用GPIO口设置

    两个eCAN模块AB对应的IO口设置有多种选择。

    模块A对应的IO口有GPIO30GPIO31GPIO18GPIO19两种选择。

    模块B对应的IO口有GPIO8GPIO10GPIO12GPIO13GPIO16GPIO17GPIO20GPIO21四种选择。

    IO口初始化时要注意一定要和实际的接口定义对应。

    TICAN例程中已经完整的给出了这些IO口的初始化语句,选择要使用的语句保留,不使用的语句注释掉即可。

    3CAN通讯波特率设置

    通过位时序配置寄存器CANBTC对通讯波特率进行设置。

    设置步骤:

    System clock f_sys = 150 MHz

    CAN clockf_can = f_sys / 2 = 75 MHz

    CAN clock periodt_can = 1 / f_can = 13.3333333 ns

    Actual bit rate = 1 Mbit/s

        Actual bit time = 1000 ns

    CAN bus length = 10 m, with 5 ns/m signal delay time.

    Propagation delay time : 2 * ( transceiver loop delay + bus line delay ) = 400 ns

    BRP reg = 4

    BRP = BRP reg + 1 = 55分频)

    CAN time quantum   tq = 5 * t_can = 66.6666667 ns

    Actual bit time = 15 tq = 1000 ns

    Prop_Seg = 8 tq > 400ns.

    Sync_Seg = 1 tq .

    Phase_seg1 + Phase_Seg2 = (158 – 1 ) tq = 6 tq

    Phase_seg1 = 3 tq; Phase_Seg2 = 3 tq

    1. If Phase_Seg1 + Phase_Seg2 is even, then Phase_Seg2 = Phase_Seg1. If the sum is odd, Phase_Seg2 = Phase_Seg1 + 1.

    2.  Phase_Seg2 should be at least 2 tq.

    Bit_time = Prop_Seg + Sync_Seg + Phase_seg1 + Phase_seg2 = 15 tq

    TSEG1 = Prop_Seg + Phase_seg1 = 11 tq

    TSEG1 reg = TSEG1 – 1 =10

    TSEG2 = Phase_seg2 = 3 tq

    TSEG2 reg = TSEG2 – 1 = 2

    具体参考TI的手册或者程序。

    4CAN通讯例子

    使用USBCAN卡和开发板进行CAN通讯。

    设置3个邮箱,两个发送邮箱(邮箱号24,25),一个接收邮箱(邮箱号26);

    发送邮箱24:用于发送两路ADC转换的结果值;

    发送邮箱25:用于持续发送固定帧;

    接收邮箱26:接收指定消息帧。

    5、小结

    本例只是一个简单的CAN总线收发程序,实现了CAN总线的消息收发。

  • 非常感谢您的回答,其中您提到

    【当一个消息被发送时,消息控制器传送消息到CPK的发送缓冲器。

    在下一总线空闲状态时,开始消息的发送。

    当多条消息需要被发送时,在准备发送的消息中,具有最高优先级的消息将首先由消息控制器转移到CPK

    如果两个邮箱具有相同的优先级,那么具有更高序号的邮箱首先被发送。

    那我是不是可以这样理解——“是不是优先级高的发完后,就会让低的发送,然后又开始优先级高的先发,优先级低的次之,轮流这样发送下去呢?意思就是,所有的邮箱都会发送,只是先后的问题呢?”Thanks.

    按理说,我的邮箱配置都是没有问题的,我的接收是按中断处理的,发送都是分别在2块DSP的主程序for(){    }里,2组邮箱的优先级肯定有高低之分,我感觉需分别对发送的程序进行配置 【定时发送】,用定时中断加到主程序里,让中断分时控制2个发送程序,这样优先级低的就有机会进行发送了,是不是这样呢?!