<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > PIC18F2680的CAN總線設計

          PIC18F2680的CAN總線設計

          作者: 時間:2016-11-18 來源:網絡 收藏
          硬件:18F2680,CAN收發(fā)芯片MCP2551

          1.自測模式

          本文引用地址:http://www.ex-cimer.com/article/201611/315946.htm

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

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

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

          // ***********波特率設置 ************************** */
          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總線在采樣點采樣1
          //次;Phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
          BRGCON3=0X42;// 設置Phase_Seg2(bit2-0)=3TQ */
          // 標稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
          //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */

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

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

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

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

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

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

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

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

          2.正常通信模式

          定義:CANsend.c 接收上位機發(fā)送的八個數據后,通過CAN發(fā)送到另一個節(jié)點,CANslave.c接收CAN數據后進行+1操作后把數據通過CAN發(fā)送出去,CANsend.c 接收數據再送到上位機!

          CANsend.c

          *
           CAN總線程序(包括發(fā)送任務和接收任務)
          程序: CANsend.c
          版本號:V1.0
          功能: 能夠接收上位機發(fā)送的串口數據
              同時把接收的上位機程序通過CAN總線發(fā)送出去
          發(fā)送數據到CAN上后間聽總線,準備接收另一個CAN節(jié)點發(fā)送數據,并把數據返回上位機 
          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; //計數器
          unsigned char UartFlage; //串口數據接收標志
          unsigned char CanrecFlage; //CAN數據接收標志

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

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

          TRISB7=0; //RB7輸出引腳,用于調試程序
          RB7=0; //輸出0

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

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

          // ***********波特率設置 **************************
          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總線在采樣點采樣1
          //次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ
          BRGCON3=0X42;// 設置Phase_Seg2(bit2-0)=3TQ
          // 標稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
          //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */
          // 設置發(fā)送郵箱0標識符 :00110011111=0x019F */
          CAN_TX_Adress_H=0x33; //CAN高地址標識符,應與接收方標識符相同
          CAN_TX_Adress_L=0xe0; //CAN低地址標識符
          CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;

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

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

          RXB0SIDL=CAN_RX_Adress_L&0xe0; // bit3=0標準標識符,bit7-5:標準標識符2-0位*/
          RXB0SIDH=CAN_RX_Adress_H; // 標準標識符的10-3位 */
          RXB0CON=0X20;// bit6-5=01只接收帶有標準標識符的有效報文 */
          RXB0DLC=0X08;// 設置接收緩沖器0數據區(qū)長度8個字節(jié) */
          RXB0D0=0X02;// 初始化接收緩沖器0的數據區(qū)數據 */
          RXB0D1=0X03;// 初始化接收緩沖器0的數據區(qū)數據 */
          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位為標識符低3位,低5位是配置 */
          RXM0SIDH=0Xff;
          RXM0SIDL=0Xe0; // 11個1表示接收11位標識符進行濾波,標識符
          //不同不接收;若全為0,若正確信息,全部接收*/

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

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

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

          }
          }

          CANslave.c

          /*
           CAN總線程序(包括發(fā)送任務和接收任務)
          程序: CANslave.c
          版本號:V1.0
          功能:
              同時把接收的CAN數據通過CAN總線發(fā)送出去
          供別的節(jié)點進行接收
          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;

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

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

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

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

          // ***********波特率設置 ************************** */
          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總線在采樣點采樣1
          次;phase_Seg1(bit5-3)=3TQ;Prog_Seg(bit2-0)=1TQ*/
          BRGCON3=0X42;/* 設置Phase_Seg2(bit2-0)=3TQ */
          // 標稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
          //=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */

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

          RXB0SIDL=CAN_RX_Adress_L&0xe0; //bit3=0標準標識符,bit7-5:標準標識符2-0位*/
          RXB0SIDH=CAN_RX_Adress_H;// 標準標識符的10-3位 */
          RXB0CON=0X20;// bit6-5=01只接收有效的標準標識符信息 */
          RXB0DLC=0X08;// 設置接收緩沖器0數據區(qū)長度8個字節(jié) */
          RXB0D0=0X02;// 初始化接收緩沖器0的數據區(qū)數據 */
          RXB0D1=0X03;// 初始化接收緩沖器0的數據區(qū)數據 */
          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位為標識符低3位,低5位是配置 */
          RXM0SIDH=0Xff;
          RXM0SIDL=0Xe0;// 11個1表示接收11位標識符進行濾波,標識符
          //不同不接收;若全為0,若正確信息,全部接收*/

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

          // 初始化CAN的中斷,PIR3為CAN的外圍中斷標志寄存器 */
          PIR3=0X00; // 清所有CAN中斷標志 */
          PIE3=PIE3|0X01; // 使能接收緩沖器0的接收中斷 */
          IPR3=IPR3|0X01; // 接收緩沖器0的接收中斷為最高優(yōu)先級 */
          }
          //************************************
          //中斷函數
          //************************************
          void interruptHI_ISR()
          {
          if(RXB0IF==1)
          {
          CAN_FLAG=1;// 置接收到 CAN 數據 */
          RXB0IF=0;// 清接收中斷標志 */
          RXB0FUL=0;// bit7=0打開接收緩沖器接收新信息 */
          }
          }
          //************************************
          //主函數
          //************************************
          void main()
          {
          SWDTEN=0; //軟件關閉看門狗
          picint();
          canint();
          IPEN=1;// 使能中斷高低優(yōu)先級 */
          INTCON=INTCON|0xc0;// 開總中斷、開外圍接口中斷 */
          TXB0REQ=0;// 關發(fā)送,TXB0REQ=0; */
          while(1)
          {
          if(CAN_FLAG==1)
          {
          RB7=!RB7;
          CAN_FLAG=0;// 清接收到標志 */
          TXB0CON=TXB0CON&0xf7;// TXB0REQ=0關發(fā)送 */
          TXB0D0=RXB0D0+1;// 用接收數據加1來更新發(fā)送數據 */
          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請求發(fā)送 */
          while(TXB0REQ) //等待發(fā)送完畢
          {
          ;
          }
          delay(10000);
          RB7=0;
          }
          }
          }



          關鍵詞: PIC18F2680CAN總

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();