有谁用C8051F506做过CAN通信?我要实现只发送不接收不成功

[复制链接]
 楼主| yugen 发表于 2010-4-25 10:08 | 显示全部楼层 |阅读模式
我要用C8051F506实现只发送不接收,只能由计算机上的CAN卡来接收,而不能被CAN总线上的其他设备(CAN上只有这种设备和计算机CAN卡)接收。这样,若计算机不接收或网络故障时,设备就会阻塞,从而有指示灯指示发送故障。现在的情况是,若CAN上只有两个同样的设备时,其中一个发送会被另外一个确认了。请教大家,怎么实现只发送而不接收任何报文呢?
我的初始化程序如下:
  1. /// <summary>
  2. /// 初始化CAN
  3. /// </summary>
  4. /// <returns></returns>
  5. void Init_Can(void)
  6. {
  7.     uint8_t i;
  8.    
  9.     SFRPAGE   = CAN0_PAGE;

  10.     CAN0CN |= 0x01;        // Start Intialization mode
  11.     CAN0CN |= 0x4E;        // Enable Status, Error,    Module Interrupts,  Enable access to bit timing register
  12. //    CAN0BT = 0x5CCF;       //Based on 16 Mhz CAN clock, set the CAN bit rate to 50kbps
  13.     CAN0BT = 0x5CCB;        //12Mhz CAN clock, set the CAN bit rate to 50kbps
  14. //    CAN0BT = 0x49C7;       //125K
  15. //    CAN0BT = 0x49C3;       //250K
  16. //    CAN0BT = 0x49C1;       //500K
  17. //    CAN0BT = 0x49C0;       //1M,不用
  18.     CAN0IF1CM = 0x00F0;       // Write Operation, Transfer ID Mask, MDir, MXtd, Transfer ID, Dir, Xtd,
  19.                            //MsgVal,  Transfer Control Bits, Don't set TxRqst or transfer data
  20.     for (i = 1; i <= 32; i++)
  21.     {
  22.         // Set remaining message objects to be Ignored
  23.         CAN0IF1A2 = 0x0000;              // Set MsgVal to 0 to Ignore
  24.         CAN0IF1CR = i;                // Start command request
  25.       
  26.         while (CAN0IF1CRH & 0x80) {}     // Poll on Busy bit
  27.     }

  28. //即使将下面这个for()注释,也即所有32个message object设置为无效,也不能阻止接收
  29.     for (i = 1; i <= MAX_MESSAGE_OBJ; i++)
  30.     {
  31.         CAN0IF1M1 = 0xffff;    // 29位ID
  32.         CAN0IF1M2 = 0xffff;    // Enable Extended Identifier for filtering, Used Direction bit for filtering, Use ID bits 28-0 for filtering
  33.         CAN0IF1MC = 0x1880 | 5;  // Enable Transmit Interrupt, Message Object is a Single Message, Message Size set by #define
  34.         CAN0IF1A1 = DeviceID;
  35.         CAN0IF1A2 = 0xe000 | (DeviceID >> 16);//Msgval为1
  36.         CAN0IF1MC = 0x0880 | 5;
  37.         CAN0IF1CR = i;
  38.         while (CAN0IF1CRH & 0x80) {}      // Poll on Busy bit
  39.     }
  40.    
  41.     CAN0CN &= ~0x41;                       // Return to Normal Mode and disable
  42.                                        // access to bit timing register
  43.     SFRPAGE = ACTIVE_PAGE;
  44. }



}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

35

帖子

0

粉丝

7

主题

35

帖子

0

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