can双节点通信说明Word文档格式.docx
- 文档编号:3685336
- 上传时间:2023-05-02
- 格式:DOCX
- 页数:11
- 大小:21.63KB
can双节点通信说明Word文档格式.docx
《can双节点通信说明Word文档格式.docx》由会员分享,可在线阅读,更多相关《can双节点通信说明Word文档格式.docx(11页珍藏版)》请在冰点文库上搜索。
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&
GPIO_InitStructure);
上面是我们为了看通信状态
初始化的几个led灯接口
下面是gpio
can端口初始化
注意gpio
模式
/*ConfigureCANpin:
RX*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_Init(GPIOD,&
TX*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
stm32
can
发送配置
TestStatusCAN_Polling(void)
{u8Error;
CAN_InitTypeDef
CAN_InitStructure;
CAN_FilterInitTypeDef
CAN_FilterInitStructure;
CanTxMsgTxMessage;
申请报文空间
//CanRxMsgRxMessage;
u32i=0;
u8TransmitMailbox;
/*CANregisterinit*/
CAN_DeInit();
CAN_StructInit(&
CAN_InitStructure);
/*CANcellinit*/
CAN_InitStructure.CAN_TTCM=DISABLE;
CAN_InitStructure.CAN_ABOM=DISABLE;
CAN_InitStructure.CAN_AWUM=DISABLE;
CAN_InitStructure.CAN_NART=DISABLE;
CAN_InitStructure.CAN_RFLM=DISABLE;
CAN_InitStructure.CAN_TXFP=DISABLE;
CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
正常模式
CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
CAN_InitStructure.CAN_Prescaler=5;
设置波特率
这是can的难点
以后我会跟帖讲一下这个方面
Error=CAN_Init(&
if(Error==0)
returnFAILED;
判断初始化是否成功
不成功我们会有灯显示
/*CANfilterinit*/
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
为过滤器分配缓存此处到fifo
因为CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&
CAN_FilterInitStructure);
/*transmit*/
TxMessage.StdId=0x11;
标准标识符11位
TxMessage.RTR=CAN_RTR_DATA;
TxMessage.IDE=CAN_ID_STD;
TxMessage.DLC=2;
数据长度2
TxMessage.Data[0]=0xCA;
发送的数据
TxMessage.Data[1]=0xFE;
TransmitMailbox=CAN_Transmit(&
TxMessage);
发送数据
下面语句等待发送完成
i=0;
while((CAN_TransmitStatus(TransmitMailbox)!
=CANTXOK)&
&
(i!
=0xFF))
{
i++;
}
ok
以上即是
发送的一个基本配置
也可以说是一个配制方法
16:
08)
下面说以接受端的配置基本上是一样的也必须是一样的
接受我们采用中断接受当然循环查询接受会很简单
gpio和can接口配置就不再说了
{u8Error;
//CanTxMsgTxMessage;
//CanRxMsgRxMessage;
//u32i=0;
//u8TransmitMailbox;
//CAN_Mode_LoopBack;
Error=CAN_Init(&
以上和发送一样
CAN_ITConfig(CAN_IT_FMP0,ENABLE);
唯一不同我们要开启中断
中断函数里的程序
voidUSB_LP_CAN_RX0_IRQHandler(void)
u8TestRx;
CanRxMsgRxMessage;
GPIO_SetBits(GPIOC,GPIO_Pin_8);
RxMessage.StdId=0x00;
RxMessage.ExtId=0x00;
RxMessage.IDE=0;
RxMessage.DLC=0;
RxMessage.FMI=0;
RxMessage.Data[0]=0x00;
RxMessage.Data[1]=0x00;
CAN_Receive(CAN_FIFO0,&
RxMessage);
#if0
if((RxMessage.StdId==0x12)&
(RxMessage.ExtId==0x34)&
(RxMessage.IDE==CAN_ID_EXT)
(RxMessage.DLC==2)&
((RxMessage.Data[1]|RxMessage.Data[0]<
<
8)==0xDECA))
ret=1;
else
ret=0;
#endif
TestRx=PASSED;
if(RxMessage.StdId!
=0x12)
TestRx=FAILED;
if(RxMessage.IDE!
=CAN_ID_STD)
if(RxMessage.DLC!
=2)
if((RxMessage.Data[0]<
8|RxMessage.Data[1])!
=0xCAFE)判断接受和发送的是不是一样用led
来显示
if(TestRx==FAILED){
GPIO_SetBits(GPIOC,GPIO_Pin_9);
//TurnonledconnectedtoPC.08pin(LD3)
else{
GPIO_SetBits(GPIOC,GPIO_Pin_6);
//TurnonledconnectedtoPC.06pin(LD1)
//返回数据
TestRx=CAN_Polling();
if(TestRx==FAILED)
/*TurnonledconnectedtoPC.08pin(LD3)*/
GPIO_SetBits(GPIOC,GPIO_Pin_8);
/*TurnonledconnectedtoPC.06pin(LD1)*/
配置完成
20:
38)
程序通信过程为发送端初始化成功后点灯
发送完成后点灯
接收到进入中断点灯接受完成并且一样的话点灯
然后返回接收数据
好了对大家最重要的
源代码
canrx.rar
(2009-04-1912:
38,Size:
281KB,Downloads:
340)
cantx.rar
289)
当然只有回复才能看到还好不要积分
23:
16)
can的难点就在于
波特率的设定
如果是近距离通信
几十米
那就可以忽略了
如果几公里
波特率位序时序都需要好好计算
不然通信是不成功的
稍后我将优化代码的同时
为大家讲一下波特率
各个参数的计算
cangbai(2009-4-1917:
40:
10)
谢了,楼主!
zwc58(2009-4-1917:
47:
47)
多谢分享。
crazyjack(2009-4-2010:
26:
01)
什么时候讲讲波特率的设置?
wanmei_100(2009-4-2018:
31:
32)
谢谢上传!
fzxuecumt88(2009-4-2020:
51:
07)
我顶!
很好啊,楼主。
下面还有吗?
lovour(2009-4-2021:
13:
50)
Can控制器器只需要进行少量的设置就可以进行通信,就可以像RS232/48那样使用。
其中较难设置的部分就是通信波特率的计算。
CAN总线能够在一定的范围内容忍总线上CAN节点的通信波特率的偏差,这种机能使得CAN总线有很强的容错性,同时也降低了对每个节点的振荡器精度。
实际上,CAN总线的波特率是一个范围。
假设定义的波特率是250KB/S,但是实际上根据对寄存器的设置,实际的波特率可能为200~300KB/S(具体值取决于寄存器的设置)。
简单介绍一个波特率的计算,在CAN的底层协议里将CAN数据的每一位时间(TBit)分为许多的时间段(Tscl),这些时间段包括:
A.位同步时间(Tsync)
B.时间段1(Tseg1)
C.时间段2(Tseg2)
其中位同步时间占用1个Tscl;
时间段2占用(Tseg1+1)个Tscl;
时间段2占用(Tseg2+1)个Tscl,所以CAN控制器的位时间(TBit)就是:
TBit=Tseg1+Tseg2+Tsync=(TSEG1+TSEG2+3)*Tscl,那么CAN的波特率
(CANbps)就是1/TBit。
但是这样计算出的值是一个理论值。
在实际的网络通信中由于存在传输的延时、不同节点的晶体的误差等因素,使得网络CAN的波特率的计算变得复杂起来。
CAN在技术上便引入了重同步的概念,以更好的
解决这些问题。
这样重同步带来的结果就是要么时间段1(Tseg1)增加TSJW(同步跳转宽度SJW+1),要么时间段减少TSJW,因此CAN的波特率实际上有一个范围:
1/(Tbit+Tsjw)≤CANbps≤1/(Tbit-Tsjw)
CAN有波特率的值四以下几个元素决定:
A.最小时间段Tscl;
B.时间段1TSEG1;
C.时间段2TSEG2;
D.同步跳转宽度SJW
那么Tscl又是怎么计算的呢?
这是总总线时序寄存器中的预分频寄存器BRP派上了用场,Tscl=(BRP+1)/FVBP。
FVBP为微处理器的外设时钟。
而TSEG1与TSEG2又是怎么划分的呢?
TSEG1与TSEG2的长度决定了CAN数据的采样点,这种方式允许宽范围的数据传输延迟和晶体的误差。
其中TSEG1用来调整数据传输延迟时间造成的误差,而TSEG2则用来调
整不同点节点晶体频率的误差。
但是他们由于过于灵活,而使初次接触CAN的人有点无所适从。
TSEG1与TSEG2的是分大体遵循以下规则:
Tseg2≥Tscl2,Tseg2≥2TSJW,Tseg1≥Tseg2
总的来说,对于CAN的波特率计算问题,把握一个大的方向就行了,其计算公式可了规结为:
BitRate=Fpclk/((BRP+1)*((Tseg1+1)+(Tseg2+1)+1)
关于CAN的波特率的计算,在数据手册上已经有很详细的说明。
在此,简要的把计算方法给出来:
Tcsc:
bit位每一编码的时间长度,每bit可以配置为8~25位编码,常设为16。
Tcsc=1/波特率/编码长度;
按上计算Tcsc=1/1MHz/16=62.5ns(取63)。
BRP=(TcscxMCK)-1=6.3-1(可以取5)
各种延迟(Tprs:
)
Delayofthebusdriver:
50ns
Delayofthereceiver:
30ns
Delayofthebusline(20m):
110ns
Tprs=2*(50+30+110)ns=380ns
PROPAG=380ns/Tcsc-1=6.08Tcsc-1(可取6)
Tphs1+Tphs2=bittime-Tcsc-Tprs=(16-1-7)Tcsc=8
常取Tphs1=Tphs2,所以Tphs1=Tphs2=4;
Tsjw=Min(4Tcsc,Tphs1)=4Tcsc(From1toTphs1)
SJW=Tsjw/Tcsc-1=3;
现在CAN_BR中的各个参数就都有了(BRP=5;
SJW=3;
PROPAG=6;
PHASE1=PHASE=4),填进去就应该OK了。
假设我们先不考虑BTR0中的SJW位和BTR1中的SAM位。
那么,BTR0和BTR1就是2个分频系数寄存器;
它们的乘积是一个扩展的分频系数。
即:
BTR0×
BTR1=F_BASE/Fbps
(1)
其中:
内部频率基准源F_BASE=Fclk/2,即外部晶振频率Fclk的2分频。
注意任何应用中,当利用外部晶振作为基准源的时候,都是先经过2分频整形的。
(1)式中,当晶振为16M时,F_BASE=8000K
当晶振为12M时,F_BASE=6000K
Fbps就是我们所希望得到的CAN总线频率。
单位为K。
设
(1)式中BTR0=m,BTR1=n,外部晶振16M,则有:
n=8000/
Fbps
(2)
这样,当Fbps取我们希望的值时,就会得到一个m*n的组合值。
当n选定,m值也唯一。
n值CAN规范中规定8~25。
(也就是BTR1的值)基本原则为:
Fbps值越高时,选取n(通过设置BTR1)值越大。
其原因不难理解。
我假定一般应用中选取n=10,也就是:
同步段+相位缓冲段1+相位缓冲段2=1+5+4
则
(2)式简化为
m=800/Fbps
m的最大设置值为64,SJA1000最大分频系数m*n=64x25=1600。
因此标准算法中通常以16M晶振为例。
其实有了公式
(1),任何晶振值(6M~24M)都很容易计算。
SAM的确定:
低频时,选SAM=1,即采样3次。
高频100K以上时,取SAM=0,即采样1次。
SJA重同步跳宽选取:
与数字锁相环技术有关。
n值选得大时,SJA可以选得大,即一次可以修正多个脉冲份额Tscl。
n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- can 节点 通信 说明
![提示](https://static.bingdoc.com/images/bang_tan.gif)