CAN模块发送流程(CAN模块发送流程)
大家好!今天让创意岭的小编来大家介绍下关于CAN模块发送流程的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
开始之前先推荐一个非常厉害的Ai人工智能工具,一键生成原创文章、方案、文案、工作计划、工作报告、论文、代码、作文、做题和对话答疑等等
只需要输入关键词,就能返回你想要的内容,有小程序、在线网页版、PC客户端和批量生成器
本文目录:
can总线工作原理
can总线工作原理如下。CAN总线使用串行数据传输方式,可以1Mb/s的速率在40m的双绞线上运行,也可以使用光缆连接,而且在这种总线上总线协议支持多主控制器。CAN与I2C总线的许多细节很类似,但也有一些明显的区别。
当CAN总线上的一个节点(站)发送数据时,它以报文形式广播给网络中所有节点。对每个节点来说,无论数据是否是发给自己的,都对其进行接收。每组报文开头的11位字符为标识符,定义了报文的优先级,这种报文格式称为面向内容的编址方案。在同一系统中标识符是唯一的,不可能有两个站发送具有相同标识符的报文。当几个站同时竞争总线读取时,这种配置十分重要。
当一个站要向其它站发送数据时,该站的CPU将要发送的数据和自己的标识符传送给本站的CAN芯片,并处于准备状态;当它收到总线分配时,转为发送报文状态。CAN芯片将数据根据协议组织成一定的报文格式发出,这时网上的其它站处于接收状态。每个处于接收状态的站对接收到的报文进行检测,判断这些报文是否是发给自己的,以确定是否接收它。
由于CAN总线是一种面向内容的编址方案,因此很容易建立高水准的控制系统并灵活地进行配置。我们可以很容易地在CAN总线中加进一些新站而无需在硬件或软件上进行修改。当所提供的新站是纯数据接收设备时,数据传输协议不要求独立的部分有物理目的地址。它允许分布过程同步化,即总线上控制器需要测量数据时,可由网上获得,而无须每个控制器都有自己独立的传感器。
CAN总线的特点:1、具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点
2、采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;
3、具有优先权和仲裁功能,多个控制模块通过CAN控制器挂到CAN-bus上,形成多主机局部网络;
4、可根据报文的ID决定接收或屏蔽该报文;
5、可靠的错误处理和检错机制;
6、发送的信息遭到破坏后,可自动重发;
7、节点在错误严重的情况下具有自动退出总线的功能;
8、报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。
can照明控制模块,怎么控制呀,有明白的吗,求教
CAN照明控制模块通常是作为照明控制系统中的一个节点,可以通过CAN总线与其他节点进行通讯。要控制某一路开关,通常需要遵循以下步骤:
首先,需要确认CAN照明控制模块所使用的CAN协议和通讯格式。不同的CAN协议和通讯格式可能有所不同,需要根据实际情况进行配置。
然后,需要使用CAN总线发送控制命令。具体的控制命令格式和内容需要参照CAN照明控制模块的协议说明进行设置。一般来说,控制命令中需要包含控制某一路开关的指令,并指定相应的开关状态(如开或关)。
发送控制命令后,CAN照明控制模块会接收到命令并进行处理。如果命令格式正确,模块会按照命令指定的开关状态来控制对应的照明设备。
需要注意的是,CAN照明控制模块的控制命令和协议需要根据具体的型号和品牌进行设置,如果您不熟悉CAN协议和通讯格式,可以查阅相关的文档和参考资料,或者咨询厂家的技术支持人员。
汽车CAN总线的传输原理?
总线(CAN,Controller Area Network)是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一。CAN协议由德国的Robert Bosch公司开发,用于汽车中各种不同元件之间的通信,以此取代昂贵而笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。CAN协议的特性包括完整性的串行数据通讯、提供实时支持、传输速率高达1Mb/s、同时具有11位的寻址以及检错能力。
CAN总线是一种多主方式的串行通讯总线,基本设计规范要求有高的位速率,高抗电子干扰性,并且能够检测出产生的任何错误。CAN总线可以应用于汽车电控制系统、电梯控制系统、安全监测系统、医疗仪器、纺织机械、船舶运输等领域。
一、CAN总线的特点:
1、具有实时性强、传输距离较远、抗电磁干扰能力强、成本低等优点;
2、采用双线串行通信方式,检错能力强,可在高噪声干扰环境中工作;
3、具有优先权和仲裁功能,多个控制模块通过CAN 控制器挂到CAN-bus 上,形成多主机局部网络;
4、可根据报文的ID决定接收或屏蔽该报文;
5、可靠的错误处理和检错机制;
6、发送的信息遭到破坏后,可自动重发;
7、节点在错误严重的情况下具有自动退出总线的功能;
8、报文不包含源地址或目标地址,仅用标志符来指示功能信息、优先级信息。
二、CAN总线的应用
CAN总线在组网和通信功能上的优点以及其高性价比据定了它在许多领域有广阔的应用前景和发展潜力。这些应用有些共同之处:CAN实际就是在现场起一个总线拓扑的计算机局域网的作用。不管在什么场合,它负担的是任一节点之间的实时通信,但是它具备结构简单、高速、抗干扰、可靠、价位低等优势。CAN总线最初是为汽车的电子控制系统而设计的,目前在欧洲生产的汽车中CAN的应用已非常普遍,不仅如此,这项技术已推广到火车、轮船等交通工具中。
1、汽车制造中的应用
应用CAN总线,可以减少车身布线,进一步节省了成本,由于采用总线技术,模块之间的信号传递仅需要两条信号线。布线局部化,车上除掉总线外其他所有横贯车身的线都不再需要了,节省了布线成本。CAN总线系统数据稳定可靠,CAN总线具有线间干扰小、抗干扰能力强的特点。CAN总线专为汽车量身定做,充分考虑到了汽车上恶劣工作环境,比如点火线圈点火时产生的强大的反充电压,电涡流缓冲器切断时产生的浪涌电流及汽车发动机仓100℃左右的高温。
2、大型仪器设备中的应用
大型仪器设备是一种参照一定步骤对多种信息采集、处理、控制、输出等操作的复杂系统。过去这类仪器设备的电子系统往往是在结构和成本方面占据相当大的部分,而且可靠性不高。采用CAN总线技术后,在这方面有了明显改观。
3、工业控制中的应用
随着计算机技术、通信技术和控制技术的发展,传统的工业控制领域正经历着一场前所未有的变革,而工业控制的网络化,更拓展了工业控制领域的发展空间,带来新的发展机遇。在广泛的工业领域,CAN总线可作为现场设备级的通信总线,而且与其他的总线相比,具有很高的可靠性和性能价格比。这将是CAN技术开发应用的一个主要的方向。
跪求!DSP 2812 的CAN的发送和接受程序
这是我从书上拷下来的程序,我自己试过是可以的,就是CAN的自测试,有发送和接收,你可以仿照着根据自己想要的结果来改。端口随便定义就行了。不知道符不符合你的要求。/**************************************************************************
**功能描述: ECAN自测试程序,CAN模块工作在自测试模式。MBX0发送到MBX16***
**MBX1发送到MBX17。该程序不停地高速背靠背传输数据,检查接数据的正确性**
**************************************************************************/
#include "DSP28_Device.h"
void mailbox_check(int32 T1, int32 T2, int32 T3);
void mailbox_read(int16 i);
////////////////////////////////////
Uint32 ErrorCount = 0;
Uint32 MessageReceivedCount = 0;
Uint32 TestMbox1 = 0;
Uint32 TestMbox2 = 0;
Uint32 TestMbox3 = 0;
void CAN_INIT()
{
struct ECAN_REGS ECanaShadow;
EALLOW;
GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; // 设置GPIOF6为CANTX
GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; // 设置GPIOF7为CANRX
EDIS;
/*eCAN 控制寄存器需要32位访问。如果想向一个单独位进行写操作,编译器可能会使其进入16位访问。这儿引用了一种解决方法,就是用影子寄存器迫使进行32位访问。 把整个寄存器读入一个影子寄存器。 这个访问将是32位的。用32位写操作改变需要改的位,然后把该值拷贝回eCAN寄存器*/
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all; // 把CANTIOC读入影子寄存器
ECanaShadow.CANTIOC.bit.TXFUNC = 1; // 外部引脚I/O使能标志位。
// TXFUNC=1 CANTX引脚被用于CAN发送功能。
// TXFUNC=0 CANTX引脚被作为通用I/O引脚被使用
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all; // 把配置好的寄存器值回写
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all; // 把CANRIOC读影子寄存器
ECanaShadow.CANRIOC.bit.RXFUNC = 1; // 外部引脚I/O使能标志位。
// RXFUNC=1 CANRX引脚被用于CAN接收功能。
// RXFUNC=0 CANRX引脚被作为通用I/O引脚被使用。
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all; // 把配置好的寄存器值回写
EDIS;
// 在配置邮箱ID值之前,CANME对应的位必须复位,
// 如果CANME寄存器中对应的位被置位,则ID写入操作无效。
ECanaRegs.CANME.all = 0; // 复位所有的邮箱
ECanaMboxes.MBOX0.MID.all = 0x9555AAA0; // 配置发送邮箱0的ID:扩展标识符29位
ECanaMboxes.MBOX1.MID.all = 0x9555AAA1; // 配置发送邮箱1的ID:扩展标识符29位
ECanaMboxes.MBOX16.MID.all = 0x9555AAA0; // 确定接收邮箱16的ID
ECanaMboxes.MBOX17.MID.all = 0x9555AAA1; // 确定接收邮箱17的ID
// 把邮箱0~15 配置为发送邮箱 , 把邮箱16~31 配置为接收邮箱
ECanaRegs.CANMD.all = 0xFFFF0000;
ECanaRegs.CANME.all = 0xFFFFFFFF; // CAN模块使能对应的邮箱,
ECanaMboxes.MBOX0.MCF.bit.DLC = 8;
ECanaMboxes.MBOX1.MCF.bit.DLC = 8; // 把发送,接收数据的长度定义为8位
ECanaMboxes.MBOX0.MCF.bit.RTR = 0; // 无远程帧请求
// 因为RTR位在复位后状态不定,因此在程序进行初始化的时候必须对该位赋值。
ECanaMboxes.MBOX1.MCF.bit.RTR = 0;
// 把待发送的数据写入发送邮箱
ECanaMboxes.MBOX0.MDRL.all = 0x00112233;
ECanaMboxes.MBOX0.MDRH.all = 0x44556677;
ECanaMboxes.MBOX1.MDRL.all = 0x8899AABB;
ECanaMboxes.MBOX1.MDRH.all = 0xCCDDEEFF;
EALLOW;
// 邮箱中断屏蔽寄存器。上电后所有的中断屏蔽位都清零且停止中断使能。
// 这些位允许独立屏蔽任何邮箱中断。
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
// CANMIM .BIT.X=1 邮箱中断被使能(X=1~31)
// CANMIM .BIT.X=0 邮箱中断被禁止(X=1~31)
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; // 把CANMC读入影子寄存器
ECanaShadow.CANMC.bit.CCR = 1; // 改变配置请求位
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; // 把配置好的寄存器值回写
EDIS;
/*CPU要求对配置寄存器CANBTC和SCC的接收屏蔽寄存器(CANGAM,LAM[0]和LAM[3])进行写操作。对该位置位后,CPU必须等待,直到CANES寄存器的CCE标志位在送入CANBTC寄存器之前为1 */
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 1 ); // 当CCE=1时可以对CANBTC进行操作。
// 配置波特率
EALLOW;
ECanaShadow.CANBTC.all = ECanaRegs.CANBTC.all; // 把CANBTC读入影子寄存器
ECanaShadow.CANBTC.bit.BRP = 149; // (BRP+1)=150, 最小时间单位TQ=1us
ECanaShadow.CANBTC.bit.TSEG2 = 2; // 位定时bit-time=(TSEG1+1)+(TSEG1+1)+1
ECanaShadow.CANBTC.bit.TSEG1 = 3; // bit-time=8us, 所以波特率为125Kpbs
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all; // 把配置好的寄存器值回写
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all; // 把CANMC读入影子寄存器
ECanaShadow.CANMC.bit.CCR = 0 ; // 设置CCR=0, CPU请求正常模式
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all; // 把配置好的寄存器值回写
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
} while(ECanaShadow.CANES.bit.CCE != 0 ); // 等待 CCE 位被清零
// 配置eCAN为自测试模式,使能eCAN的增强特性
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.STM = 1; // 配置CAN 为自测试模式
// CANMC.bit.STM=0,正常模式,CANMC.bit.STM=1,自测试模式
ECanaShadow.CANMC.bit.SCM = 1; // 选择HECC工作模式
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
}
void main(void)
{
Uint16 j;
InitSysCtrl(); // 系统初始化程序,该子程序在DSP28_sysctrl.c中
DINT; // 关闭总中断
IER = 0x0000; // 关闭外设中断
IFR = 0x0000; // 请中断标志
CAN_INIT();
// 开始循环发送数据
while(1)
{
ECanaRegs.CANTRS.all = 0x00000003;
while(ECanaRegs.CANTA.all != 0x00000003 ) {};
ECanaRegs.CANTA.all = 0x0000FFFF;
MessageReceivedCount++;
for(j = 0; j<32;)
{
mailbox_read(j); // 把邮箱j(j=0~31)的数据读出来
j++;
// mailbox_check(TestMbox1,TestMbox2,TestMbox3); // 测试程序是否正确
}
}
}
// 该函数读出邮箱序号(MBXnbr)指示的邮箱内容.
void mailbox_read(int16 MBXnbr)
{
volatile struct MBOX *Mailbox;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
TestMbox1 = Mailbox->MDRL.all; // 读出当前邮箱数据低4字节
TestMbox2 = Mailbox->MDRH.all; // 读出当前邮箱数据高4字节
TestMbox3 = Mailbox->MID.all; // 读出当前邮箱ID
}
// 接收邮箱MBX的 MID作为MDRL 数据传输data
void mailbox_check(int32 T1,int32 T2,int32 T3)
{
if((T1 != T3) || ( T2 != 0x89ABCDEF))
ErrorCount++;
}
以上就是关于CAN模块发送流程相关问题的回答。希望能帮到你,如有更多相关问题,您也可以联系我们的客服进行咨询,客服也会为您讲解更多精彩的知识和内容。
推荐阅读: