原创 CAN的识别码计算与数字隔离器AduM1201的CAN总线连接

2013-1-5 18:09 2793 17 19 分类: 消费电子

CAN的识别码计算与数字隔离器AduM1201的CAN总线连接

 

[CAN的识别码计算]

[说明]

1. 我们使用 MCP2510/2515 作为 CAN CONTROLLER 使用, 因此文中提及的 CAN 识别码的计算, 应指与 2515 的相应ID register 的设定. 

2. 之所以将这个不特别的问题, 在这里再次提出的原因是, 我们又怀着好奇的心理, 对另一款 CAN CONTROLLER, 即 SJA1000 的 ID register 进行了简单的熟悉. 那么与 MCP2515 的比较, 就变得明显而自然.

[SJA1000 的4个 Relative ID Registers]

我们以 D1, D2, D3, D4 称呼 SJA 的 4个 ID Register, 对于标准帧和扩展帧, 分别列表(From SJA datasheet):

 

Standard frame:

 

1.jpg

应对应 D1 D2

       Sample: 如设定 0x01 0x00, 故应计算得 ID = 8

       修改为 0x01 0x20, 应计算得 ID = 8 + 1 = 9

 

Extend Frame:

 

2.jpg

对应 D1 D2 D3 D4,

       Sample: 如设定 0x01 0x00 0x00 0x00, 故应计算得 ID = 0x200000

       修改为 0x01 0x20 0x00 0x00, 计算得到 ID = 0x240000

       修改为 0x01 0x20 0x80 0x00, 计算得到 ID = 0x240000 + 0x1000 = 0x241000

       修改为 0x01 0x20 0x80 0x10, 计算得到 ID = 0x241000 + 0x2 = 0x241002

 

[MCP2510/2515 的4个 Relative ID Registers]

我们能够用简单用 SIDH SIDL EIDH EIDL 来称呼可能在 TX/RX Register 中出现的这4个相关 Register, 更直观的例子是下表(From MCP2515 datasheet):

 

3.jpg

明显的, MCP2515 有着自有的 ID 定义(也应该注意的是, 在这4个 Registers 中, 往往不仅仅只定义了ID, 而且包括扩展帧 Ext 标识位, 或者远程帧 RTR 标识位).

我们用下列代码进行理解Reference: http://wenku.baidu.com/view/50f17ea6f524ccbff12184ec.html)

 

/*
 * mcp2510_write_can_ID
 *
 *  Description:
 *      Write CAN bus ID.
 *
 *  Parameter:
 *      address: register address
 *      can_id: ID returned
 *      Is<请自己删除>Ext: extend or standard ID
 *
 *  Return: 
 *      TRUE: extend CAN
 *      FALSE: standard CAN
 */
void mcp2510_write_can_ID(U8 address, U32 can_id, bool Is<请自己删除>Ext)
{
   U8 tbufdata[4];
        U32 canid = 0;
 
    if (Is<请自己删除>Ext) {
            // EID: [ID.28 - ID.18(used by SID)][ID.17-ID.0]
    can_id &= 0x1fffffff;                    // 29-bit
   canid = can_id & 0xffff;
            
            tbufdata[MCP2510LREG_EID0] = canid & 0xff;
            tbufdata[MCP2510LREG_EID8] = canid >> 8;
            canid = can_id >> 16;
            tbufdata[MCP2510LREG_SIDL] = canid & 0x03;
            tbufdata[MCP2510LREG_SIDL] += ((canid&0x1c)<<3);
            tbufdata[MCP2510LREG_SIDL] |= TXB_EXIDE_M;
            tbufdata[MCP2510LREG_SIDH] = canid >> 5;
    }   
   else{
            // SID: [ID.10 - ID.0]
            can_id &= 0x7ff;                        // 11-bit
            
            tbufdata[MCP2510LREG_EID0] = 0x00;
            tbufdata[MCP2510LREG_EID8] = 0x00;
            tbufdata[MCP2510LREG_SIDL] = ((can_id&0x07)<<5);
            tbufdata[MCP2510LREG_SIDH] = can_id >> 3;
   }
 
    mcp2510_swrite(address, tbufdata, 4);    // write ID to target address
 
}
 
