?? can-test.c
字號:
/* ****************************************************************
** 功能描述: CAN自測試收發編程,CAN發送郵箱0以一定的時間間隔發送數據,接收到數據后,將接收數據加1作為下一次的發送數據
*************************************************************** */
#include "pic18.h" /* PIC18系列的頭文件 */
char CAN_Adress_H,CAN_Adress_L; /* CAN標識符高低字節 */
char CAN_Adress_EH,CAN_Adress_EL; /* CAN擴展標識符高低字節 */
int CAN_FLAG; /* =1接收到CAN 數據,=0未接收到數據 */
unsigned int CAN_Delay_count=0; /* 間隔一定時間發送CAN數據 */
/* ****************************************************************
** 函 數 名: initial()
** 功能描述: 系統初始化子程序,放在程序首部
*************************************************************** */
void initial()
{
INTCON=0x00; /* bit7-bit0:關總中斷 */
ADCON1=0X07; /* 設置數字輸入輸出口 */
PIE1=0; /* PIE1 的中斷不使能 */
PIE2=0; /* PIE2 的中斷不使能 */
PIE3=0; /* PIE3 的中斷不使能 */
}
/* ****************************************************************
** 函 數 名: initcan()
** 功能描述: CAN初始化子程序,采用標準標識符,自測試模式
*************************************************************** */
void initcan()
{
/* ************設置對CAN進行配置*************** */
TRISB=(TRISB|0X08)&0XFB; /*設置CANRX/RB3輸入,CANTX/RB2輸出*/
CANCON=0X80; /* CANCON,bit7-5:1XX請求配置 */
while((CANSTAT&0X80)==0) /* CAN狀態寄存器。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 */
/* ******設置發送郵標識符號和初始發送的數據***** */
TXB0CON=0X03; /* bit1-0:發送優先級,設置TXB0為最高優先級3 */
TXB0SIDL=CAN_Adress_L&0xe0; /* bit3=0標準標識符,bit7-5:標準標識符2-0位 */
TXB0SIDH=CAN_Adress_H; /* 標準標識符的10-3位 */
TXB0DLC=0X08; /* 設置數據長度為8個字節 */
TXB0D0=0X00; /* 寫發送緩沖器數據區數據初值 */
TXB0D1=0X01; /* 寫發送緩沖器數據區數據初值 */
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的數據區長度8個字節 */
RXB0D0=0X02; /* 初始化接收緩沖器0的數據區數據 */
RXB0D1=0X03; /* 初始化接收緩沖器0的數據區數據 */
RXB0D2=0X04;
RXB0D3=0X05;
RXB0D4=0X00;
RXB0D5=0X00;
RXB0D6=0X00;
RXB0D7=0X00;
/* *******初始化接收濾波器0和接收屏蔽**************** */
RXF0SIDH=CAN_Adress_H;
RXF0SIDL=CAN_Adress_L; /* 本字節高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的接收中斷為最高優先級 */
}
/* **************************************************************
** 函 數 名: CAN_deal()
** 功 能:CAN接收數據后處理子程序:接收數據加1為下次發送的數據
****************************************************************** */
void CAN_deal()
{
CAN_FLAG=0; /* 清接收到標志 */
TXB0CON=TXB0CON&0xf7; /* TXB0REQ=0,禁止發送請求 */
TXB0D0=RXB0D0+1; /* 用接收數據加1來更新發送數據 */
TXB0D1=RXB0D1+1;
TXB0D2=RXB0D2+1;
TXB0D3=RXB0D3+1;
TXB0D4=RXB0D4+1;
TXB0D5=RXB0D5+1;
TXB0D6=RXB0D6+1;
TXB0D7=RXB0D7+1;
}
/* ****************************************************************
** 函 數 名: interrupt HI_ISR()
** 功能描述: 高優先級中斷子程序:RXB0接收郵箱0接收中斷子程序
*************************************************************** */
void interrupt HI_ISR()
{
if(RXB0IF==1) /* RXB0接收郵箱0接收中斷 */
{
CAN_FLAG=1; /* 置接收到 CAN 數據 */
RXB0IF=0; /* 清接收中斷標志 */
RXB0FUL=0; /* bit7=0打開接收緩沖器接收新信息 */
}
}
main()
{
initial(); /* 系統初始化子程序 */
CAN_Adress_H=0x33; /* CAN高地址為33,低地址為3 */
CAN_Adress_L=0xe0; /* 接收和發送郵箱標識符:00110011111=0x019F*/
initcan(); /* CAN設置初始化 */
IPEN=1; /* 使能中斷高低優先級 */
INTCON=INTCON|0xc0; /* 開總中斷、開外圍接口中斷 */
while(1)
{
if(CAN_FLAG==1)CAN_deal(); /* 接收到CAN信息,處理 */
else if(CAN_Delay_count>0x2fe) /* 間隔一定時間發送CAN數據 */
{
TXB0CON=TXB0CON|0x08;/* bit3(TXREQ)=1,請求發送 */
CAN_Delay_count=0; /* 間隔一定時間發送CAN數據計時器清0 */
}
else CAN_Delay_count++; /* 不到CAN間隔發送時間,繼續延時 */
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -