标题:
stm32 CAN(转载2_stm32库应用
[打印本页]
作者:
fghser
时间:
2011-3-25 10:43
标题:
stm32 CAN(转载2_stm32库应用
发送报文的流程为:利用法式挑选1个空发送邮箱;设置标识符、数据长度和待发送数据;然后
为知足这一需求,bxCAN为利用法式供给了14个位宽可变的、可设置装备摆设的过滤器组(13~0),以便只领受那些软件需求的报文。硬件过滤的做法节省了CPU开支,不然就必需由软件过滤从而占用肯定的CPU开支。每个过滤器组x由2个32位寄放器CAN_FxR0和CAN_FxR1构成。 位宽为32位的过滤器,优先级高于位宽为16位的过滤器;
3.[设置DLC待传输动态的帧长度]
软件经过对CAN_MCR寄放器的INRQ位置1,来恳求bxCAN进入初始化方式,然前期待硬件对CAN_MSR寄放器的INAK位置1来停止确认。
函数如下:
领受办理
CAN总线是多主机通讯的,不是点对点或许一主多从方式,系多主机的情况下,不然会使良多主机无法停止通讯,从而招致致命的结果,CAN总线普通用于很实时的情况。
stm32 CAN(转载2_stm32库应用,软件经过对CAN_MCR寄放器的INRQ位清0,来恳求bxCAN加入初始化方式,当硬件对CAN_MSR寄放器的INAK位清0就确认了初始化方式的加入。
过滤器初值的设置不需求在初始化方式下停止,但必需在它处在非激活形状下完成(呼应的FACT位为0)。而过滤器的位宽和方式的设置,则必需在进入普通方式之前,即初始化方式下完成。
─CAN进入睡眠方式。
普通方式
为了过滤出一个标识符,理应设置过滤器组任务在标识符列表方式。
发送方面搞定了,但领受方面呢?似乎在主法式里看不到有领受的语句。
再看看发送法式:
关于位宽不异的过滤器,标识符列表方式的优先级高于屏障位方式;
发送者以广播的方stm32 CAN(转载2_stm32库应用式把报文发送给一切的领受者(注:不是一对一通讯,而是多机通讯)节点在领受报文时依照标识符的值选择软件能否需求该报文;若是需求,就拷贝到SRAM里;若是不需求,报文就被抛弃且无需软件的干与。一旦往FIFO取出1个报文,硬件就会更新FMP[1:0]位,并且若是CAN_IER寄放器的FMPIE位为1,那么就会发作一个中缀恳求。中缀函数实施完后关中缀是要让出总线周期让其它的主机利用。
经过设置CAN_FM0R的FBMx位,能够设置装备摆设过滤器组为标识符列表方式或屏障位方式。
─FIFO0领受到一个新报文,CAN_RF0R寄放器的FMP0位不再是‘00’。
1.[挑选一个空的发送邮箱]
由标识符选择。当有跨越1个发送邮箱在挂号时,发送挨次由邮箱中报文的标识符选择。依照CAN和谈,标识符数值最低的报文具有最高的优先级。若是标识符的值相等,那么邮箱号小的报文先被发送。
领受邮箱(FIFO)
─发送邮箱0变为空,CAN_TSR寄放器的RQCP0位被置1。
─犯错情况,关于犯错情况的详细动态请参考CAN过失形状寄放器(CAN_ESR)。
有2种体例能够叫醒(加入睡眠方式)bxCAN:经过软件对SLEEP位清0,或硬件检测CAN总线的勾当。
发送的优先级能够由标识符或发送恳求顺序选择:
由发送恳求顺序选择。经过对CAN_MCR寄放器的TXFP位置1,能够把发送邮箱设置装备摆设为发送FIFO。在该方式下,发送的优先级由发送恳求顺序选择。该方式对分段发送很有效。
中缀
睡眠方式(低功耗)
标识符过滤
原本是用中缀体例来领受数据,原本它和串口一样能够有两种体例领受数据,一种是中缀一种是轮询,若采用轮询体例则要挪用主函数的CAN_Polling(void)函数。
在该方式下,CAN硬件的外部按时器被激活,并且被用于发作时分戳,别离存储在CAN_RDTxR/CAN_TDTxR寄放器中。外部按时器在领受和发送的帧肇端位的采样点位置被采样,并生成时分戳。
─发送邮箱2变为空,CAN_TSR寄放器的RQCP2位被置1。
好了,到读详细考试考试法式的时分了,这时分当然要翻开“STM32库函数”的资料,因为它外面有STM32打包好的库函数的注释,对读法式很有辅佐。
(4)过失和形状转变中缀可由下列事务发作:
当FIFO变满时(即第3个报文被取出),CAN_RFxR寄放器的FULL位就被置1,并且若是CAN_IER寄放器的FFIE位为1,那么就会发作一个满中缀恳求。
接着又碰着一个成绩,为什么中缀函数CAN_Interrupt(void)的最后要关中缀呢?
─FIFO1领受到一个新报文,CAN_RF1R寄放器的FMP1位不再是‘00’。
任务方式
过滤器优先级法则:
─叫醒情况,在CAN领受引脚上监视到帧肇端位(SOF)。
过滤器的方式的设置:
为了过滤出一组标识符,理应设置过滤器组任务在屏障位方式。
在领受到一个报文后,软件就能够拜候领受FIFO的输入邮箱来读取它。一旦软件处置了报文(如把它读进去),软件就理应对CAN_RFxR寄放器的RFOM位停止置1,来开释该报文,以便为前面收到的报文留出存储空间。
利用法式不用的过滤器组,理应连结在禁用形状。
恳求发送语句:
上面是主法式:
CAN_TIxR寄放器的TXRQ位置1,来恳求发送。TXRQ位置1后,邮箱就不再是空邮箱;而一旦邮箱不再为空,软件对邮箱寄放器就不再有写的权限。TXRQ位置1后,邮箱马出息入挂号形状,并期待成为最高优先级的邮箱,拜见发送优先级。一旦邮箱成为最高优先级的邮箱,其形状就变为预定发送形状。当CAN总线进入空闲形状,预定发送邮箱中的报文就顿时被发送(进入发送形状)。邮箱中的报文被胜利发送后,它顿时变为空邮箱,硬件呼应地对CAN_TSR寄放器的RQCP和TXOK位置1,来剖明一次胜利发送。
时分触发通讯方式:
在初始化完成后,软件理应让硬件进入普通方式,同步CAN总线,以便普通领受和发送报文。软件经过对INRQ位清0来恳求从初始化方式进入普通方式,然后要期待硬件对INAK位清0来确认。在跟CAN总线取得同步,即在CANRX引脚上监测到11个继续的隐性位(等效于总线空闲)后,bxCAN才干普通领受和发送报文。
bxCAN占用4个公用的中缀向量。经过设置CAN中缀承诺寄放器CAN_IER,每个中缀源都能够零丁承诺和禁用。
领受到的报文,被存储在3级邮箱深度的FIFO中。FIFO完整由硬件来办理,从而节省了CPU的处置负荷,简化了软件并保证了数据的不合性。利用法式只能经过读取FIFO输入邮箱,来读取FIFO中最先收到的报文。依照CAN和谈,当报文被准确领受(直到EOF域的最后1位都没有过失),且经过了标识符过滤,那么该报文被以为是有效报文。
接着又是如何领受报文的呢?
─发送邮箱1变为空,CAN_TSR寄放器的RQCP1位被置1。
初始化方式
stm32库利用软件经过对CAN_MCR寄放器的SLEEP位置1,来恳求进入这一方式。在该方式下,bxCAN的时钟遏制了,但软件依然能够拜候邮箱寄放器。
若是发送失利,因为仲裁惹起的就对CAN_TSR寄放器的ALST位置1,因为发送过失惹起的就对TERR位置1。
bxCAN有3个主要的任务方式:初始化、普通和睡眠方式。
在CAN和谈里,报文的标识符不代表节点的地址,而是跟报文的形式相关的。因此,发送者以广播的方式将报文发送给一切的接收者。
领受相关的中缀前提
(2)FIFO0中缀可由下列事务发作:
当bxCAN处于初始化方式时,报文的领受和发送都被制止,并且CANTX引脚输入隐性位(高电平)。初始化CAN放纵器,软件必需设置CAN_BTR和CAN_MCR寄放器。
当bxCAN处于睡眠方式,软件想经过对CAN_MCR寄放器的INRQ位置1,来进入初始化式,那么软件必需同时对SLEEP位清0才行。
(3)FIFO1中缀可由下列事务发作:
那么事实can是如何发送报文的呢?
节点在领受报文时依照标识符的值选择能否需求该报文;若是需求,就拷贝到SRAM里;若是不需求,报文就被抛弃且无需软件的干与。
(1)发送中缀可由下列事务发作:
任务流程
一旦往FIFO取出1个报文,硬件就会更新FMP[1:0]位,并且若是CAN_IER寄放器的FMPIE位为1,那么就会发作一个中缀恳求。
//到128次11位继续的隐性位,就加入离线形状。
位宽和方式都不异的过滤器,优先级由过滤器号选择,过滤器号小的优先级高。
任务流程大要就是这个样子,接着就是一大堆烦人的can寄放器,看了一遍总算有了大要的体会,况且这么多的寄放器要一会儿把他们都记住是不成能的。依照以往的经历,只需用多几回,对寄放器的功用就能记住。
在溢出的情况下,FOVR位被置1,并且若是CAN_IER寄放器的FOVIE位为1,那么就会发作一个溢出中缀恳求。
欢迎光临 珩源工控论坛 (http://bbs.hymcu.com/)
Powered by Discuz! 7.2