CAN根本知识:
CAN协议的特色:
1、多主机操控。在总线空闲时,一切单元都能够发送音讯,若两个以上一起开端发送音讯,依据标识符来决议优先级。优先级高的先发送。
2、体系的若软性。与总线相连的单元没有相似地址的信息。因而在总线上添加单元时,应用层程序根本不需要改动。
3、通讯速度快,通讯间隔远。最高1Mbps(间隔小于40M),最远可达10Km(速率低于5Kbps)。
4、具有过错检测、过错告诉和过错康复功用。一切单元都能够检测过错,检测出过错的单元会当即一起告诉其他一切单元,正在发送音讯的单元一旦检测出过错,会强制完毕当时的发送。前置完毕发送的单元会不断重复地从头发送该音讯直到发送成功。
5、毛病封闭功用。CAN能够判别出过错的类型是总线上的数据过错仍是继续的数据过错。由此功用,当总线上产生继续数据过错时,能够将引起此毛病的单元从总线上阻隔出去。
6、衔接节点多。CAN总线是可一起衔接多个单元的总线。可衔接的单元总数理论上是没有约束的。单实际上遭到时刻延迟和电气负载的约束。下降通讯速度,可衔接单元添加。反之,反之。
STM32的CAN时刻特性(有关波特率):
与CAN2.0B的协议内容比较,STM32的CAN时刻特性略微有些差异。STM32把传达时刻段和相位缓冲段1兼并了,因而STM32的CAN一个位只要3段:同步段(SYNC_SEG)、时刻段1(BS1)和时刻段2(BS2)。STM的BS1段能够设置为1-16个时刻单元,刚好等于传达时刻段和相位缓冲段1之和。
波特率=1/正常的位时刻
正常的位时刻=1×tq+tbs1+tbs2
其间:tbps1=tq×(TS1[3:0]+1)
tbps2=tq×(TS2[3:0]+1)
tq=(BRP[9:0]+1)×tpclk
tq是一个时刻单元
tpclk是APB时钟的时刻周期
因而,咱们只需要知道BS1和BS2的设置,以及APB1的时钟频率(一般为36MHz),就能够便利的计算出波特率。比方设置TS1=6,TS2=7和BRP=4,在APB1频率为36MHz的条件下,即可得到CAN通讯的波特率=36000/[(7+8+1)*5]=450Kbps。
要用到的寄存器:
主操控寄存器CAN_MCR:操控进退初始化,发送FIFO优先级。
时序寄存器CAN_BTR:用来设置分频、Tbps、Tbs2以及Tsjw等非常重要的参数,直接决议了CAN的波特率。别的还能够设置作业形式(静默形式、环回形式)等。
发送邮箱标识符寄存器CAN_TIxR:该寄存器用来设置标识符(包含扩展标识符),别的还能够设置帧类型。
发送邮箱数据长度和时刻戳寄存器CAN_TDTxR:用来设置数据长度。
发送邮箱低字节数据寄存器CAN_TDLxR:用来存储即将发送的数据,只能存储低4个字节。
发送邮箱高字节数据寄存器CAN_TDHxR:用来存储即将发送的高4个字节。
接纳FIFO邮箱标识符寄存器CAN_RIxR:该寄存器用来保存接纳到的报文标识符等信息,经过读该寄存器获取相关信息。
接纳FIFO邮箱数据长度和时刻戳寄存器CAN_RDTxR;接纳FIFO邮箱低字节数据寄存器CAN_RDLxR;接纳FIFO邮箱高字节数据寄存器CAN_RDHxR,同发送。
过滤器形式寄存器CAN_FM1R:设置各滤波器组的作业形式,对28个滤波器组的作业形式,都能够经过该寄存器设置,不过该寄存器必须在滤波器处于初始化形式下才干够设置。
过滤器位宽寄存器CAN_FS1R:用于设置各滤波器组的位宽。其他同上。
上述两个寄存器用来设置过滤器。
如FSCx=1,FBMx=0:那么其间第x个寄存器组就被设置为1个32位过滤器-标识符屏蔽,此刻本滤波器组能够设置成1个过滤器。(见参考手册P432)
如FSCx=1,FBMx=1:那么其间第x个寄存器组就被设置为2个32位过滤器-标识符列表,此刻本滤波器组能够设置成2个过滤器。
如FSCx=0,FBMx=1:那么其间第x个寄存器组就被设置为2个16位过滤器-标识符屏蔽,此刻本滤波器组能够设置成2个过滤器。
如FSCx=0,FBMx=0:那么其间第x个寄存器组就被设置为4个16位过滤器-标识符列表,此刻本滤波器组能够设置成4个过滤器。
28个过滤器组能够被设置为远大于28个过滤器数目。
每个FIFO各自对其相关的过滤器进行编号。过滤器组相关设置经过寄存器CAN_FFA1R即过滤器FIFO相关寄存器来设置。
过滤器激活寄存器CAN_FA1R:该寄存器来操控过滤器的激活与否。1敞开0封闭。
过滤器组i的寄存器x CAN_FiRx:用来寄存过滤参数。
STM32 CAN总线初始化进程:
1、装备相关引脚的复用功用,使能CAN时钟。
使能CAN时钟,经过APB1ENR的第25位来设置。其非必须设置CAN的相关引脚为复用输出,设置为上拉输入(CAN_RX),设置为复用输出(CAN_TX),并使能PA口的时钟。
2、设置CAN作业形式及波特率等。
先设置CAN_MCR寄存器的INRQ位,让CAN进入初始化形式,然后设置CAN_MCR的其他相关操控位,再经过CAN_BTR设置波特率和作业形式(正常形式/环回形式)等信息。最终设置INRQ为0,退出初始化形式。
3、设置滤波器。
设置CAN_FMR的FINIT位,让过滤器组作业在初始化形式下,然后设置滤波器组0的作业形式以及标识符ID和屏蔽为。最终激活滤波器。并退出滤波器初始化形式。假如用到中止,还要装备中止形式。
详细的:
怎么初始化CAN:
1、使能相关时钟(PORTA时钟,CAN时钟),初始化引脚RX和TX。
2、设置CAN_MCR,退出睡觉形式,一起设置参数。根本是一切位清零。关于睡觉形式,CAN在复位后都是进入睡觉形式,当然也能够设置主动唤醒形式等。
3、恳求CAN进入初始化形式,对CAN_MSR的位0置1。等候进入初始化,查验MCR位0 INAK的值,当真实变为1的时分,在进行下一步。由于这个进程或许不是瞬间完结的,假如当时有CAN活动,就会比及本次活动完毕后再进入初始化形式,硬件对INAK方位1。
4、设置CAN_MCR的各位,位2-位7。设置位时序寄存器CAN_BTR的各位,在这里能够设置静默形式、环回形式、波特率。
5、恳求CAN退出初始化形式。设置MCR的位0.等候彻底退出初始化形式,经过查验MSR的位。
6、初始化过滤器(初始化寄存器不是在CAN初始化形式下进行的,而是过滤器组作业到初始化形式)。设置过滤器主控寄存器CAN_FMR的位0,使过滤器组作业在初始化形式。
7、设置过滤器激活寄存器CAN_FA1R来禁用相应的过滤器,由于只要对相应位清零或许对CAN_FME的FINIT位设置位1,才干修正相应的过滤器寄存器CAN_FiRx。
8、设置过滤器形式CAN_FM1R(标识符屏蔽形式or标识符列表形式);设置过滤器位宽寄存器CAN_FS1R(1个32位的过滤器or2个16位的过滤器);设置过滤器FIFO相关寄存器CAN_FFA1R(过滤器相关到FIFO0仍是FIFO1傍边)。
9、填写过滤器标识和屏蔽。经过设置寄存器CAN_FiR1和CAN_FiR2来设置标识(ID)和屏蔽(MASK)。
10、激活过滤器,CAN_FA1R位0设置为1。
11、过滤器进入正常作业形式,CAN_FMR位0清零
怎么发送一个报文:
1、判别三个邮箱中哪个为空(CAN_TSR的位26位27位28),哪个为空用哪个?假如没有空邮箱,则退出本次发送进程。
2、铲除发送邮箱标识符寄存器(由于要填写新的标识符)。
3、设置发送邮箱的标识符寄存器CAN_TIxR。
4、设置发送邮箱的数据长度和时刻戳寄存器CAN_TDTxR。
5、填写要发送的数据,即设置发送邮箱凹凸字节数据寄存器CAN_TDHxR和CAN_TDLxR。
6、对标识符寄存器CAN_TIxR的位0即TXRQ方位1,来恳求发送邮箱的数据。当数据发送完结后,硬件对其清零。
7、查询发送状况,经过查询发送状况寄存器CAN_TSR。根本查询三个状况参数。位0 RQCP1邮箱0(纷歧定是0,看运用的是哪个邮箱了)恳求完结;位1 TXOK0邮箱0发送成功;位26发送邮箱0位为空,没有等候发送的报文。当这三项都成功后,回来发送成功。
怎么接纳一个报文:
1、查询FIFO里边是否存在有用报文,查询接纳FIFO0寄存器CAN_RF0R的位1:0当时接纳FIFO中寄存的报文数目。假如有数据,下一步将数据读出。
2、判别标识符类型,接纳来的报文是选用规范标识符仍是扩展标识符。CAN_RIxR的位2 IDE。
3、依据不同类型的标识符来做不同的操作。详细可检查CAN_RIxR的位31:3。扩展标识符低字节存在位20:3。扩展标识符或规范标识符存在位31:21。扩展标识符39位,规范标识符11位。
4、查询CAN_RIxR的位1来判定是数据帧仍是长途帧。
5、查询CAN_RDTxR位3:0获取数据帧的数据长度。
6、读取接纳FIFO邮箱凹凸字节数据寄存器CAN_RDLxR和CAN_RDHxR。
7、开释FIFO邮箱。CAN_RF0R的位5。
怎么使CAN接纳作业在中止形式下:
1、经过寄存器CAN_IER来设置中止使能,正常情况下运用位1,FMPIE0:FIFO0音讯挂号中止使能置1。
2、中止分组
3、写中止处理函数(较自在)。能够经过设置中止使能来屏蔽有写中止,假如中止都翻开的话就需要在中止处理函数里边来进行判别处理。由于每个CAN只要4个主中止,即发送中止、接纳FIFO0中止、接纳FIFO1中止和SCE中止。
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/jishu/257840.html