新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PIC18F2680的CAN總線設(shè)計(jì)

        PIC18F2680的CAN總線設(shè)計(jì)

        作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
        硬件:18F2680,CAN收發(fā)芯片MCP2551

        1.自測(cè)模式

        本文引用地址:http://www.104case.com/article/201611/315946.htm

        //* ****************************************************************
        //** 功能描述: CAN自測(cè)試收發(fā)編程,CAN發(fā)送郵箱0以一定的時(shí)間間隔發(fā)送數(shù)據(jù),接收到數(shù)據(jù)后,將接收數(shù)據(jù)加1作為下一次的發(fā)送數(shù)據(jù)
        //***************************************************************
        #include"pic18.h" //PIC18系列的頭文件 */
        charCAN_Adress_H,CAN_Adress_L;// CAN標(biāo)識(shí)符高低字節(jié) */
        charCAN_Adress_EH,CAN_Adress_EL;// CAN擴(kuò)展標(biāo)識(shí)符高低字節(jié) */
        int CAN_FLAG;// =1接收到CAN 數(shù)據(jù),=0未接收到數(shù)據(jù) */
        unsignedintCAN_Delay_count=0;// 間隔一定時(shí)間發(fā)送CAN數(shù)據(jù) */

        // ****************************************************************
        //** 函 數(shù) 名: initial()
        //** 功能描述: 系統(tǒng)初始化子程序,放在程序首部
        //*************************************************************** */
        voidinitial()
        {
        SWDTEN=0; //關(guān)看門狗
        INTCON=0x00;// bit7-bit0:關(guān)總中斷 */
        ADCON1=0X07;// 設(shè)置數(shù)字輸入輸出口 */
        PIE1=0; // PIE1 的中斷不使能 */
        PIE2=0;// PIE2 的中斷不使能 */
        PIE3=0;// PIE3 的中斷不使能 */
        TRISB7=0; // RB7為輸出端口
        RB7=0;
        }
        //********************************************
        //延時(shí)函數(shù)
        //********************************************
        void delay(unsigned int asd)
        {
        unsigned int i;
        for(i=0;i {}
        }

        //* ****************************************************************
        //** 函 數(shù) 名: initcan()
        //** 功能描述: CAN初始化子程序,采用標(biāo)準(zhǔn)標(biāo)識(shí)符,自測(cè)試模式
        //*************************************************************** */
        voidinitcan()
        {
        // ************設(shè)置對(duì)CAN進(jìn)行配置*************** */
        TRISB=(TRISB|0X08)&0XFB;//設(shè)置CANRX/RB3輸入,CANTX/RB2輸出*/
        CANCON=0X80;// CANCON,bit7-5:1XX請(qǐng)求配置 */
        while((CANSTAT&0X80)==0)// CAN狀態(tài)寄存器。bit7-5:100配置方式 */
        {
        ;
        }// 等待進(jìn)入CAN配置模式OPMODE=100 */

        // ***********波特率設(shè)置 ************************** */
        BRGCON1=0X01;// Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
        //則TQ=((2*(BRP+1))/Fosc=4/4M=1us */
        BRGCON2=0X90;//bit7=1自由編程,bit6=0總線在采樣點(diǎn)采樣1
        //次;Phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
        BRGCON3=0X42;// 設(shè)置Phase_Seg2(bit2-0)=3TQ */
        // 標(biāo)稱位時(shí)間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
        //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */

        // ******設(shè)置發(fā)送郵標(biāo)識(shí)符號(hào)和初始發(fā)送的數(shù)據(jù)***** */
        TXB0CON=0X03;// bit1-0:發(fā)送優(yōu)先級(jí),設(shè)置TXB0為最高優(yōu)先級(jí)3 */
        TXB0SIDL=CAN_Adress_L&0xe0;// bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位 */
        TXB0SIDH=CAN_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 */
        TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長(zhǎng)度為8個(gè)字節(jié) */
        TXB0D0=0X00;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D1=0X01;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D2=0X02;
        TXB0D3=0X03;
        TXB0D4=0X04;
        TXB0D5=0X05;
        TXB0D6=0X06;
        TXB0D7=0X07;

        // *******設(shè)置接收郵箱0的標(biāo)識(shí)符和初始化數(shù)據(jù)********** */
        RXB0SIDL=CAN_Adress_L&0xe0;// bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位*/
        RXB0SIDH=CAN_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 */
        RXB0CON=0X20;// bit6-5=01只接收有效的標(biāo)準(zhǔn)標(biāo)識(shí)符信息 */
        RXB0DLC=0X08;// 設(shè)置接收緩沖器0的數(shù)據(jù)區(qū)長(zhǎng)度8個(gè)字節(jié) */
        RXB0D0=0X02;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D1=0X03;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D2=0X04;
        RXB0D3=0X05;
        RXB0D4=0X00;
        RXB0D5=0X00;
        RXB0D6=0X00;
        RXB0D7=0X00;

        // *******初始化接收濾波器0和接收屏蔽**************** */
        RXF0SIDH=CAN_Adress_H;
        RXF0SIDL=CAN_Adress_L;// 本字節(jié)高3位為標(biāo)識(shí)符低3位,低5位是配置 */
        RXM0SIDH=0Xff;
        RXM0SIDL=0Xe0;// 11個(gè)1表示接收11位標(biāo)識(shí)符進(jìn)行濾波,標(biāo)識(shí)符
        //不同不接收;若全為0,若正確信息,全部接收*/

        // *******設(shè)置CAN工作模式**************************** */
        CANCON=0X40;// bit6:=1進(jìn)入自測(cè)試模式;=0,正常操作模式 */
        while((CANSTAT&0X40)!=0)// 檢測(cè)CAN配置完成 */
        {
        ;
        }

        // 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
        PIR3=0X00;// 清所有CAN中斷標(biāo)志 */
        PIE3=PIE3|0X01;// 使能接收緩沖器0的接收中斷 */
        IPR3=IPR3|0X01;// 接收緩沖器0的接收中斷為最高優(yōu)先級(jí) */
        }

        /* **************************************************************
        **函 數(shù) 名: CAN_deal()
        **功 能:CAN接收數(shù)據(jù)后處理子程序:接收數(shù)據(jù)加1為下次發(fā)送的數(shù)據(jù)
        ****************************************************************** */
        voidCAN_deal()
        {
        RB7=1;
        delay(1000);
        CAN_FLAG=0;// 清接收到標(biāo)志 */
        TXB0CON=TXB0CON&0xf7;// TXB0REQ=0,禁止發(fā)送請(qǐng)求 */
        TXB0D0=RXB0D0+1;// 用接收數(shù)據(jù)加1來(lái)更新發(fā)送數(shù)據(jù) */
        TXB0D1=RXB0D1+1;
        TXB0D2=RXB0D2+1;
        TXB0D3=RXB0D3+1;
        TXB0D4=RXB0D4+1;
        TXB0D5=RXB0D5+1;
        TXB0D6=RXB0D6+1;
        TXB0D7=RXB0D7+1;
        }

        /* ****************************************************************
        ** 函 數(shù) 名: interruptHI_ISR()
        ** 功能描述: 高優(yōu)先級(jí)中斷子程序:RXB0接收郵箱0接收中斷子程序
        *************************************************************** */
        voidinterrupt HI_ISR()
        {
        if(RXB0IF==1)// RXB0接收郵箱0接收中斷 */
        {
        CAN_FLAG=1;// 置接收到 CAN 數(shù)據(jù) */
        RXB0IF=0;/// 清接收中斷標(biāo)志 */
        RXB0FUL=0;//bit7=0打開接收緩沖器接收新信息 */
        }
        }

        main()
        {
        initial();// 系統(tǒng)初始化子程序 */
        CAN_Adress_H=0x33;// CAN高地址為33,低地址為3 */
        CAN_Adress_L=0xe0;// 接收和發(fā)送郵箱標(biāo)識(shí)符:00110011111=0x019F*/
        initcan();// CAN設(shè)置初始化 */
        IPEN=1;// 使能中斷高低優(yōu)先級(jí) */
        INTCON=INTCON|0xc0;// 開總中斷、開外圍接口中斷 */
        while(1)
        {
        if(CAN_FLAG==1)CAN_deal();// 接收到CAN信息,處理 */
        elseif(CAN_Delay_count>0x2fe)// 間隔一定時(shí)間發(fā)送CAN數(shù)據(jù) */
        {
        RB7=0;
        delay(65535);
        TXB0CON=TXB0CON|0x08;// bit3(TXREQ)=1,請(qǐng)求發(fā)送 */
        while(TXB0REQ) //等待發(fā)送完畢退出!!
        {
        ; //等待發(fā)送結(jié)束
        }
        CAN_Delay_count=0;// 間隔一定時(shí)間發(fā)送CAN數(shù)據(jù)計(jì)時(shí)器清0 */
        }
        elseCAN_Delay_count++;// 不到CAN間隔發(fā)送時(shí)間,繼續(xù)延時(shí) */
        }
        }

        2.正常通信模式

        定義:CANsend.c 接收上位機(jī)發(fā)送的八個(gè)數(shù)據(jù)后,通過(guò)CAN發(fā)送到另一個(gè)節(jié)點(diǎn),CANslave.c接收CAN數(shù)據(jù)后進(jìn)行+1操作后把數(shù)據(jù)通過(guò)CAN發(fā)送出去,CANsend.c 接收數(shù)據(jù)再送到上位機(jī)!

        CANsend.c

        *
         CAN總線程序(包括發(fā)送任務(wù)和接收任務(wù))
        程序: CANsend.c
        版本號(hào):V1.0
        功能: 能夠接收上位機(jī)發(fā)送的串口數(shù)據(jù)
            同時(shí)把接收的上位機(jī)程序通過(guò)CAN總線發(fā)送出去
        發(fā)送數(shù)據(jù)到CAN上后間聽總線,準(zhǔn)備接收另一個(gè)CAN節(jié)點(diǎn)發(fā)送數(shù)據(jù),并把數(shù)據(jù)返回上位機(jī) 
        MCU: PIC18F2680
        公司: RESUN
        編譯器:Hi-tech PICC 18 v9.50PL3
        */
        #include
        unsigned char CAN_TX_Adress_H; //CAN發(fā)送高地址寄存器
        unsigned char CAN_TX_Adress_L; //CAN發(fā)送低地址寄存器
        unsigned char CAN_RX_Adress_H; //CAN接收高地址寄存器
        unsigned char CAN_RX_Adress_L; //CAN接收低地址寄存器
        unsigned char Counter; //計(jì)數(shù)器
        unsigned char UartFlage; //串口數(shù)據(jù)接收標(biāo)志
        unsigned char CanrecFlage; //CAN數(shù)據(jù)接收標(biāo)志

        unsigned char Uartdata[8]; //接收數(shù)據(jù),PC-MCU
        unsigned char Senddata[8]; //發(fā)送數(shù)據(jù),MCU-PC
        //-----------函數(shù)定義-------------
        void uartint(void);
        void picint(void);
        void canint(void);
        void Work1(void);
        void Work2(void);
        void Delay(unsigned int asd);

        //********************************
        //單片機(jī)初始化
        //********************************
        void picint() //PIC初始化!
        {
        INTCON=0; //禁止總中斷
        ADCON1=0x07; //AD端口設(shè)置為通用IO口
        PIE1=0; //禁止外設(shè)中斷
        PIE2=0;
        PIE3=0;

        TRISB7=0; //RB7輸出引腳,用于調(diào)試程序
        RB7=0; //輸出0

        UartFlage=0;
        CanrecFlage=0;
        Counter=0; //計(jì)數(shù)器清0
        }
        //********************************
        //串口初始化程序(與PC通信)
        //********************************
        void uartint()
        {
        SPBRG=25; //設(shè)置波特率為9600
        TXSTA=0x04; //高速波特率4M晶振
        RCSTA=0x80; //USART串口使能
        TRISC6=1; //設(shè)置UART端口,RC6是數(shù)據(jù)發(fā)送,RC7是數(shù)據(jù)接收
        TRISC7=1;

        RCIP=0; //串口接收設(shè)置為低優(yōu)先級(jí)中斷
        RCIE=1; //允許接收中斷
        TXIE=0; //禁止發(fā)送中斷
        CREN=1; //允許串口接收數(shù)據(jù)
        }
        //********************************
        //延時(shí)函數(shù)
        //********************************
        void Delay(unsigned int asd)
        {
        unsigned int i;
        for(i=0;i {}
        }
        //********************************
        //CAN接口初始化
        //********************************
        void canint() //CAN接口初始化
        {
        // ************設(shè)置對(duì)CAN進(jìn)行配置***************
        TRISB=(TRISB|0X08)&0XFB;//設(shè)置CANRX/RB3輸入,CANTX/RB2輸出
        CANCON=0X80;// CANCON,bit7-5:1XX請(qǐng)求配置
        while((CANSTAT&0X80)==0)// CA
        // ****************************************************************
        //** 函 數(shù) 名: initcan()
        //** 功能描述: CAN初始化子程序,采用標(biāo)準(zhǔn)標(biāo)識(shí)符N狀態(tài)寄存器。bit7-5:100配置方式
        {
        ;
        }// 等待進(jìn)入CAN配置模式OPMODE=100
        // ************設(shè)置對(duì)CAN進(jìn)行配置***************

        // ***********波特率設(shè)置 **************************
        BRGCON1=0X01;// Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
        //則TQ=((2*(BRP+1))/Fosc=4/4M=1us
        BRGCON2=0X90;//bit7=1自由編程,bit6=0總線在采樣點(diǎn)采樣1
        //次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ
        BRGCON3=0X42;// 設(shè)置Phase_Seg2(bit2-0)=3TQ
        // 標(biāo)稱位時(shí)間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
        //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */
        // 設(shè)置發(fā)送郵箱0標(biāo)識(shí)符 :00110011111=0x019F */
        CAN_TX_Adress_H=0x33; //CAN高地址標(biāo)識(shí)符,應(yīng)與接收方標(biāo)識(shí)符相同
        CAN_TX_Adress_L=0xe0; //CAN低地址標(biāo)識(shí)符
        CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;

        // 設(shè)置接收郵箱0標(biāo)識(shí)符 :10011001010=0x04CA */
        CAN_RX_Adress_H=0x99; //CAN高地址標(biāo)識(shí)符
        CAN_RX_Adress_L=0x55; //CAN低地址標(biāo)識(shí)符,應(yīng)與發(fā)送方標(biāo)識(shí)符相同
        CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;

        // ******設(shè)置發(fā)送郵箱0和初始發(fā)送的數(shù)據(jù)***** */
        TXB0CON=0X03;// bit1-0:發(fā)送優(yōu)先級(jí),設(shè)置TXB0為最高優(yōu)先級(jí)3 */
        TXB0SIDL=CAN_TX_Adress_L&0xe0; // bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位*/
        TXB0SIDH=CAN_TX_Adress_H; // 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位*/
        TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長(zhǎng)度為8個(gè)字節(jié) */
        TXB0D0=0X00;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D1=0X01;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D2=0X02;
        TXB0D3=0X03;
        TXB0D4=0X04;
        TXB0D5=0X05;
        TXB0D6=0X06;
        TXB0D7=0X07;

        RXB0SIDL=CAN_RX_Adress_L&0xe0; // bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位*/
        RXB0SIDH=CAN_RX_Adress_H; // 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 */
        RXB0CON=0X20;// bit6-5=01只接收帶有標(biāo)準(zhǔn)標(biāo)識(shí)符的有效報(bào)文 */
        RXB0DLC=0X08;// 設(shè)置接收緩沖器0數(shù)據(jù)區(qū)長(zhǎng)度8個(gè)字節(jié) */
        RXB0D0=0X02;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D1=0X03;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D2=0X04;
        RXB0D3=0X05;
        RXB0D4=0X00;
        RXB0D5=0X00;
        RXB0D6=0X00;
        RXB0D7=0X00;

        // *******初始化接收濾波器0和接收屏蔽**************** */
        RXF0SIDH=CAN_RX_Adress_H;
        RXF0SIDL=CAN_RX_Adress_L&0xe0;//高3位為標(biāo)識(shí)符低3位,低5位是配置 */
        RXM0SIDH=0Xff;
        RXM0SIDL=0Xe0; // 11個(gè)1表示接收11位標(biāo)識(shí)符進(jìn)行濾波,標(biāo)識(shí)符
        //不同不接收;若全為0,若正確信息,全部接收*/

        // *******設(shè)置CAN工作模式**************************** */
        CANCON=0X00;//=0X40,進(jìn)入自測(cè)試模式;=0x00,正常操作模式
        while((CANSTAT&0XE0)!=0)// 檢測(cè)CAN配置完成 */
        {
        ;
        }

        // 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
        PIR3=0X00;// 清所有CAN中斷標(biāo)志*/
        PIE3=PIE3|0X01;// 使能接收緩沖器0的接收中斷 */
        IPR3=IPR3|0X01;// 接收緩沖器0的接收中斷為最高優(yōu)先級(jí) */
        }
        //*********************************
        //高優(yōu)先級(jí)中斷程序
        //*********************************
        void interruptHI_ISR()
        {
        if(RXB0IF==1) //接收緩沖器1接收到新數(shù)據(jù)
        {
        RB7=1;
        CanrecFlage=1;// 置接收到 CAN 數(shù)據(jù) */
        RXB0IF=0;// 清接收中斷標(biāo)志 */
        RXB0FUL=0;// bit7=0,打開接收緩沖器接收新信息 */
        }
        }
        //*********************************
        //低優(yōu)先級(jí)中斷程序
        //*********************************
        void interrupt low_priority LOW_ISR()
        {
        if(RCIF==1) //判斷是不是串口中斷
        {
        Uartdata[Counter]=RCREG;
        Counter++;
        if(Counter>7)
        {
        Counter=0;
        UartFlage=1; //有串行數(shù)據(jù)接收
        }
        }
        }
        //*********************************
        //處理函數(shù)1
        //*********************************
        void Work1()
        {
        TXB0CON=TXB0CON&0xf7; //bit3:TXREQ=0, 關(guān)請(qǐng)求發(fā)送
        UartFlage=0; //清標(biāo)志
        TXB0D0=Uartdata[0]; //CAN發(fā)送數(shù)據(jù)更新(用串口接收來(lái)的數(shù)據(jù))
        TXB0D1=Uartdata[1];
        TXB0D2=Uartdata[2];
        TXB0D3=Uartdata[3];
        TXB0D4=Uartdata[4];
        TXB0D5=Uartdata[5];
        TXB0D6=Uartdata[6];
        TXB0D7=Uartdata[7];
        TXB0CON=TXB0CON|0x08; //請(qǐng)求發(fā)送,bit3:TXREQ=1
        // RB7=1;
        while(TXB0REQ) //等待發(fā)送完畢
        {
        ;
        }
        Delay(10000);
        }
        //*********************************
        //處理函數(shù)2
        //*********************************
        void Work2() //接收數(shù)據(jù)返回PC機(jī)
        {
        unsigned char i;
        Senddata[0]=RXB0D0;
        Senddata[1]=RXB0D1;
        Senddata[2]=RXB0D2;
        Senddata[3]=RXB0D3;
        Senddata[4]=RXB0D4;
        Senddata[5]=RXB0D5;
        Senddata[6]=RXB0D6;
        Senddata[7]=RXB0D7;
        //RCEN=0; //接收禁止
        TXEN=1; //使能串口發(fā)送
        for(i=0;i<8;i++) //串口數(shù)據(jù)發(fā)送
        {
        TXREG=Senddata[i];
        while(1)
        {
        if(TXIF==1) break;
        }
        Delay(100);
        }
        //RCEN=1; //接收使能
        TXEN=0; //禁止數(shù)據(jù)發(fā)送
        }
        //*********************************
        //主程序
        //*********************************
        void main()
        {
        SWDTEN=0; //軟件關(guān)閉看門狗
        picint();
        canint();
        uartint();
        IPEN=1; //使能高低中斷優(yōu)先級(jí)
        INTCON=INTCON|0xc0; //開總中斷、開外圍接口中斷
        TXB0REQ=0; //禁止CAN發(fā)送
        while(1) //主循環(huán)
        {
        if(UartFlage) //接收到串口數(shù)據(jù)
        {
        UartFlage=0;
        Work1();
        //RB7=0;
        }

        if(CanrecFlage) //接收到CAN總線數(shù)據(jù)
        {
        CanrecFlage=0;
        Work2();
        }

        }
        }

        CANslave.c

        /*
         CAN總線程序(包括發(fā)送任務(wù)和接收任務(wù))
        程序: CANslave.c
        版本號(hào):V1.0
        功能:
            同時(shí)把接收的CAN數(shù)據(jù)通過(guò)CAN總線發(fā)送出去
        供別的節(jié)點(diǎn)進(jìn)行接收
        MCU: PIC18F2680
        公司: RESUN
        編譯器:Hi-tech PICC 18 v9.50PL3
        */
        #include
        unsigned char CAN_TX_Adress_H; //CAN發(fā)送高地址寄存器
        unsigned char CAN_TX_Adress_L; //CAN發(fā)送低地址寄存器
        unsigned char CAN_RX_Adress_H; //CAN接收高地址寄存器
        unsigned char CAN_RX_Adress_L; //CAN接收低地址寄存器
        unsigned char CAN_FLAG;

        //------------函數(shù)定義------------
        void picint(void);
        void canint(void);
        void delay(unsigned int asd);
        //************************************
        //延時(shí)函數(shù)
        //************************************
        void delay(unsigned int asd)
        {
        unsigned int i;
        for(i=0;i {}
        }
        //************************************
        //單片機(jī)初始化函數(shù)
        //************************************
        void picint()
        {
        INTCON=0; //禁止總中斷
        ADCON1=0x07; //AD端口設(shè)置為通用IO口
        PIE1=0; //禁止外設(shè)中斷
        PIE2=0;
        PIE3=0;

        TRISB7=0; //RB7輸出引腳,用于調(diào)試程序
        RB7=0; //輸出0
        }
        //************************************
        //CAN總線初始化函數(shù)
        //************************************
        void canint()
        {
        // 設(shè)置發(fā)送郵箱0標(biāo)識(shí)符 :10011001010=0x04CA */
        CAN_TX_Adress_L=0x55;//CAN低地址標(biāo)識(shí)符
        CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
        CAN_TX_Adress_H=0x99;//CAN高地址標(biāo)識(shí)符,應(yīng)與發(fā)送方標(biāo)識(shí)符相同

        // 設(shè)置接收郵箱0標(biāo)識(shí)符 :00110011111=0x019F */
        CAN_RX_Adress_H=0x33;//CAN高地址標(biāo)識(shí)符
        CAN_RX_Adress_L=0xe0;//CAN低地址標(biāo)識(shí)符,應(yīng)與發(fā)送方標(biāo)識(shí)符相同
        CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;

        // ************設(shè)置對(duì)CAN進(jìn)行配置*************** */
        TRISB=(TRISB|0X08)&0XFB;// 設(shè)置CANRX/RB3輸入,CANTX/RB2輸出 */
        CANCON=0X80;// CANCON,bit7-5:1XX請(qǐng)求配置 */
        while((CANSTAT&0X80)==0)// CAN狀態(tài)寄存器。bit7-5:100配置方式 */
        {
        ;
        }// 等待進(jìn)入CAN配置模式OPMODE=100 */

        // ***********波特率設(shè)置 ************************** */
        BRGCON1=0X01;/* Sync_Seg(bit7-6)=1TQ,BRP(bit5-0)=1,
        則TQ=((2*(BRP+1))/Fosc=4/4M=1us */
        BRGCON2=0X90;/*bit7=1自由編程,bit6=0總線在采樣點(diǎn)采樣1
        次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
        BRGCON3=0X42;/* 設(shè)置Phase_Seg2(bit2-0)=3TQ */
        // 標(biāo)稱位時(shí)間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
        //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */

        // ******設(shè)置發(fā)送郵箱0和初始發(fā)送的數(shù)據(jù)***** */
        TXB0CON=0X03;// bit1-0:發(fā)送優(yōu)先級(jí),設(shè)置TXB0為最高優(yōu)先級(jí)3 */
        TXB0SIDL=CAN_TX_Adress_L&0xe0; //bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位*/
        TXB0SIDH=CAN_TX_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位*/
        TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長(zhǎng)度為8個(gè)字節(jié) */
        TXB0D0=0X00;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D1=0X01;// 寫發(fā)送緩沖器數(shù)據(jù)區(qū)數(shù)據(jù)初值 */
        TXB0D2=0X02;
        TXB0D3=0X03;
        TXB0D4=0X04;
        TXB0D5=0X05;
        TXB0D6=0X06;
        TXB0D7=0X07;

        RXB0SIDL=CAN_RX_Adress_L&0xe0; //bit3=0標(biāo)準(zhǔn)標(biāo)識(shí)符,bit7-5:標(biāo)準(zhǔn)標(biāo)識(shí)符2-0位*/
        RXB0SIDH=CAN_RX_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識(shí)符的10-3位 */
        RXB0CON=0X20;// bit6-5=01只接收有效的標(biāo)準(zhǔn)標(biāo)識(shí)符信息 */
        RXB0DLC=0X08;// 設(shè)置接收緩沖器0數(shù)據(jù)區(qū)長(zhǎng)度8個(gè)字節(jié) */
        RXB0D0=0X02;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D1=0X03;// 初始化接收緩沖器0的數(shù)據(jù)區(qū)數(shù)據(jù) */
        RXB0D2=0X04;
        RXB0D3=0X05;
        RXB0D4=0X00;
        RXB0D5=0X00;
        RXB0D6=0X00;
        RXB0D7=0X00;

        // *******初始化接收濾波器0和接收屏蔽**************** */
        RXF0SIDH=CAN_RX_Adress_H;
        RXF0SIDL=CAN_RX_Adress_L&0xe0;//高3位為標(biāo)識(shí)符低3位,低5位是配置 */
        RXM0SIDH=0Xff;
        RXM0SIDL=0Xe0;// 11個(gè)1表示接收11位標(biāo)識(shí)符進(jìn)行濾波,標(biāo)識(shí)符
        //不同不接收;若全為0,若正確信息,全部接收*/

        // *******設(shè)置CAN工作模式**************************** */
        CANCON=0X00;//=0X40,進(jìn)入自測(cè)試模式;=0x00,正常操作模式
        while((CANSTAT&0XE0)!=0)// 檢測(cè)CAN配置完成 */
        {
        ;
        }

        // 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
        PIR3=0X00; // 清所有CAN中斷標(biāo)志 */
        PIE3=PIE3|0X01; // 使能接收緩沖器0的接收中斷 */
        IPR3=IPR3|0X01; // 接收緩沖器0的接收中斷為最高優(yōu)先級(jí) */
        }
        //************************************
        //中斷函數(shù)
        //************************************
        void interruptHI_ISR()
        {
        if(RXB0IF==1)
        {
        CAN_FLAG=1;// 置接收到 CAN 數(shù)據(jù) */
        RXB0IF=0;// 清接收中斷標(biāo)志 */
        RXB0FUL=0;// bit7=0打開接收緩沖器接收新信息 */
        }
        }
        //************************************
        //主函數(shù)
        //************************************
        void main()
        {
        SWDTEN=0; //軟件關(guān)閉看門狗
        picint();
        canint();
        IPEN=1;// 使能中斷高低優(yōu)先級(jí) */
        INTCON=INTCON|0xc0;// 開總中斷、開外圍接口中斷 */
        TXB0REQ=0;// 關(guān)發(fā)送,TXB0REQ=0; */
        while(1)
        {
        if(CAN_FLAG==1)
        {
        RB7=!RB7;
        CAN_FLAG=0;// 清接收到標(biāo)志 */
        TXB0CON=TXB0CON&0xf7;// TXB0REQ=0關(guān)發(fā)送 */
        TXB0D0=RXB0D0+1;// 用接收數(shù)據(jù)加1來(lái)更新發(fā)送數(shù)據(jù) */
        TXB0D1=RXB0D1+1;
        TXB0D2=RXB0D2+1;
        TXB0D3=RXB0D3+1;
        TXB0D4=RXB0D4+1;
        TXB0D5=RXB0D5+1;
        TXB0D6=RXB0D6+1;
        TXB0D7=RXB0D7+1;
        TXB0CON=TXB0CON|0x08;// bit3(TXREQ)=1請(qǐng)求發(fā)送 */
        while(TXB0REQ) //等待發(fā)送完畢
        {
        ;
        }
        delay(10000);
        RB7=0;
        }
        }
        }



        關(guān)鍵詞: PIC18F2680CAN總

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 尉犁县| 蓬溪县| 广宗县| 姜堰市| 宁海县| 思南县| 苍南县| 峡江县| 九寨沟县| 高安市| 奉节县| 平利县| 北票市| 长兴县| 福清市| 招远市| 莱阳市| 锦州市| 洮南市| 潞城市| 读书| 筠连县| 云梦县| 庆元县| 安塞县| 屯昌县| 余干县| 朝阳区| 神农架林区| 淮阳县| 定日县| 哈巴河县| 宁津县| 元江| 永丰县| 大冶市| 贡觉县| 淳化县| 紫阳县| 镇沅| 皋兰县|