精华内容
下载资源
问答
  • 字号:大中小订阅调试好的can总线程序(c语言)//**********程序功能************************************************//节点1向CAN节点2发送数据,数据的头两个字节分别是:节点1的ID和要求节点2回复的数据长度//节点2...

    字号:大中小

    订阅

    调试好的

    can

    总线程序(

    c

    语言)

    //**********

    程序功能

    ************************************************

    //

    节点

    1

    CAN

    节点

    2

    发送数据

    ,

    数据的头两个字节分别是

    :

    节点

    1

    ID

    和要求节点

    2

    回复的数据长度

    //

    节点

    2

    收到节点

    1

    的信息后

    ,

    立即按照节点

    1

    的要求回复数据

    i nclude

    i nclude

    //SJA

    存储器定义头文件

    i nclude

    //SJA

    子程序文件

    i nclude

    //

    显示头文件

    i nclude

    //

    字符串函数

    //***************************

    头文件

    ***************************************************//

    void Init_Cpu(void);

    //

    初始化单片机

    void Sja_1000_Init(void);

    //

    初始化

    SIA

    //************************************************************************************

    bit s;

    //

    配置

    sja

    标志

    bit flag_send;

    //

    发送命令标志

    unsigned char data a[5]={0x05,0x05,0x05,0x05,0x05}; //

    显示

    "5"

    unsigned char b[5]={0x12,0x12,0x12,0x12,0x12};

    //

    显示

    "p"

    unsigned char c[5]={0x01,0x01,0x01,0x01,0x01};

    //

    显示

    "1"

    unsigned char data

    send_data[10],rcv_data[10];

    //

    发送和接收数组

    unsigned char bdata flag_init;

    //

    保存中断寄存器值

    unsigned int count_k;

    //

    延时记数用

    sbit rcv_flag=flag_init^0;

    //

    接收中断标志

    sbit err_flag=flag_init^2;

    //

    错误中断标志

    //***********************************************************************************//

    void main(void)

    {

    s=0;

    //

    配置

    sja1000

    出现错误时

    ,

    重新初始化

    do{

    Sja_1000_Init();

    }while(s!=0);

    Init_Cpu();

    //initialize mcu

    flag_init=0x00;

    //

    保存中断寄存器值清零

    while(1)

    {

    if(rcv_flag)

    //if there is receive interrupt

    {

    rcv_flag=0;

    //

    接收标志位清零

    BCAN_DATA_RECEIVE(rcv_data);

    //

    接收数据

    展开全文
  • CAN总线PPT分析1、车道偏离预警系统2、自动泊车技术3、车联网——杰德智能屏系统4、汽车自适应巡航简介5、车联网————沃尔沃Sensus系统6、丰田3种四驱形式解析7、BMW Gran Coupe四门跑车家族新成员 全新物种BMW 2...

                     CAN总线PPT分析

    301744f4d76d40b5dae8ca3a424d7e6e.png

    9235fda66700b6e0a69f881fa212c003.png

    51f3d8bba842617d8309bdb6f210b123.png

    021787f3e77f7e21c5a36bb6c1b3ab8e.png

    355c8e15110bef042e299361ca8a12c1.png

    07e446c1fa217b3b1b9d2f62fe4a3a51.png

    1f189c7b59d745f4bd70d3f1163cb9cc.png

    d3667acb154e39cefc2d057760c8c96f.png

    c68aa1097349aa053ebe87d9301d9497.png

    d14455ba52eec9288677ce40f7d88f2a.png

    9025ac7277357f44d25dccf53ea2c341.png

    a81cbfa090de988996c5f31f8af5138e.png

    27c1eeb72985035e6bc05287ea101a2e.png

    73c02531d65718e5835ad61491e2b082.png

    aaa963f2a4abe3caaca0254b291f051b.png

    358ac66382fb9d4415c8fc67a2401d7b.png

    badb0c753ef6c1302765e5f660bce33b.png

    66e5ea74fe0055db69c7fbe7cf5c08eb.png

    a7b33c6f4eb6df778e0493c99bc84926.png

    eafbefaca3ff2644ac57adbdb13d0916.png

    c6a8fed1dac5b2df01594fc003623a52.png

    c1e309a2654526667bd6ffdfacf78d38.png

    f0add6219f459dc84eb9af91193b80d6.png

    e76e58342eb1a3cbf400d8191f5407fe.png

    f1ab76a8470c0ca5739a8d645dcd6442.png

    5a66087cbcfa35f1e3b1f47c0e67612e.png

    e7d2987f8dda20afb759fa8b4937bdab.png

    aa9f9fbdee87c966f0f7735378cc2eab.png

    359a5fc40002fbeb263dd495afa20607.png

    e1b49cc3b4410d587d04735b585ea294.png

    17e124268324781ead53efb26b08c8f2.png

    ff14a0403dcd8f3b218f59fba80a8ebd.png

    499ed63c73337a0ab4ba801cc5d89d47.png

    1a4978db5aa0dd5153fd13431a58d079.png

    2234b1f3a384843cbf83d47df12acd17.png

    af4d67c8c79a5a6707a38ff2a01af707.png

    26dc3fa51656a89711b888e017db04f1.png

    6699f59dce7203dc4ad6c2dd77dc3b49.png

    b1e7cca1301677dd09b161bced0ec483.png

    a0bfc60049d01cef67776ab5b01d6f5e.png

    9cf80bad95ea8ab1bf78bb7aa545c1c9.png

    5eef2df507f6f02e551de4425107bd93.png

    5435d2fc4fcc053910450e9f76a1a7bb.png

    7e8abe7f5c26b0e8df9f027e561cda73.png

    64a5ef9b905e63089afc81ff2becaa34.png

    43b32d9b44a4d8f0e1c763e486115f67.png

    86b13d7a3ca3dffef116eddeb3a809f8.png

    fc610e3e6a9763e96201a22dfe16502f.png

    cc1439c21a246f4f4a5df3d2a78ec330.png

    45332640cad923b951da9bb930a6495c.png

    7e8195340cf45f67ec2000b61b04fa6d.png

    8328f5179169af49a14bcd687458e6ce.png

    075a22a02f4995f05fc00e735ae6287b.png

    4440d2f41adee9b74c77ddff345935d2.png

    a619dfcb48d1b39c340beefc34b77b0d.png

    07b6b963cb76131cb11157465fcc30b5.png

    206d911590060f67b4058d63db58e831.png

    1a0c0ae990e5da1c7d0cacd71ccd56a7.png

    9737a5e638ca104dbbf6aa8fb44bd32b.png

    97a58fbd4044a71620ca0946b601c4de.png

    fde8bcb3705443703f79a33a2783936c.png

    a339a65afb74919efcd3886446e4436f.png

    d37dd795c6f083faa2e6ebfb156eb4c8.png

    d559313f557029cac64faabccdfe7834.png

    2b47f49cdd860f16f14f999c5b775c36.png

    fb2f66ed119f7b85514d4d06e1a72223.png

    3b67aa7d02ba9410b035b480f952c4e2.png

    2326800cac788660ed61d3eea69a64fd.png

    c8ffa406a9fb49f5b2215ee567055a25.png

    36c17df6fb9e6e5b4deb3831798b586c.png

    d18b43d48a95cc73afd76189d6128c0f.png

    8eda72e3a8ec8ad2b3e5bf806fdabf8d.png

    525477186f3e04ea7c9e9f7bb45f0d2a.png

    4b00aacbc9e80b6f566ceaf9286c5d71.png

    e9e3407739e41e5320a12df814108807.png

    06b51865abb691a1568dc123701af05b.png

    5a3284865d210a5c5f9ebf191c99cc94.png

    7b943cd9e23164e409a98d753d8fb9ff.png

    af7897fd9918b2196f3120050868061e.png

    f54992263e0c7690a682950fe30cac86.png

    3fbaee74045c6e4d616d58a949d545c1.png

    4563b90bcc7a444321e37934e8896c05.png

    195f198c6efe9b9babcc43921195d708.png

    a0c79a1a9a2b22838947d1a4d53570da.png

    b51f24a7d09b45027879d1ada4b1e877.png

    c9bb78e55d3938560b94158a61dc51c6.png

    6fee851ddfe022303b631528bd2234bb.png

    ba33fae5bfde3122c6af3e0e91d3ff04.png

    11f31524efc58d82043b4fa79a1b0ef3.png

    1b9d95b4834d268953cbdedb4b902660.png

    bc54cd519c4d8ac5c489aa8b6042301d.png

    6949d60ecc9d652ccca6966fe603121c.png

    e45044a43d8d92da5a298ad3d54503b1.png

    14e42f2d833fb7405004ef29b72a2e88.png

    5d28576c36509c414da12a6624287888.png

    532c7ae19c1b911f79dcda641c513811.png

    8ec1818ed9d51d233d4aeac2860a4257.png

    6b554408372fd57c43cae7a974cfd436.png

    0aeb9bd85ee73435f25abf728015c8cb.png

    c381dc8954a456a712761b490e7db86c.png

    745962e70e90b951a3fd7a5abd843f4a.png

    99954396c9c1356fdca0017123b27365.png

    58b5f2de67c893905bf2a48437afcbe3.png

    8e81aed602d2eb75dd774621c2fa7078.png

    d37cbe6029a9b2981b00ec1d7aa1e176.png

    0ecd3c0beab9fcc11736de487f0584ec.png

    6ae72d8a55c38b9cba2711625b9e2bf3.png

    0c2ae070deb2e270e75a39d3e0618146.png

    1、车道偏离预警系统

    2、自动泊车技术

    3、车联网——杰德智能屏系统

    4、汽车自适应巡航简介

    5、车联网————沃尔沃Sensus系统

    6、丰田3种四驱形式解析

    7、BMW Gran Coupe四门跑车家族新成员 全新物种BMW 2系Gran Coupe即将现型

    8、大众EA111、大众EA211发动机解读

    9、哈弗汽车 Fun-life 智能网联系统

    10、汽车打蜡、封釉、镀膜和镀晶的区别

    11、AGM自动启停蓄电池和普通蓄电池有什么区别

    12、五分钟看懂宝马N20发动机技术

    13、比亚迪e平台三电技术解析

    14、造车之路漫漫,谈一台合格的新能源汽车出厂前需要经历什么?

    15、为什么柴油机热效率比汽油机高

    16、【图解汽车】汽车差速器及四驱结构解析

    17、新能源市场细分化,豪华电动 SUV 市场正在崛起

    18、ECO节能模式简介

    19、哈弗H5终于换代

    20、吉利轿跑SUV领克05上市17.58万元起

    免责声明:此讯息系转载自互联网其它媒体,我们登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,文章内容仅供参考!如果您不希望我们转载您的作品,请和我们联系处理,谢谢!
    展开全文
  • 嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也借...

    嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也借此机会,学习了一下CAN总线。

    概述

    CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络

    想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司开发的(和Intel)

    CAN有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构

    近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。

    一个典型的CAN应用场景:

    0738df51ba2dd9529c78f7ab40de1325.png

    CAN总线标准

    CAN总线标准只规定了物理层数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。

    392a349e114aae387f08efecaec1aa97.png

    CAN收发器负责逻辑电平和物理信号之间的转换。

    17ded7686aaa01c2c8245347528bfbde.png

    将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。

    CAN标准有两个,即IOS11898IOS11519,两者差分电平特性不同

    9d5d3c5f9de1a40b2d74633ef9be0b82.png

    高低电平幅度低,对应的传输速度快;

    8060776894f988e32034d3852dc9a068.png

    dc5746df33628440d0a9894c858d77ca.png

    *双绞线共模消除干扰,是因为电平同时变化,电压差不变。

    物理层

    CAN有三种接口器件

    fc0d407486295331c6bf599ac865bac1.png

    b711863cabcb33528c247957af437a9f.png

    多个节点连接,只要有一个为低电平,总线就为低电平,只有所有节点输出高电平时,才为高电平。所谓"线与"。

    CAN总线有5个连续相同位后,就插入一个相反位,产生跳变沿,用于同步。从而消除累积误差。

    和485、232一样,CAN的传输速度与距离成反比。

    ce77ed0571e54ea04552de0610ab8278.png

    CAN总线,终端电阻的接法:

    f5b0d22bbc7fa8e2c70fa9befa77e0fd.png

    为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线

    数据链路层

    CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧远程帧、错误帧、过载帧和帧间隔。

    数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用于将数据帧、远程帧与前面帧隔离的帧。

    数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧(2.0B)

    帧起始

    32c9fb0d035a2f737aeab8bd20b5dfb4.png

    帧起始由一个显性位(低电平)组成,发送节点发送帧起始,其他节点同步于帧起始;

    帧结束由7个隐形位(高电平)组成。

    仲裁段

    CAN总线是如何解决多点竞争的问题?

    由仲裁段给出答案。

    CAN总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。

    f201d334491e9c0648cddc3e1652c773.png

    帧ID越小,优先级越高。由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高

    控制段

    共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。

    bac23c2f84b849572e8ececdd9241a26.png

    数据段

    为0-8字节,短帧结构,实时性好,适合汽车和工控领域;

    30d0e31d7df7866f37e610c5828be789.png

    CRC段

    CRC校验段由15位CRC值和CRC界定符组成。

    f123b6c01e417783adc1a26af8d9d0e6.png

    ACK段

    当接收节点接收到的帧起始到CRC段都没错误时,它将在ACK段发送一个显性电平,发送节点发送隐性电平,线与结果为显性电平。

    远程帧

    远程帧分为6个段,也分为标准帧和扩展帧,且RTR位为1(隐性电平)

    3c595e2a758f61585a7c86529b09adbb.png

    CAN是可靠性很高的总线,但是它也有五种错误。

    CRC错误:发送与接收的CRC值不同发生该错误;

    格式错误:帧格式不合法发生该错误;

    应答错误:发送节点在ACK阶段没有收到应答信息发生该错误;

    位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;

    位填充错误:通信线缆上违反通信规则时发生该错误。

    当发生这五种错误之一时,发送节点或接受节点将发送错误帧

    为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,CAN协议规定了节点的3种状态及行为

    0d1d181e54c1695d7d9588860a0ae67d.png

    过载帧

    当某节点没有做好接收的"准备"时,将发送过载帧,以通知发送节点。

    7fa86d10b2d4a32201da782f8a57708a.png

    帧间隔

    用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔。

    10cc8c89b64a1139cde574b8cb4e87fd.png

    //好好理解1.6最后一张ppt

    构建CAN节点

    构建节点,实现相应控制,由底向上分为四个部分:CAN节点电路CAN控制器驱动CAN应用层协议CAN节点应用程序

    虽然不同节点完成的功能不同,但是都有相同的硬件和软件结构。

    a356f8ed116f88de5e4962aec31805ce.png

    CAN收发器控制器分别对应CAN的物理层数据链路层,完成CAN报文的收发;功能电路,完成特定的功能,如信号采集或控制外设等;主控制器与应用软件按照CAN报文格式解析报文,完成相应控制。

    CAN硬件驱动是运行在主控制器(如P89V51)上的程序,它主要完成以下工作:基于寄存器的操作,初始化CAN控制器、发送CAN报文、接收CAN报文;

    如果直接使用CAN硬件驱动,当更换控制器时,需要修改上层应用程序,移植性差。在应用层和硬件驱动层加入虚拟驱动层,能够屏蔽不同CAN控制器的差异

    一个CAN节点除了完成通信的功能,还包括一些特定的硬件功能电路,功能电路驱动向下直接控制功能电路,向上为应用层提供控制功能电路函数接口。特定功能包括信号采集、人机显示等。

    5a1ce8f95b93aca5fda681ac5c7104e2.png

    CAN收发器是实现CAN控制器逻辑电平与CAN总线上差分电平的互换。实现CAN收发器的方案有两种,一是使用CAN收发IC(需要加电源隔离和电气隔离),另一种是使用CAN隔离收发模块。推荐使用第二种。

    CAN控制器是CAN的核心元件,它实现了CAN协议中数据链路层的全部功能,能够自动完成CAN协议的解析。CAN控制器一般有两种,一种是控制器IC(SJA1000),另一种是集成CAN控制器的MCU(LPC11C00)。

    MCU负责实现对功能电路和CAN控制器的控制:在节点启动时,初始化CAN控制器参数通过CAN控制器读取和发送CAN帧;在CAN控制器发生中断时,处理CAN控制器的中断异常根据接收到的数据输出控制信号

    1bc2f171f3d849f43e1a5f6434749802.png

    接口管理逻辑:解释MCU指令,寻址CAN控制器中的各功能模块的寄存器单元,向主控制器提供中断信息和状态信息。

    发送缓冲区和接收缓冲区能够存储CAN总线网络上的完整信息。

    验收滤波是将存储的验证码与CAN报文识别码进行比较,跟验证码匹配的CAN帧才会存储到接收缓冲区。

    CAN内核实现了数据链路的全部协议。

    CAN协议应用层概述

    CAN总线只提供可靠的传输服务,所以节点接收报文时,要通过应用层协议来判断是谁发来的数据、数据代表了什么含义。常见的CAN应用层协议有:CANOpen、DeviceNet、J1939、iCAN等。

    CAN应用层协议驱动是运行在主控制器(如P89V51)上的程序,它按照应用层协议来对CAN报文进行定义、完成CAN报文的解析与拼装。例如,我们将帧ID用来表示节点地址,当接收到的帧ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送时,将帧ID设置为接收节点的地址。

    CAN收发器

    SJA1000的输出模式有很多,使用最多的是正常输出模式,输入模式通常不选择比较器模式,可以增大通信距离,并且减少休眠下的电流。

    963a5186e495e64564421e1c69498051.png

    收发器按照通信速度分为高速CAN收发器和容错CAN收发器。

    同一网络中要使用相同的CAN收发器。

    CAN连接线上会有很多干扰信号,需要在硬件上添加滤波器和抗干扰电路

    53e490c542b8f1b9cc7d618f0c5c46ff.png

    也可以使用CAN隔离收发器(集成滤波器和抗干扰电路)。

    9b3d4671a6401deb9aded5ed8ce981c2.png

    fbf5e443c39fdb656bd2551d48b57a6f.png

    CAN控制器与MCU的连接方式

    c97a53cc03a1c6d4918d709d44948746.png

    SJA1000可被视为外扩RAM,地址宽度8位,最多支持256个寄存器

    2fc5f623d852d749fdee993d34a77c67.png

    5c58fdd028981581dc5eafd36671f90a.png

    #define REG_BASE_ADDR 0xA000 // 寄存器基址unsigned char *SJA_CS_Point = (unsigned char *) REG_BASE_ADDR ; // 写SJA1000寄存器void WriteSJAReg(unsigned char RegAddr, unsigned char Value) {*(SJA_CS_Point + RegAddr) = Value;return;} // 读SJA1000寄存器unsigned char ReadSJAReg(unsigned char RegAddr) { return (*(SJA_CS_Point + RegAddr));}

    04e9a2aa7b1e961fd9aa75ba898de6b9.png

    84f572900b1e3d77170f482ee4d4c359.png

    将缓存区的数据连续写入寄存器

    …… for (i=0;i<len;i++) { WriteSJAReg(RegAdr+i,ValueBuf[i]);  }……

    将连续多个寄存器连续读入缓存区

    …… for (i=0;i<len;i++) {  ReadSJAReg(RegAdr+i,ValueBuf[i]);   }……

    20017014e63ef45a28f86bef356b9c2f.png

    头文件包含方案:

    1. 每个程序包含用到的头文件

    2. 每个程序包含一个公用头文件,公用头文件包含所有其他头文件

    #ifndef __CONFIG_H__ // 防止头文件被重复包含#define __CONFIG_H__#include <8051.h>         // 包含80C51寄存器定义头文件#include "SJA1000REG.h"         // 包含SJA1000寄存器定义头文件 // 定义取字节运算#define LOW_BYTE(x)  (unsigned char)(x)#define HIGH_BYTE(x)  (unsigned char)((unsigned int)(x) >> 8) // 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)#define OSCCLK 11059200UL// 宏定义MCU的时钟频率#define CPUCLK (OSCCLK / 12)#endif // __CONFIG_H__

    SJA1000上电后处于复位状态,必须初始化后才能工作。

    (1)置位模式寄存器Bit0位进入复位模式;

    (2)设置时钟分频寄存器选择时钟频率、CAN模式;

    (3)设置验收滤波,设定验证码和屏蔽码;

    (4)设置总线定时器寄存器0、1设定CAN波特率;

    (5)设置输出模式;

    (6)清零模式寄存器Bit0位退出复位模式;

    模式寄存器

    564497a249697e6235802817beb887aa.png

    只检测模式:SJA1000发送CAN帧时不检查应答位;

    只听模式:此模式下SJA1000不会发送错误帧,用于自动检测波特率;SJA1000以不同的波特率接收CAN帧,当收到CAN帧时,表明当前波特率与总线波特率相同。

    波特率设置

    CAN总线无时钟,使用异步串行传输;波特率是1秒发送的数据位;

    f2b8e7356cf62a63031c8e6132808472.png

    CAN帧发送:

    发送CAN帧的步骤:1.检测状态寄存器,等待发送缓冲区可用;

    2.填充报文到发送缓冲区;

    3.启动发送。

    3e34585ccd5ede74c19f12c5c4d7dafa.png

    SJA1000具有一个12字节的缓冲区,要发送的报文可以通过寄存器16-28写入,也可通过寄存器96-108写入或读出

    75648a357610169bd3eab857548e8c25.png

    4dd3b39ad7a68c5ec1736fcca46aa482.png

    设置发送模式

    char SetSJASendCmd(unsigned char cmd) {    unsigned char ret;    switch (cmd) {    default:    case 0:        ret = SetBitMask(REG_CAN_CMR, TR_BIT); //正常发送    break;    case 1:        ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); //单次发送    break;    case 2:        ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);//自收自发    break;    case 0xff:        ret = SetBitMask(REG_CAN_CMR, AT_BIT);//终止发送    break;    }    return ret;}

     发送函数

    unsigned char SJA_CAN_Filter[8] = {    // 定义验收滤波器的参数,接收所有帧       0x00, 0x00, 0x00, 0x00,                                                // ACR0~ACR3       0xff, 0xff, 0xff, 0xff                                                         // AMR0~AMR3};unsigned char STD_SEND_BUFFER[11] = {   // CAN 发送报文缓冲区       0x08,   // 帧信息,标准数据帧,数据长度 = 8       0xEA, 0x60, // 帧ID = 0x7530x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa  // 帧数据};void main(void) // 主函数,程序入口{           timerInit();// 初始化    D1 = 0;           SJA1000_RST = 1; // 硬件复位SJA1000           timerDelay(50); // 延时500ms           SJA1000_RST = 0;           SJA1000_Init(0x00, 0x14, SJA_CAN_Filter);   // 初始化SJA1000,设置波特率为1Mbps           // 无限循环,main()函数不允许返回          for(;;) {                   SJASendData(STD_SEND_BUFFER, 0x0);                   timerDelay(100);         // 延时1000ms          }    }

    为什么帧ID是0x753,这与CAN帧在缓冲区的存储格式有关。

    4ce0fdc5685b3fd57363c107eadd7cf6.png

    375f953874ed039fd6966cc01cc351d8.png

    终端电阻非常重要,当波特率较高而且没加终端电阻时,信号过冲非常严重。

    089d3b45d7590f06185639c8aad76dec.png

    SJA1000有64个字节的接收缓冲区(FIFO),这可以降低对MCU的要求。MCU可以通过查询或中断的方式确定SJA1000接收到报文后读取报文。

    参考资料:《项目驱动-CAN-bus现场总线基础教程》 广州周立功单片机科技有限公司

    原文出处:http://www.cnblogs.com/jacklu/p/4729638.html

    END

    推荐阅读

    【1】100ASK_IMX6ULL arm板子如何显示图片、汉字、划线、背景色【2】到底什么是Cortex、ARMv8、arm架构、ARM指令集、soc?一文帮你梳理基础概念【科普】 必读【3】搞懂进程组、会话、控制终端关系,才能明白守护进程干嘛的?【4】一个多线程的简单例子让你看清线程调度的随机性【5】在100ASK_IMX6ULL arm板子上移植个刷卡器

    本公众号全部原创干货已整理成一个目录,点击干货即可获得

    后台回复进群」,即可加入技术交流群,进群福利:免费赠送Linux学习资料

    展开全文
  • 嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也借...

    嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信也广泛使用CAN,随着国家对海防的越来越重视,对CAN的需求也会越来越大。这个暑假,通过参加苏州社会实践,去某船舶电气公司实习几周,也借此机会,学习了一下CAN总线。

    概述

    CAN(ControllerAreaNetwork)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。

    想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司开发的(和Intel)

    CAN有很多优秀的特点,使得它能够被广泛的应用。比如:传输速度最高到1Mbps,通信距离最远到10km,无损位仲裁机制,多主结构。

    近些年来,CAN控制器价格越来越低,很多MCU也集成了CAN控制器。现在每一辆汽车上都装有CAN总线。

    一个典型的CAN应用场景:

    CAN总线标准

    CAN总线标准只规定了物理层和数据链路层,需要用户自定义应用层。不同的CAN标准仅物理层不同。

    CAN收发器负责逻辑电平和物理信号之间的转换。

    将逻辑信号转换成物理信号(差分电平),或者将物理信号转换成逻辑电平。

    CAN标准有两个,即IOS11898和IOS11519,两者差分电平特性不同。

    高低电平幅度低,对应的传输速度快;

    *双绞线共模消除干扰,是因为电平同时变化,电压差不变。

    物理层

    CAN有三种接口器件

    多个节点连接,只要有一个为低电平,总线就为低电平,只有所有节点输出高电平时,才为高电平。所谓“线与”。

    CAN总线有5个连续相同位后,就插入一个相反位,产生跳变沿,用于同步。从而消除累积误差。

    和485、232一样,CAN的传输速度与距离成反比。

    CAN总线,终端电阻的接法:

    为什么是120Ω,因为电缆的特性阻抗为120Ω,为了模拟无限远的传输线

    数据链路层

    CAN总线传输的是CAN帧,CAN的通信帧分成五种,分别为数据帧、远程帧、错误帧、过载帧和帧间隔。

    数据帧用来节点之间收发数据,是使用最多的帧类型;远程帧用来接收节点向发送节点接收数据;错误帧是某节点发现帧错误时用来向其他节点通知的帧;过载帧是接收节点用来向发送节点告知自身接收能力的帧;用于将数据帧、远程帧与前面帧隔离的帧。

    数据帧根据仲裁段长度不同分为标准帧(2.0A)和扩展帧(2.0B)

    帧起始

    帧起始由一个显性位(低电平)组成,发送节点发送帧起始,其他节点同步于帧起始;

    帧结束由7个隐形位(高电平)组成。

    仲裁段

    CAN总线是如何解决多点竞争的问题?

    由仲裁段给出答案。

    CAN总线控制器在发送数据的同时监控总线电平,如果电平不同,则停止发送并做其他处理。如果该位位于仲裁段,则退出总线竞争;如果位于其他段,则产生错误事件。

    帧ID越小,优先级越高。由于数据帧的RTR位为显性电平,远程帧为隐性电平,所以帧格式和帧ID相同的情况下,数据帧优先于远程帧;由于标准帧的IDE位为显性电平,扩展帧的IDE位为隐形电平,对于前11位ID相同的标准帧和扩展帧,标准帧优先级比扩展帧高。

    控制段

    共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。

    数据段

    为0-8字节,短帧结构,实时性好,适合汽车和工控领域;

    CRC段

    CRC校验段由15位CRC值和CRC界定符组成。

    ACK段

    当接收节点接收到的帧起始到CRC段都没错误时,它将在ACK段发送一个显性电平,发送节点发送隐性电平,线与结果为显性电平。

    远程帧

    远程帧分为6个段,也分为标准帧和扩展帧,且RTR位为1(隐性电平)

    CAN是可靠性很高的总线,但是它也有五种错误。

    CRC错误:发送与接收的CRC值不同发生该错误;

    格式错误:帧格式不合法发生该错误;

    应答错误:发送节点在ACK阶段没有收到应答信息发生该错误;

    位发送错误:发送节点在发送信息时发现总线电平与发送电平不符发生该错误;

    位填充错误:通信线缆上违反通信规则时发生该错误。

    当发生这五种错误之一时,发送节点或接受节点将发送错误帧

    为防止某些节点自身出错而一直发送错误帧,干扰其他节点通信,CAN协议规定了节点的3种状态及行为

    过载帧

    当某节点没有做好接收的“准备”时,将发送过载帧,以通知发送节点。

    帧间隔

    用来隔离数据帧、远程帧与他们前面的帧,错误帧和过载帧前面不加帧间隔。

    //好好理解1.6最后一张ppt

    构建CAN节点

    构建节点,实现相应控制,由底向上分为四个部分:CAN节点电路、CAN控制器驱动、CAN应用层协议、CAN节点应用程序。

    虽然不同节点完成的功能不同,但是都有相同的硬件和软件结构。

    CAN收发器和控制器分别对应CAN的物理层和数据链路层,完成CAN报文的收发;功能电路,完成特定的功能,如信号采集或控制外设等;主控制器与应用软件按照CAN报文格式解析报文,完成相应控制。

    CAN硬件驱动是运行在主控制器(如P89V51)上的程序,它主要完成以下工作:基于寄存器的操作,初始化CAN控制器、发送CAN报文、接收CAN报文;

    如果直接使用CAN硬件驱动,当更换控制器时,需要修改上层应用程序,移植性差。在应用层和硬件驱动层加入虚拟驱动层,能够屏蔽不同CAN控制器的差异。

    一个CAN节点除了完成通信的功能,还包括一些特定的硬件功能电路,功能电路驱动向下直接控制功能电路,向上为应用层提供控制功能电路函数接口。特定功能包括信号采集、人机显示等。

    CAN收发器是实现CAN控制器逻辑电平与CAN总线上差分电平的互换。实现CAN收发器的方案有两种,一是使用CAN收发IC(需要加电源隔离和电气隔离),另一种是使用CAN隔离收发模块。推荐使用第二种。

    CAN控制器是CAN的核心元件,它实现了CAN协议中数据链路层的全部功能,能够自动完成CAN协议的解析。CAN控制器一般有两种,一种是控制器IC(SJA1000),另一种是集成CAN控制器的MCU(LPC11C00)。

    MCU负责实现对功能电路和CAN控制器的控制:在节点启动时,初始化CAN控制器参数;通过CAN控制器读取和发送CAN帧;在CAN控制器发生中断时,处理CAN控制器的中断异常;根据接收到的数据输出控制信号;

    接口管理逻辑:解释MCU指令,寻址CAN控制器中的各功能模块的寄存器单元,向主控制器提供中断信息和状态信息。

    发送缓冲区和接收缓冲区能够存储CAN总线网络上的完整信息。

    验收滤波是将存储的验证码与CAN报文识别码进行比较,跟验证码匹配的CAN帧才会存储到接收缓冲区。

    CAN内核实现了数据链路的全部协议。

    CAN协议应用层概述

    CAN总线只提供可靠的传输服务,所以节点接收报文时,要通过应用层协议来判断是谁发来的数据、数据代表了什么含义。常见的CAN应用层协议有:CANOpen、DeviceNet、J1939、iCAN等。

    CAN应用层协议驱动是运行在主控制器(如P89V51)上的程序,它按照应用层协议来对CAN报文进行定义、完成CAN报文的解析与拼装。例如,我们将帧ID用来表示节点地址,当接收到的帧ID与自身节点ID不通过时,就直接丢弃,否则交给上层处理;发送时,将帧ID设置为接收节点的地址。

    CAN收发器

    SJA1000的输出模式有很多,使用最多的是正常输出模式,输入模式通常不选择比较器模式,可以增大通信距离,并且减少休眠下的电流。

    收发器按照通信速度分为高速CAN收发器和容错CAN收发器。

    同一网络中要使用相同的CAN收发器。

    CAN连接线上会有很多干扰信号,需要在硬件上添加滤波器和抗干扰电路

    也可以使用CAN隔离收发器(集成滤波器和抗干扰电路)。

    CAN控制器与MCU的连接方式

    SJA1000可被视为外扩RAM,地址宽度8位,最多支持256个寄存器

    #defineREG_BASE_ADDR0xA000//寄存器基址unsignedchar*SJA_CS_Point=(unsignedchar*)REG_BASE_ADDR;//写SJA1000寄存器voidWriteSJAReg(unsignedcharRegAddr,unsignedcharValue){*(SJA_CS_Point+RegAddr)=Value;return;}//读SJA1000寄存器unsignedcharReadSJAReg(unsignedcharRegAddr){return(*(SJA_CS_Point+RegAddr));}

    将缓存区的数据连续写入寄存器

    ……for(i=0;i《len;i++){WriteSJAReg(RegAdr+i,ValueBuf[i]);}……

    将连续多个寄存器连续读入缓存区

    ……for(i=0;i《len;i++){ReadSJAReg(RegAdr+i,ValueBuf[i]);}……

    头文件包含方案:

    每个程序包含用到的头文件

    每个程序包含一个公用头文件,公用头文件包含所有其他头文件

    #ifndef__CONFIG_H__//防止头文件被重复包含#define__CONFIG_H__#include《8051.h》//包含80C51寄存器定义头文件#include“SJA1000REG.h”//包含SJA1000寄存器定义头文件//定义取字节运算#defineLOW_BYTE(x)(unsignedchar)(x)#defineHIGH_BYTE(x)(unsignedchar)((unsignedint)(x)》》8)//定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)#defineOSCCLK11059200UL//宏定义MCU的时钟频率#defineCPUCLK(OSCCLK/12)#endif//__CONFIG_H__

    SJA1000上电后处于复位状态,必须初始化后才能工作。

    (1)置位模式寄存器Bit0位进入复位模式;

    (2)设置时钟分频寄存器选择时钟频率、CAN模式;

    (3)设置验收滤波,设定验证码和屏蔽码;

    (4)设置总线定时器寄存器0、1设定CAN波特率;

    (5)设置输出模式;

    (6)清零模式寄存器Bit0位退出复位模式;

    模式寄存器

    只检测模式:SJA1000发送CAN帧时不检查应答位;

    只听模式:此模式下SJA1000不会发送错误帧,用于自动检测波特率;SJA1000以不同的波特率接收CAN帧,当收到CAN帧时,表明当前波特率与总线波特率相同。

    波特率设置

    CAN总线无时钟,使用异步串行传输;波特率是1秒发送的数据位;

    CAN帧发送:

    发送CAN帧的步骤:1.检测状态寄存器,等待发送缓冲区可用;

    2.填充报文到发送缓冲区;

    3.启动发送。

    SJA1000具有一个12字节的缓冲区,要发送的报文可以通过寄存器16-28写入,也可通过寄存器96-108写入或读出

    设置发送模式

    charSetSJASendCmd(unsignedcharcmd){unsignedcharret;switch(cmd){default:case0:ret=SetBitMask(REG_CAN_CMR,TR_BIT);//正常发送break;case1:ret=SetBitMask(REG_CAN_CMR,TR_BIT|AT_BIT);//单次发送break;case2:ret=SetBitMask(REG_CAN_CMR,TR_BIT|SRR_BIT);//自收自发break;case0xff:ret=SetBitMask(REG_CAN_CMR,AT_BIT);//终止发送break;}returnret;}

    发送函数

    unsignedcharSJA_CAN_Filter[8]={//定义验收滤波器的参数,接收所有帧0x00,0x00,0x00,0x00,//ACR0~ACR30xff,0xff,0xff,0xff//AMR0~AMR3};unsignedcharSTD_SEND_BUFFER[11]={//CAN发送报文缓冲区0x08,//帧信息,标准数据帧,数据长度=80xEA,0x60,//帧ID=0x7530x55,0x55,0x55,0x55,0xaa,0xaa,0xaa,0xaa//帧数据};voidmain(void)//主函数,程序入口{merInit();//初始化D1=0;SJA1000_RST=1;//硬件复位SJA1000TImerDelay(50);//延时500msSJA1000_RST=0;SJA1000_Init(0x00,0x14,SJA_CAN_Filter);//初始化SJA1000,设置波特率为1Mbps//无限循环,main()函数不允许返回for(;;){SJASendData(STD_SEND_BUFFER,0x0);TImerDelay(100);//延时1000ms}}

    为什么帧ID是0x753,这与CAN帧在缓冲区的存储格式有关。

    终端电阻非常重要,当波特率较高而且没加终端电阻时,信号过冲非常严重。

    SJA1000有64个字节的接收缓冲区(FIFO),这可以降低对MCU的要求。MCU可以通过查询或中断的方式确定SJA1000接收到报文后读取报文。

    展开全文
  • 原标题:详解CAN总线CAN(Controller Area Network)即控制器局域网,是一种能够实现分布式实时控制的串行通信网络。想到CAN就要想到德国的Bosch公司,因为CAN就是这个公司开发的(和Intel)CAN有很多优秀的特点,使得它...
  • CAN总线是德国BOSCH公司在20世纪80年代初,为了解决现代汽车中众多的控制与测试仪器之间的数据交换而开发的一种串行数据通讯协议。它的短帧数据结构、非破坏性总线性仲裁技术以及灵活的通讯方式适应了汽车的实时性和...
  • 现在的汽车已经不再仅仅是一种死气沉沉的交通...1,CAN总线协议基本概念:(1),报文:总线上的信息以不同格式的报文发送,但长度有限。当总线开放时,任何连接的单元均可开始发送一个新报文。(2),信息路由:在CAN系统中,...
  • 来源 |汽车技研知圈|进“汽车管路社群”,请加微15221054164,备注管路知圈 |进“汽车车身社群”,请加微15221054164,备注车身CAN总线(一)嵌入式的工程师一般都知道CAN总线广泛应用到汽车中,其实船舰电子设备通信...
  • //CAN总线片选无效,使对数据总线的操作不会影响SJA1000。 //CPU初始化 CAN_init( ); //SJA1000初始化,对 SJA1000寄存器的读写是采用外部寄存器寻址方式,所以不需要程序单独控制片选有效无效 _nop_(); _nop_(); ...
  • CAN2.0A 是CAN协议的PART A部分,此部分定义了11bit的标识区 。CAN2.0B 是CAN协议的扩展部分,也叫PART B,定义了29bit的标识区,其它部分与CAN2.0A一样。CANOpen是基于CAN协议的应用层协议,可以理解为用户层,即...
  • CAN总线是一种串行多主站局域网总线,被广泛应用于汽车控制系统、自动控制、楼宇自动化、医学设备等各个领域。其传输距离远,最远可达10km,传输速率高,最高可达1Mb/s,容错性能好,可靠性能高。但是由于CAN驱动器...
  • CAN总线的总体结构CAN总线由CAN控制器、CAN收发器、数据传输线、数据传输终端等组成。CB311的ECU(发动机控制单元)、TCU(变速器控制单元)、FEPS(无钥匙进入和无钥匙启动系统)、组合仪表四个电控单元通过CAN总线连接,...
  • 花了一整个下午的时间,彻头彻尾的把PIAE小组提供的CAN自收发源程序解读了一遍。解读别人的程序是一件挺费时费力的一件事,但是在对某项技术或者说某个芯片的入门阶段参考别人的程序又是一项必不可少的任务。对于这...
  • CAN总线信号是否能够稳定有效的传输是系统稳定的前提和保证,借助Xpedition AMS 可以进行CAN总线建模分析,对总线长度,节点数量、拓扑结构、 元器件参数进行仿真优化,从而节省产品上市时间。CAN 是 Controller ...
  • 说明:本文原创作者『strongerHuang』首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop标签:CAN、 CANOpen、 CanFestival...因此,我们常听见CAN总线,也常听见CAN协议。CAN协议和CANOp...
  • 本发明涉及汽车电子技术领域,特别涉及一种CAN总线开发与测试方法及系统。背景技术:在汽车电子系统的开发过程中,通常需要对控制器局域网络(Controller Area Network,CAN)总线报文进行监听与分析、注入测试报文...
  • 引擎调教101 - 揭开CAN总线的神秘面纱车辆网络信息示意图(图片来自网络)本文约2900字阅读时间8分钟1.CAN总线和CAN-FD2.数据传输速度和对赛道日的影响3.CAN总线发送收取指令4.DIY刷发动机详细教程 - 点火延迟之排气...
  • 首先简单介绍一下CAN总线,关于CAN总线是谁发明的,CAN总线的历史,CAN总线的发展,CAN总线的应用场合,这些,通通不说。这里只是以我个人理解,简单说说CAN通信。CAN总线的端点没有地址(除非自己在帧里定义地址),...
  • 今天就给大家来讲解一下CAN总线的基础知识。一、CAN总线的基本概念CAN 是Controller Area Network 的缩写,是ISO国际标准化的串行通信协议,也是国际上应用最广泛的现场总线之一。在汽车产业中,出于对安全性、舒适....
  • CAN 总线通信距离限制小,它的直接通信距离最大可达 10km,最高通信速率可以达 1Mb/s(此时距离最长为 40m),节点数可多达 110 个。因此它特别适合于工业远程过程监控设备的互联和电网络设备的调试和维护。基于 CAN ...
  • CAN总线位速率最大可达1 Mb/s。MC9S12XE(简称S12X)系列单片机专门用于汽车网络和通用车身应用,具有32位单片机的性能,且具有16位MCU的所有优点和功效。内部的增强型XGATE模块,允许高速数据自主地在单片机外设和...
  • 毫无疑问,CAN是目前应用最为广泛的串行总线系统,它甚至可以在一辆车上被多次使用:一个最高传输速率为125kbps的低速CAN总线系统(容错CAN),用于连接舒适系统的ECU;一个最高传输速率可达1Mbps的高速CAN总线系统...
  • STM32F1 芯片自带 bxCAN 控制器 (Basic Extended CAN),即基本扩展 CAN,可与 CAN 网络进行交互,它支持 2.0A 和 B 版本的 CAN 协议。旨在以最少的CPU 负载高效管理大量的传入消息,并可按需要的优先级实现消息发送...
  • 最近有很多人问到CAN与CANopen的协议区别,希望能通过下面的图解方式来帮助大家理解。方法/步骤1首先了解网络协议分层,分七层方法/步骤2其次了解现场总线现场总线网络一般只实现了第1层(物理层)、第2层(数据链路层)...
  • 公开课上门定制在线学堂随着汽车技术的发展,车载总线也变得越发的多种多样,从CAN到以太网,复杂网络应用也越来越多的出现在车辆上,了解不同的总线类型之间的特点对于车载网络的应用有着重要的意义。本课程覆盖了...
  • 知识是需要分享的,只有...Excel2DBC转换工具总线第14讲,excel2dbc四大功能详细视频演示这是一款非常实用的工具,许多方面都超越了那些价格昂贵的付费应用程序(一个是源码,一个是应用程序,一个几乎免费,一个价格...
  • CAN总线应用层协议实例解析,详细介绍CAN总线的应用,包括J1939、canopen等协议的讲解,方便新手对CAN总线加深理解。 牛跃听、周立功、穆希辉和黄敏思编著的《CAN 总线应用层协议实例解析(附光盘工程师经验手记)》 ...
  • socket CAN

    千次阅读 2018-07-13 12:05:53
    http://velep.com/archives/1181.html通过读这篇博客是我搜索can通讯以来讲解的最详细的一篇,还有其自己写的一刻关于can控制的程序都是非常棒的,Linux 系统中CAN 接口配置在 Linux 系统中, CAN 总线接口设备作为...
  • Linux CAN编程详解

    2017-11-15 09:38:45
    通过读这篇博客是我搜索can通讯以来讲解的最详细的一篇,还有其自己写的一刻关于can控制的程序都是非常棒的, Linux 系统中CAN 接口配置 在 Linux 系统中, CAN 总线接口设备作为网络设备被系统进行...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

can总线程序讲解