1. <dl id="nzllo"></dl>

              1. <output id="nzllo"><ins id="nzllo"></ins></output>
                1. <dl id="nzllo"></dl>
                  <output id="nzllo"></output>

                      
                      

                      <dl id="nzllo"></dl>

                      <dl id="nzllo"><ins id="nzllo"><thead id="nzllo"></thead></ins></dl>
                      <dl id="nzllo"></dl>

                        • 欢迎来到 - 我就爱电子网 - http://www.mkld.icu £¡
                        您的位置£º> 我就爱电子网 ¡ú电子文章 ¡ú 接口定义¡úAT90CAN的CAN通信模块驱动设计及C编程 -- 正文
                        正文

                        AT90CAN的CAN通信模块驱动设计及C编程

                        [10-21 14:24:02]   来源£ºhttp://www.mkld.icu  接口定义   阅读£º9999

                        ¡¡

                        概要£º¡£MOB用来描述一帧完整的CAN报文信息£¬每个MOB拥有独立的工作寄存器组(详见参考文献\[1\])£¬这些寄存器规定了CAN通信报文的帧格?#25509;?#24037;作模式¡£CAN通用控制寄存器里的CANPAGE寄存器为15个MOB规定了相对应的BUFFER地址和指针£¬用来存放通信时发出或接收到的数据以及保存MOB寄存器组的设置¡£对MOB的寄存器组进行初始化设置后£¬CAN控制器根据MOB的不同设置£¬就可以分别实现数据的发送¡¢接收以及过滤功能£¬整个工作过程不需要CPU干预£¬简化了软件代码的编写¡£而CPU通过访问CAN控制器状态寄存器或者由CAN控制器以中断的方式通知CPU£¬即可得到当前通信状态£¬从而大大节省了CPU的占用时间¡£2 CAN控制器的初始化要实现CAN通信£¬首先要对CAN控制器进行正确的初始化设置¡£初始化过程包括对CPU的引脚功能¡¢CAN通信波特?#30465;?#20013;断优先级和MOB寄存器的设置等¡£在编写驱动的过程中£¬需要注意的是在完成对CANPAGE寄存器的设置后£¬再进行MOB的设置£»否则£¬MOB的初始?#21040;?#19981;能被保存£¬导致系统初始化失败¡£其基本初始化流程如图1所示¡£其中阴影部分是必须初始化的部分£¬其他部分可以根据?#23548;?#31243;序功能的需要予以设置¡£图1 CAN控制器初始化流程CAN控制器初始化程序£º#define

                        AT90CAN的CAN通信模块驱动设计及C编程,http://www.mkld.icu

                        ¡¡¡¡CAN总线通信?#29616;?#19968;般的通信总线而言£¬其数据通信具有突出的可靠性¡¢实时性和灵活性£¬应用范围也早已不再局限于汽车行业£¬而是扩展到了机器人¡¢数控机床¡¢家用电器等领域¡£CAN控制器用来实现统一的CAN通信协议¡£CAN控制器分为两种£º 一种是独立的控制芯片£¬如SJA1100£»另一种是将其集成在微控制器内部£¬例如Atmel公司最新推出的AT90CAN系列单片机¡£与使用独立的CAN控制器相比£¬自身集成了CAN接口的微控制器在简化?#24067;?#30005;路设计的同时£¬提高了软件开发的效?#30465;?/P>

                        ¡¡¡¡1  AT90CAN单片机CAN控制器特性

                        ¡¡¡¡AT90CAN单片机的CAN控制器能够兼容CAN2.0A和CAN2.0B通信协议£¬内部设有120字节的邮箱?#21344;ä£?#23427;由15个MOB£¨Message Object£©与CAN DATA BUFFER组成¡£MOB用来描述一帧完整的CAN报文信息£¬每个MOB拥有独立的工作寄存器组(详见参考文献\[1\])£¬这些寄存器规定了CAN通信报文的帧格?#25509;?#24037;作模式¡£CAN通用控制寄存器里的CANPAGE寄存器为15个MOB规定了相对应的BUFFER地址和指针£¬用来存放通信时发出或接收到的数据以及保存MOB寄存器组的设置¡£对MOB的寄存器组进行初始化设置后£¬CAN控制器根据MOB的不同设置£¬就可以分别实现数据的发送¡¢接收以及过滤功能£¬整个工作过程不需要CPU干预£¬简化了软件代码的编写¡£而CPU通过访问CAN控制器状态寄存器或者由CAN控制器以中断的方式通知CPU£¬即可得到当前通信状态£¬从而大大节省了CPU的占用时间¡£

                        ¡¡¡¡2  CAN控制器的初始化

                        ¡¡¡¡要实现CAN通信£¬首先要对CAN控制器进行正确的初始化设置¡£初始化过程包括对CPU的引脚功能¡¢CAN通信波特?#30465;?#20013;断优先级和MOB寄存器的设置等¡£在编写驱动的过程中£¬需要注意的是在完成对CANPAGE寄存器的设置后£¬再进行MOB的设置£»否则£¬MOB的初始?#21040;?#19981;能被保存£¬导致系统初始化失败¡£

                        ¡¡¡¡其基本初始化流程如图1所示¡£其中阴影部分是必须初始化的部分£¬其他部分可以根据?#23548;?#31243;序功能的需要予以设置¡£


                        ¡¡¡¡图1  CAN控制器初始化流程

                        ¡¡¡¡CAN控制器初始化程序£º

                        ¡¡¡¡#define CAN_PORT_INPIND

                        ¡¡¡¡#define CAN_PORT_DIR DDRD

                        ¡¡¡¡#define CAN_PORT_OUT PORTD

                        ¡¡¡¡#define CAN_INPUT_PIN6

                        ¡¡¡¡#define CAN_OUTPUT_PIN5

                        ¡¡¡¡void CAN_INIT() {

                        ¡¡¡¡CAN_PORT_DIR &= ~(1<<CAN_INPUT_PIN )£»

                        ¡¡¡¡CAN_PORT_DIR &= ~(1<<CAN_OUTPUT_PIN)£»

                        ¡¡¡¡CAN_PORT_OUT |=(1<<CAN_INPUT_PIN )£»

                        ¡¡¡¡CAN_PORT_OUT |=(1<<CAN_OUTPUT_PIN)£»//配置单片机TD¡¢RD引脚功能

                        ¡¡¡¡CANTCON=0x00£»//CAN时钟寄存器清零

                        ¡¡¡¡CANGCON |= 0x01£»//软件复位

                        ¡¡¡¡CANBT1=0x06£»

                        ¡¡¡¡CANBT2=0x2a£»

                        ¡¡¡¡CANBT3=0x13£»//设置通信波特率为250kbps

                        ¡¡¡¡CANIE2 |= 0x60£»//使能MOB5¡¢MOB6

                        ¡¡¡¡CANIE1 |= 0x01£»//使能MOB0

                        ¡¡¡¡CANGIE = 0xA0£» //使能CAN中断

                        ¡¡¡¡CANGCON |= 0x02£»//CAN控制器启动

                        ¡¡¡¡}

                        ¡¡¡¡3  AT90CAN单片机与PC机CAN通信实例

                        ¡¡¡¡下面以如?#38382;?#29616;AT90CAN单片机与PC机间的CAN通信为例£¬进一步?#24471;÷AT90CAN单片机的CAN功能模块驱动的编制流程£¬如图2所示£¬并给出C语言编写的CAN通信程序¡£它的功能是接收PC机经由专用的PCICAN模块扩展的CAN接口发出的数据£¬并将收到的数据与验收过滤器寄存器中设定的ID?#24403;?#36739;¡£如果ID值相符£¬则将数据重新编制ID后发给PC机¡£


                        ¡¡¡¡图2  与PC机CAN通信软件流程

                        ¡¡¡¡以下程序已在实验中调试通过£¬通信效果良好£¬可以直接应用¡£

                        ¡¡¡¡#include "ioCAN128v.h"

                        ¡¡¡¡#include <stdio.h>

                        ¡¡¡¡#include <macros.h>

                        ¡¡¡¡#define fosc 11059200//晶振11.0592 MHz

                        ¡¡¡¡unsigned char PCSJ\[8\]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}£»//数组用来存放接收到的数据

                        ¡¡¡¡void main() {//主程序

                        ¡¡¡¡CLI()£»//关总中断

                        ¡¡¡¡void CAN_INIT()£»//CAN控制器初始化

                        ¡¡¡¡CANPAGE = 0x50£»//设置MOB5

                        ¡¡¡¡CANSTMOB=0x00£»//清状态寄存器

                        ¡¡¡¡CANIDT1 = 0x02£»//CANIDT1¡«CANIDT4

                        ¡¡¡¡CANIDT2 = 0x01£»//设置ID过滤寄存器

                        ¡¡¡¡CANIDT3 = 0x00£»

                        ¡¡¡¡CANIDT4 = 0x00£»

                        ¡¡¡¡CANIDM1 = 0xff£»//CANIDM1¡«CANIDM4

                        ¡¡¡¡CANIDM2 = 0xff£»//设置验收寄存器

                        ¡¡¡¡CANIDM3 = 0x00£»

                        ¡¡¡¡CANIDM4 = 0x00£»

                        ¡¡¡¡CANCDMOB = 0x98£»//使能接收

                        ¡¡¡¡SEI();//打开总中断

                        ¡¡¡¡while(1) {

                        ¡¡¡¡CANPAGE=0x10£»//设置MOB4

                        ¡¡¡¡CANSTMOB=0x00£»

                        ¡¡¡¡CANIDT1 = 0x01£»//CANIDT1¡«CANIDT4

                        ¡¡¡¡CANIDT2 = 0x01£»//设置发送帧ID?#23548;?#23384;器

                        ¡¡¡¡CANIDT3 = 0x00£»

                        ¡¡¡¡CANIDT4 = 0x00£»

                        ¡¡¡¡for(i = 0£»i<8£»i++) {

                        ¡¡¡¡CANMSG=PCSJ[i]£» //将接收到的数据发送回上位机

                        ¡¡¡¡}

                        ¡¡¡¡CANCDMOB=0x58£»//使能发送

                        ¡¡¡¡CANSTMOB&=~(1<<TXOK)£»//清TXOK标志

                        ¡¡¡¡wait(2);

                        ¡¡¡¡}

                        ¡¡¡¡}

                        ¡¡¡¡实例中数据接收由MOB5产生中断完成£¬中断服务子程序如下£º

                        ¡¡¡¡#pragma interrupt_handler can_isr:19//CAN控制器中断向量入口

                        [1] [2]  下一页


                        标签:接口定义£¬接口技术大全,微机原理与接口技术£¬接口定义
                        ¡¶AT90CAN的CAN通信模块驱动设计及C编程¡·相关文章
                        ¾º²Ê×ãÇò»ìºÏ¹ý¹Ø·çÏÕ

                                  1. <dl id="nzllo"></dl>

                                    1. <output id="nzllo"><ins id="nzllo"></ins></output>
                                      1. <dl id="nzllo"></dl>
                                        <output id="nzllo"></output>

                                            
                                            

                                            <dl id="nzllo"></dl>

                                            <dl id="nzllo"><ins id="nzllo"><thead id="nzllo"></thead></ins></dl>
                                            <dl id="nzllo"></dl>

                                                        1. <dl id="nzllo"></dl>

                                                          1. <output id="nzllo"><ins id="nzllo"></ins></output>
                                                            1. <dl id="nzllo"></dl>
                                                              <output id="nzllo"></output>

                                                                  
                                                                  

                                                                  <dl id="nzllo"></dl>

                                                                  <dl id="nzllo"><ins id="nzllo"><thead id="nzllo"></thead></ins></dl>
                                                                  <dl id="nzllo"></dl>