/*
 * mcp2510_read_can_ID
 *
 *  Description:
 *      Read CAN bus ID.
 *
 *  Parameter:
 *      address: register address, which is 0x61 as RXB0SIDH
 *      can_id: ID returned
 *
 * Sample:
 *      RXB0SIDH(0x61)  RXB0SIDL(0x62)  RXB0EID8(0x63)  RXB0EID0(0x64)
 *      0x01            0x00            0x00            0x00
 *      If standard: 0x01 0x00 means 0x08
 *      If Extend: 0x01 0x00 0x00 0x00 means 0x00200000 ((0x08<<16)<<2)
 *
 *  Return: 
 *      TRUE: extend CAN
 *      FALSE: standard CAN
 */
bool mcp2510_read_can_ID(U8 address, U32* can_id)
{
   U8 tbufdata[4];
        
    mcp2510_sread(address, tbufdata, 4);                   
        //uart0_put((char*)tbufdata, 4);    // test
        
        // (tbufdata[0]<<3) -> handle RXB0SIDH to build SID10:SID3(bit10:bit3)
        // ((tbufdata>>13)&0x7) -> handle RXB0SIDL to build SID2:SID1(bit2:bit0)
   *can_id = (tbufdata[MCP2510LREG_SIDH]<<3) | (tbufdata[MCP2510LREG_SIDL]>>5);
    *can_id &= 0x7ff;
        
        // I am extend ID?
   if ( (tbufdata[MCP2510LREG_SIDL] & RXB_IDE_M) ==  RXB_IDE_M ) {
   // can_id = (SID10:SID0)EID17:EID16)
            *can_id = (*can_id<<2) | (tbufdata[MCP2510LREG_SIDL] & 0x03);
            // ((SID10:SID0)EID17:EID16))<<16
    *can_id <<= 16;
 
            // ((SID10:SID0)EID17:EID16))EID15:EID8)(EID7:EID0))
    *can_id += (tbufdata[MCP2510LREG_EID8]<<8) + tbufdata[MCP2510LREG_EID0];
 
   return TRUE;
    }
        
        // just the standard ID
   return FALSE;
}
 
