PIC18F2680的CAN總線設(shè)計
1.自測模式
本文引用地址:http://butianyuan.cn/article/201611/315946.htm//* ****************************************************************
//** 功能描述: CAN自測試收發(fā)編程,CAN發(fā)送郵箱0以一定的時間間隔發(fā)送數(shù)據(jù),接收到數(shù)據(jù)后,將接收數(shù)據(jù)加1作為下一次的發(fā)送數(shù)據(jù)
//***************************************************************
#include"pic18.h" //PIC18系列的頭文件 */
charCAN_Adress_H,CAN_Adress_L;// CAN標(biāo)識符高低字節(jié) */
charCAN_Adress_EH,CAN_Adress_EL;// CAN擴(kuò)展標(biāo)識符高低字節(jié) */
int CAN_FLAG;// =1接收到CAN 數(shù)據(jù),=0未接收到數(shù)據(jù) */
unsignedintCAN_Delay_count=0;// 間隔一定時間發(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ù)
//********************************************
void delay(unsigned int asd)
{
unsigned int i;
for(i=0;i {}
}
//* ****************************************************************
//** 函 數(shù) 名: initcan()
//** 功能描述: CAN初始化子程序,采用標(biāo)準(zhǔn)標(biāo)識符,自測試模式
//*************************************************************** */
voidinitcan()
{
// ************設(shè)置對CAN進(jìn)行配置*************** */
TRISB=(TRISB|0X08)&0XFB;//設(shè)置CANRX/RB3輸入,CANTX/RB2輸出*/
CANCON=0X80;// CANCON,bit7-5:1XX請求配置 */
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)稱位時間=TQ*(Sync_Seg+ Prop_Seg+ Phase_seg1+ Phase_seg2)
//=(1+1+3+3)TQ=8TQ, 位率=1/(8*1U)=0.125MHz */
// ******設(shè)置發(fā)送郵標(biāo)識符號和初始發(fā)送的數(shù)據(jù)***** */
TXB0CON=0X03;// bit1-0:發(fā)送優(yōu)先級,設(shè)置TXB0為最高優(yōu)先級3 */
TXB0SIDL=CAN_Adress_L&0xe0;// bit3=0標(biāo)準(zhǔn)標(biāo)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位 */
TXB0SIDH=CAN_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識符的10-3位 */
TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長度為8個字節(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ù)據(jù)********** */
RXB0SIDL=CAN_Adress_L&0xe0;// bit3=0標(biāo)準(zhǔn)標(biāo)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位*/
RXB0SIDH=CAN_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識符的10-3位 */
RXB0CON=0X20;// bit6-5=01只接收有效的標(biāo)準(zhǔn)標(biāo)識符信息 */
RXB0DLC=0X08;// 設(shè)置接收緩沖器0的數(shù)據(jù)區(qū)長度8個字節(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)識符低3位,低5位是配置 */
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;// 11個1表示接收11位標(biāo)識符進(jìn)行濾波,標(biāo)識符
//不同不接收;若全為0,若正確信息,全部接收*/
// *******設(shè)置CAN工作模式**************************** */
CANCON=0X40;// bit6:=1進(jìn)入自測試模式;=0,正常操作模式 */
while((CANSTAT&0X40)!=0)// 檢測CAN配置完成 */
{
;
}
// 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
PIR3=0X00;// 清所有CAN中斷標(biāo)志 */
PIE3=PIE3|0X01;// 使能接收緩沖器0的接收中斷 */
IPR3=IPR3|0X01;// 接收緩沖器0的接收中斷為最高優(yōu)先級 */
}
/* **************************************************************
**函 數(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ā)送請求 */
TXB0D0=RXB0D0+1;// 用接收數(shù)據(jù)加1來更新發(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)先級中斷子程序: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)識符:00110011111=0x019F*/
initcan();// CAN設(shè)置初始化 */
IPEN=1;// 使能中斷高低優(yōu)先級 */
INTCON=INTCON|0xc0;// 開總中斷、開外圍接口中斷 */
while(1)
{
if(CAN_FLAG==1)CAN_deal();// 接收到CAN信息,處理 */
elseif(CAN_Delay_count>0x2fe)// 間隔一定時間發(fā)送CAN數(shù)據(jù) */
{
RB7=0;
delay(65535);
TXB0CON=TXB0CON|0x08;// bit3(TXREQ)=1,請求發(fā)送 */
while(TXB0REQ) //等待發(fā)送完畢退出?。?br /> {
; //等待發(fā)送結(jié)束
}
CAN_Delay_count=0;// 間隔一定時間發(fā)送CAN數(shù)據(jù)計時器清0 */
}
elseCAN_Delay_count++;// 不到CAN間隔發(fā)送時間,繼續(xù)延時 */
}
}
2.正常通信模式
定義:CANsend.c 接收上位機(jī)發(fā)送的八個數(shù)據(jù)后,通過CAN發(fā)送到另一個節(jié)點(diǎn),CANslave.c接收CAN數(shù)據(jù)后進(jìn)行+1操作后把數(shù)據(jù)通過CAN發(fā)送出去,CANsend.c 接收數(shù)據(jù)再送到上位機(jī)!
CANsend.c
*
CAN總線程序(包括發(fā)送任務(wù)和接收任務(wù))
程序: CANsend.c
版本號:V1.0
功能: 能夠接收上位機(jī)發(fā)送的串口數(shù)據(jù)
同時把接收的上位機(jī)程序通過CAN總線發(fā)送出去
發(fā)送數(shù)據(jù)到CAN上后間聽總線,準(zhǔn)備接收另一個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; //計數(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; //計數(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)先級中斷
RCIE=1; //允許接收中斷
TXIE=0; //禁止發(fā)送中斷
CREN=1; //允許串口接收數(shù)據(jù)
}
//********************************
//延時函數(shù)
//********************************
void Delay(unsigned int asd)
{
unsigned int i;
for(i=0;i {}
}
//********************************
//CAN接口初始化
//********************************
void canint() //CAN接口初始化
{
// ************設(shè)置對CAN進(jìn)行配置***************
TRISB=(TRISB|0X08)&0XFB;//設(shè)置CANRX/RB3輸入,CANTX/RB2輸出
CANCON=0X80;// CANCON,bit7-5:1XX請求配置
while((CANSTAT&0X80)==0)// CA
// ****************************************************************
//** 函 數(shù) 名: initcan()
//** 功能描述: CAN初始化子程序,采用標(biāo)準(zhǔn)標(biāo)識符N狀態(tài)寄存器。bit7-5:100配置方式
{
;
}// 等待進(jìn)入CAN配置模式OPMODE=100
// ************設(shè)置對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)稱位時間=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)識符 :00110011111=0x019F */
CAN_TX_Adress_H=0x33; //CAN高地址標(biāo)識符,應(yīng)與接收方標(biāo)識符相同
CAN_TX_Adress_L=0xe0; //CAN低地址標(biāo)識符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
// 設(shè)置接收郵箱0標(biāo)識符 :10011001010=0x04CA */
CAN_RX_Adress_H=0x99; //CAN高地址標(biāo)識符
CAN_RX_Adress_L=0x55; //CAN低地址標(biāo)識符,應(yīng)與發(fā)送方標(biāo)識符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
// ******設(shè)置發(fā)送郵箱0和初始發(fā)送的數(shù)據(jù)***** */
TXB0CON=0X03;// bit1-0:發(fā)送優(yōu)先級,設(shè)置TXB0為最高優(yōu)先級3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; // bit3=0標(biāo)準(zhǔn)標(biāo)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位*/
TXB0SIDH=CAN_TX_Adress_H; // 標(biāo)準(zhǔn)標(biāo)識符的10-3位*/
TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長度為8個字節(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)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位*/
RXB0SIDH=CAN_RX_Adress_H; // 標(biāo)準(zhǔn)標(biāo)識符的10-3位 */
RXB0CON=0X20;// bit6-5=01只接收帶有標(biāo)準(zhǔn)標(biāo)識符的有效報文 */
RXB0DLC=0X08;// 設(shè)置接收緩沖器0數(shù)據(jù)區(qū)長度8個字節(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)識符低3位,低5位是配置 */
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0; // 11個1表示接收11位標(biāo)識符進(jìn)行濾波,標(biāo)識符
//不同不接收;若全為0,若正確信息,全部接收*/
// *******設(shè)置CAN工作模式**************************** */
CANCON=0X00;//=0X40,進(jìn)入自測試模式;=0x00,正常操作模式
while((CANSTAT&0XE0)!=0)// 檢測CAN配置完成 */
{
;
}
// 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
PIR3=0X00;// 清所有CAN中斷標(biāo)志*/
PIE3=PIE3|0X01;// 使能接收緩沖器0的接收中斷 */
IPR3=IPR3|0X01;// 接收緩沖器0的接收中斷為最高優(yōu)先級 */
}
//*********************************
//高優(yōu)先級中斷程序
//*********************************
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)先級中斷程序
//*********************************
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)請求發(fā)送
UartFlage=0; //清標(biāo)志
TXB0D0=Uartdata[0]; //CAN發(fā)送數(shù)據(jù)更新(用串口接收來的數(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; //請求發(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)先級
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
版本號:V1.0
功能:
同時把接收的CAN數(shù)據(jù)通過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ù)
//************************************
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)識符 :10011001010=0x04CA */
CAN_TX_Adress_L=0x55;//CAN低地址標(biāo)識符
CAN_TX_Adress_L=CAN_TX_Adress_L&0xe0;
CAN_TX_Adress_H=0x99;//CAN高地址標(biāo)識符,應(yīng)與發(fā)送方標(biāo)識符相同
// 設(shè)置接收郵箱0標(biāo)識符 :00110011111=0x019F */
CAN_RX_Adress_H=0x33;//CAN高地址標(biāo)識符
CAN_RX_Adress_L=0xe0;//CAN低地址標(biāo)識符,應(yīng)與發(fā)送方標(biāo)識符相同
CAN_RX_Adress_L=CAN_RX_Adress_L&0xe0;
// ************設(shè)置對CAN進(jìn)行配置*************** */
TRISB=(TRISB|0X08)&0XFB;// 設(shè)置CANRX/RB3輸入,CANTX/RB2輸出 */
CANCON=0X80;// CANCON,bit7-5:1XX請求配置 */
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)稱位時間=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)先級,設(shè)置TXB0為最高優(yōu)先級3 */
TXB0SIDL=CAN_TX_Adress_L&0xe0; //bit3=0標(biāo)準(zhǔn)標(biāo)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位*/
TXB0SIDH=CAN_TX_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識符的10-3位*/
TXB0DLC=0X08;// 設(shè)置數(shù)據(jù)長度為8個字節(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)識符,bit7-5:標(biāo)準(zhǔn)標(biāo)識符2-0位*/
RXB0SIDH=CAN_RX_Adress_H;// 標(biāo)準(zhǔn)標(biāo)識符的10-3位 */
RXB0CON=0X20;// bit6-5=01只接收有效的標(biāo)準(zhǔn)標(biāo)識符信息 */
RXB0DLC=0X08;// 設(shè)置接收緩沖器0數(shù)據(jù)區(qū)長度8個字節(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)識符低3位,低5位是配置 */
RXM0SIDH=0Xff;
RXM0SIDL=0Xe0;// 11個1表示接收11位標(biāo)識符進(jìn)行濾波,標(biāo)識符
//不同不接收;若全為0,若正確信息,全部接收*/
// *******設(shè)置CAN工作模式**************************** */
CANCON=0X00;//=0X40,進(jìn)入自測試模式;=0x00,正常操作模式
while((CANSTAT&0XE0)!=0)// 檢測CAN配置完成 */
{
;
}
// 初始化CAN的中斷,PIR3為CAN的外圍中斷標(biāo)志寄存器 */
PIR3=0X00; // 清所有CAN中斷標(biāo)志 */
PIE3=PIE3|0X01; // 使能接收緩沖器0的接收中斷 */
IPR3=IPR3|0X01; // 接收緩沖器0的接收中斷為最高優(yōu)先級 */
}
//************************************
//中斷函數(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)先級 */
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來更新發(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請求發(fā)送 */
while(TXB0REQ) //等待發(fā)送完畢
{
;
}
delay(10000);
RB7=0;
}
}
}
評論