[DSP] 关于DSP28335CAN通讯远程帧调试求助!

[复制链接]
1469|4
 楼主| smile2196 发表于 2020-8-30 10:47 | 显示全部楼层 |阅读模式
在调试28335的ACN通讯中,在自响应模式下调试远程帧,想实现MBOX16向MBOX0发送远程帧并接收MBOX0发出的数据。在给接收邮箱的TRS16置位后,TA 端始终无法得到接收响应,程序卡死了。设置的是MBOX0和MBOX16分别为远程帧的传输和接收邮箱,MSGID分别设置为MBOX0:0xB5550093,MBOX16:0xD5550093。给MBOX0和MBOX16的RTR位也都进行了置位。想请教一下各位大佬,问题出在哪里了。相关的代码节选如下,请各位大佬帮忙指点一下!感谢!
  1. void main(void)
  2. {
  3.     Uint16  j;
  4.    struct ECAN_REGS ECanaShadow;
  5.    InitSysCtrl();
  6.    InitECanGpio();
  7.    DINT;
  8.    InitPieCtrl();
  9.    IER = 0x0000;
  10.    IFR = 0x0000;

  11.    InitPieVectTable();
  12.    
  13.     MessageReceivedCount = 0;
  14.     ErrorCount = 0;
  15.     PassCount = 0;
  16.    
  17.     // Configure the eCAN RX and TX pins for eCAN transmissions
  18.     EALLOW;
  19.     ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
  20.     ECanaShadow.CANTIOC.bit.TXFUNC = 1;
  21.     ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;

  22.     ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
  23.     ECanaShadow.CANRIOC.bit.RXFUNC = 1;
  24.     ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
  25.     EDIS;
  26.      
  27.     // Disable all Mailboxes
  28.     // Since this write is to the entire register (instead of a bit
  29.     // field) a shadow register is not required.
  30.     ECanaRegs.CANME.all = 0;

  31.     // Mailboxs can be written to 16-bits or 32-bits at a time
  32.     // Write to the MSGID field of TRANSMIT mailboxes MBOX0 - 15
  33.     ECanaMboxes.MBOX0.MSGID.all = 0xB5550093;
  34.     ECanaMboxes.MBOX1.MSGID.all = 0x95550094;
  35.     ECanaMboxes.MBOX2.MSGID.all = 0x95550122;
  36.     //中间代码略
  37.     ECanaMboxes.MBOX15.MSGID.all = 0x9555AAAF;
  38.    
  39.     // Write to the MSGID field of RECEIVE mailboxes MBOX16 - 31
  40.     ECanaMboxes.MBOX16.MSGID.all = 0xD5550093;
  41.     ECanaMboxes.MBOX17.MSGID.all = 0x95550094;
  42.     ECanaMboxes.MBOX18.MSGID.all = 0x95550122;
  43.     ECanaMboxes.MBOX19.MSGID.all = 0xD5550125;
  44.     //中间代码略
  45.     ECanaMboxes.MBOX31.MSGID.all = 0x9555AAAF;

  46.     // Configure Mailboxes 0-15 as Tx, 16-31 as Rx
  47.     // Since this write is to the entire register (instead of a bit
  48.     // field) a shadow register is not required.
  49.     ECanaRegs.CANMD.all = 0xFFFF0000;
  50.    
  51.     // Enable all Mailboxes */
  52.     // Since this write is to the entire register (instead of a bit
  53.     // field) a shadow register is not required.
  54.     ECanaRegs.CANME.all = 0xFFFFFFFF;

  55.     // Specify that 8 bits will be sent/received
  56.     ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
  57.     ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8;
  58.     //中间代码略
  59.     ECanaMboxes.MBOX15.MSGCTRL.bit.DLC = 8;
  60.    
  61.     // No remote frame is requested
  62.     // Since RTR bit is undefined upon reset,
  63.     // it must be initialized to the proper value
  64.     ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 1;
  65.     ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0;  
  66.     //中间代码略
  67.     ECanaMboxes.MBOX15.MSGCTRL.bit.RTR = 0;
  68.     ECanaMboxes.MBOX16.MSGCTRL.bit.RTR = 1;//发起远程帧

  69.     // Write to the mailbox RAM field of MBOX0 - 15
  70.     ECanaMboxes.MBOX0.MDL.all = 0x00;
  71.     ECanaMboxes.MBOX0.MDH.all = 0x00;

  72.     ECanaMboxes.MBOX1.MDL.all = 0x1111;
  73.     ECanaMboxes.MBOX1.MDH.all = 0x1111;
  74.     //中间代码略
  75.     ECanaMboxes.MBOX15.MDL.all = 0x9555AAAF;
  76.     ECanaMboxes.MBOX15.MDH.all = 0x89ABCDEF;

  77.     EALLOW;
  78.     ECanaRegs.CANMIM.all = 0xFFFFFFFF;

  79.     // Request permission to change the configuration registers
  80.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  81.     ECanaShadow.CANMC.bit.CCR = 1;            
  82.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  83.     EDIS;
  84.    
  85.     do
  86.     {
  87.       ECanaShadow.CANES.all = ECanaRegs.CANES.all;
  88.     } while(ECanaShadow.CANES.bit.CCE != 1 );  
  89.    
  90.     // Configure the eCAN timing
  91.     EALLOW;
  92.     ECanaShadow.CANBTC.all = ECanaRegs.CANBTC.all;
  93.     ECanaShadow.CANBTC.bit.BRPREG = 9;    // (BRPREG + 1) = 10 feeds a 15 MHz CAN clock
  94.     ECanaShadow.CANBTC.bit.TSEG2REG = 5 ; // to the CAN module. (150 / 10 = 15)
  95.     ECanaShadow.CANBTC.bit.TSEG1REG = 7;  // Bit time = 15
  96.     ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
  97.    
  98.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  99.     ECanaShadow.CANMC.bit.CCR = 0;            
  100.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  101.     EDIS;

  102.     // Wait until the CPU no longer has permission to change the
  103.     // configuration registers
  104.     do
  105.     {
  106.       ECanaShadow.CANES.all = ECanaRegs.CANES.all;
  107.     } while(ECanaShadow.CANES.bit.CCE != 0 );

  108.     // Configure the eCAN for self test mode
  109.     // Enable the enhanced features of the eCAN.
  110.     EALLOW;
  111.     ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
  112.     ECanaShadow.CANMC.bit.STM = 1;    // Configure CAN for ACK mode
  113.     ECanaShadow.CANMC.bit.SCB = 1;    // eCAN mode (reqd to access 32 mailboxes)
  114.     ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
  115.     EDIS;
  116.    
  117.     // Begin transmitting
  118.     for(;;)                                
  119.     {  
  120.        ECanaRegs.CANTRS.all = 0x0000FFFF;  // Set TRS for all transmit mailboxes
  121.        //ECanaRegs.CANTRS.bit.TRS3=0;
  122.        while(ECanaRegs.CANTA.all != 0x0000FFFF ) {}  // Wait for all TAn bits to be set..
  123.        ECanaRegs.CANTA.all = 0x0000FFFF;   // Clear all TAn
  124.        MessageReceivedCount++;

  125.        ECanaRegs.CANTRS.all = 0x0000FFFF;  // Set TRS for all transmit mailboxes
  126.        ECanaRegs.CANTRS.bit.TRS16=1;
  127.        while(ECanaRegs.CANTA.bit.TA16 != 1 ) {}  // 卡在了这一步过不去
  128.        ECanaRegs.CANTA.bit.TA16 = 1;   // Clear all TAn
  129.        ErrorCount++;
  130.     }
  131. }



 楼主| smile2196 发表于 2020-8-30 18:38 | 显示全部楼层
有做过CAN通讯这一块的伙伴们能探讨一下远程帧的工程应用吗?第一次做CAN开发,不是很理解远程帧要怎么用
airwill 发表于 2020-8-31 19:30 | 显示全部楼层
远程帧只是带远程帧特征位的无数据帧的报文, 如何处理是看你的上层协议怎么定义了
 楼主| smile2196 发表于 2020-8-31 19:49 | 显示全部楼层
airwill 发表于 2020-8-31 19:30
远程帧只是带远程帧特征位的无数据帧的报文, 如何处理是看你的上层协议怎么定义了 ...

能帮忙看一下另一个帖子里面的问题吗?我现在没有用自响应来调了,改用PC机和CAN分析仪直接调,但是出现了新的问题https://bbs.21ic.com/icview-3018974-1-1.html
 楼主| smile2196 发表于 2020-8-31 19:50 | 显示全部楼层
airwill 发表于 2020-8-31 19:30
远程帧只是带远程帧特征位的无数据帧的报文, 如何处理是看你的上层协议怎么定义了 ...

我现在主要是还不知道实现信息的远程请求要如何实现
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

19

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部