[数字隔离器AduM1201的CAN总线连接]
[说明]
之所以要随手列出这个讨论议题的原因是, 我们在网络资源得到的电路图是错误的, 我们应该标记这个错误, 以避免同行在参考文献中迷失.
列出参考电路图(From http://wenku.baidu.com/view/eae20ad5c1c708a1284a4483.html): 

 

4.jpg

我们阅读了 1201 的文档, 直觉该电路图可疑, 方向怀疑颠倒(TX 和 RX 都颠倒). 该电路图中 ADuM1201AR 用于, 隔离 CAN CONTROLLER(如 MCP2510/2515), 以及 CAN DRIVER(如 PCA82C250).

为了确认我们的怀疑, 我们进入 ADuM1201 的 ADI 公司官方网页( http://www.analog.com/zh/interface-isolation/digital-isolators/adum1201/products/product.html ),

尽管在 datasheet 与 应用手册中, 都没有 1201 直接用于 CAN 总线隔离的实际例子, 我们仍然可以从 AN-770 application note pdf( Download from this webpage ), 找到两个1100 单独隔离的例子:

 

5.jpg

在该例子的比较下, 我们确认上述网络资源中的 1201 的电路图的连接错误, 图例中, 1201 的 PIN6, PIN7 应该交换(TX, RX 交换), 同理, 另一端连接 CONTROLL 的 PIN2与PIN3 应交换(RXCAN 与 TXCAN) 交换.

 

[补记]

在选用 MCP2510 与 MCP2515 的问题上, 常常给人带来迷思. 网络上曾经出现的大量资源, 都是 08 年左右的驱动 2510 的文章, 这让我们情不自禁选择了 MCP2510 的样品... 当然, 最后我们不得不换用 MCP2515 的过程, 产生了完全不必要的工程浪费. 

原因完全在于我们没有仔细比较两个 datasheet, 让我们简单看看吧:

[SPI of 2510 (From MCP2510 datasheet)]

 

6.jpg

[SPI of 2515 (From MCP2515 datasheet)]

 

7.jpg

在 3.3v 的工作电压, 以及更高工作温度的压力下, SPI of 2510 的通讯速度表现为 2.5MHz. 但是, 在阅读了网络大量的使用心得后, 两份不同的资料, 指明 2510 可能只能达到的最高速度为 1M 左右, 有人说是 1.3MHz, 有人说是 <1MHz.

当我们茫然地面对已经确认不可更改的 5.4MHz SPI 系统总线时(LCD屏显示需要较高速度), 我们不得不苦笑着用烙铁一根一根取下蜘网般的飞线, 并谨慎再次换上 2515 新样品(已经不想说买新样品和取货浪费的时间)``` 抬头看着窗外的斜阳, 我们的心情如同元旦期间出现在深圳的寒流般冷冰冰... 这是对一个工程师不勤于思考比较, 不作基础准备工作的惩罚咩?

 

Allen 作于深圳福田

发表于 <电子工程专辑>

 

 

文章评论2条评论)

登录后参与讨论

用户1602177 2013-1-6 15:48

感谢博主分享~~

allen_zhan_752827529 2013-1-5 18:21

以上列举的代码, 以及电路图, 均已在实际工程中验证. 实际工程中, 两个 CAN 节点, 使用 125KHz 通讯率, 连接线长 > 1.5m.
相关推荐阅读
allen_zhan 2023-02-27 19:08
对"三极管"译名由来的探讨
想讨论一个有意思的话题:今天中国大陆的电子业界, 为何将 BJT 称呼为 "三极管"? 或因其象形, 前辈自行进行随意的不严谨定义么? 带着疑问我们做了一下延伸查阅, 或得出这样的结论, 即中译名"三...
allen_zhan 2023-02-19 18:15
对知乎提问"为何三极管的一个PN结工作在反偏"的回复
将这个回复, 也发表在博文中, 作为自己的一个学习笔记叭.知乎问题: "三极管里面的PN结相当于二极管,为什么里面PN结加反向电压也能导通?"我的回复:首先, 二极管的"反向"概念, 容易给初学者某种...
allen_zhan 2023-02-18 10:17
从肖特基二极管到PN结与三极管
最近数个工作日的兴趣是回顾电子基础器件的发明/发展历史, 期待夯实技术基础的底蕴. 在学习与搜索资料的过程中, 顺便对知乎的一个同学的基础问题, 进行了回复. 不小心回复一下就成了千字文, 觉得挺有趣...
allen_zhan 2023-01-28 11:53
微功率 ISM 频率探讨相关文档组总结
不知不觉, 自开启关于微功率频率的话题起, 即从第一份文章写就到今天总结之日, 已经接近 10 个工作日左右. 早先的想法是对工程界未来的微功率设备相关项目, 从项目规划开始, 对选择系统, 频率, ...
allen_zhan 2023-01-27 22:50
关于 LoRa 应用场景的讨论
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. "第52号文" 对 470MHz 的约束引自 如下:(四)民用计量仪表限在建筑楼宇、住宅小区及村庄等小范围内组网应用,任意时刻限...
allen_zhan 2023-01-25 13:24
ISM 频段中 2.4G 与 5.8GHz 设备的使用与限制
说明: 本文中斜体部分表示来自公告文件的部分内容剪贴或合并整理.1. ISM 频段定义中的 2.4G 与 5.8GHz正如同 文中确定的, 2.4G, 5.8GHz 属于中国大陆 ISM 频段的定义...
我要评论
2
17
关闭 站长推荐上一条 /2 下一条