|
CAN總線學(xué)習(xí)資料
A板按鍵發(fā)送一個(gè)字節(jié):SJA1000 125kbps
B板接收顯示一個(gè)字節(jié):SJA1000 125Kbps
CAN點(diǎn)對(duì)點(diǎn)帶濾波的單片機(jī)源程序如下:
- #include "stdio.h"
- #include "string.h"
- #include "intrins.h"
- #include "Function.h"
- #include "reg51.h"
- void CAN_Send_anylength(unsigned char *CAN_TX_Buf,unsigned char length1);
- void display(unsigned char num);
- //定義SJA1000的基址
- //#define SJA_BaseAdr 0X7F00
- #define SJA_BaseAdr 0XFE00 //P2.0
- // 控制寄存器
- #define REG_CONTROL SJA_BaseAdr+0x00 //內(nèi)部控制寄存器
- #define REG_COMMAND SJA_BaseAdr+0x01 //命令寄存器
- #define REG_STATUS SJA_BaseAdr+0x02 //狀態(tài)寄存器
- #define REG_INTERRUPT SJA_BaseAdr+0x03 //中斷寄存器
- #define REG_INTENABLE SJA_BaseAdr+0x04 //中斷使能寄存器
- #define REG_BTR0 SJA_BaseAdr+0x06 //總線定時(shí)寄存器0
- #define REG_BTR1 SJA_BaseAdr+0x07 //總線定時(shí)寄存器1
- #define REG_OCR SJA_BaseAdr+0x08 //輸出控制寄存器
- #define REG_TEST SJA_BaseAdr+0x09 //測(cè)試寄存器
- #define REG_RESVER1 SJA_BaseAdr+0x0A //保留1
- #define REG_ARBITRATE SJA_BaseAdr+0x0B //仲裁丟失捕捉
- #define REG_ERRCATCH SJA_BaseAdr+0x0C //錯(cuò)誤代碼捕捉
- #define REG_ERRLIMIT SJA_BaseAdr+0x0D //錯(cuò)誤報(bào)警限額
- #define REG_RXERR SJA_BaseAdr+0x0E //接收錯(cuò)誤計(jì)數(shù)器
- #define REG_TXERR SJA_BaseAdr+0x0F //發(fā)送錯(cuò)誤計(jì)數(shù)器
- #define REG_ACR1 SJA_BaseAdr+0x10 //驗(yàn)收代碼寄存器
- #define REG_ACR2 SJA_BaseAdr+0x11 //驗(yàn)收代碼寄存器
- #define REG_ACR3 SJA_BaseAdr+0x12 //驗(yàn)收代碼寄存器
- #define REG_ACR4 SJA_BaseAdr+0x13 //驗(yàn)收代碼寄存器
- #define REG_AMR1 SJA_BaseAdr+0x14 //驗(yàn)收屏蔽寄存器
- #define REG_AMR2 SJA_BaseAdr+0x15 //驗(yàn)收屏蔽寄存器
- #define REG_AMR3 SJA_BaseAdr+0x16 //驗(yàn)收屏蔽寄存器
- #define REG_AMR4 SJA_BaseAdr+0x17 //驗(yàn)收屏蔽寄存器
- // 發(fā)送緩沖區(qū)寄存器
- #define REG_TXBuffer1 SJA_BaseAdr+0x10 //發(fā)送緩沖區(qū)1
- #define REG_TXBuffer2 SJA_BaseAdr+0x11 //發(fā)送緩沖區(qū)2
- #define REG_TXBuffer3 SJA_BaseAdr+0x12 //發(fā)送緩沖區(qū)3
- #define REG_TXBuffer4 SJA_BaseAdr+0x13 //發(fā)送緩沖區(qū)4
- #define REG_TXBuffer5 SJA_BaseAdr+0x14 //發(fā)送緩沖區(qū)5
- #define REG_TXBuffer6 SJA_BaseAdr+0x15 //發(fā)送緩沖區(qū)6
- #define REG_TXBuffer7 SJA_BaseAdr+0x16 //發(fā)送緩沖區(qū)7
- #define REG_TXBuffer8 SJA_BaseAdr+0x17 //發(fā)送緩沖區(qū)8
- #define REG_TXBuffer9 SJA_BaseAdr+0x18 //發(fā)送緩沖區(qū)9
- #define REG_TXBuffer10 SJA_BaseAdr+0x19 //發(fā)送緩沖區(qū)10
- #define REG_TXBuffer11 SJA_BaseAdr+0x1A //發(fā)送緩沖區(qū)11
- #define REG_TXBuffer12 SJA_BaseAdr+0x1B //發(fā)送緩沖區(qū)12
- #define REG_TXBuffer13 SJA_BaseAdr+0x1C //發(fā)送緩沖區(qū)13
- // 接收緩沖區(qū)寄存器
- #define REG_RXBuffer1 SJA_BaseAdr+0x10 //接收緩沖區(qū)1
- #define REG_RXBuffer2 SJA_BaseAdr+0x11 //接收緩沖區(qū)2
- #define REG_RXBuffer3 SJA_BaseAdr+0x12 //接收緩沖區(qū)3
- #define REG_RXBuffer4 SJA_BaseAdr+0x13 //接收緩沖區(qū)4
- #define REG_RXBuffer5 SJA_BaseAdr+0x14 //接收緩沖區(qū)5
- #define REG_RXBuffer6 SJA_BaseAdr+0x15 //接收緩沖區(qū)6
- #define REG_RXBuffer7 SJA_BaseAdr+0x16 //接收緩沖區(qū)7
- #define REG_RXBuffer8 SJA_BaseAdr+0x17 //接收緩沖區(qū)8
- #define REG_RXBuffer9 SJA_BaseAdr+0x18 //接收緩沖區(qū)9
- #define REG_RXBuffer10 SJA_BaseAdr+0x19 //接收緩沖區(qū)10
- #define REG_RXBuffer11 SJA_BaseAdr+0x1A //接收緩沖區(qū)11
- #define REG_RXBuffer12 SJA_BaseAdr+0x1B //接收緩沖區(qū)12
- #define REG_RXBuffer13 SJA_BaseAdr+0x1C //接收緩沖區(qū)13
- #define REG_RXCOUNT SJA_BaseAdr+0x1D //RX報(bào)文計(jì)數(shù)器
- #define REG_RBSA SJA_BaseAdr+0x1E //接收緩沖區(qū)起始地址
- #define REG_CDR SJA_BaseAdr+0x1F //時(shí)鐘分頻寄存器
- //功能說(shuō)明: CAN控制器SJA1000通訊波特率.SJA1000的晶振為必須為24MHZ*/
- #define BTR0_Rate_10k 0xEF //20KBPS的預(yù)設(shè)值
- #define BTR1_Rate_10k 0xFF //20KBPS的預(yù)設(shè)值
- /*
- 功能說(shuō)明: CAN控制器SJA1000通訊波特率.SJA1000的晶振為必須為16MHZ*/
- #define BTR0_Rate_20k 0x53 //20KBPS的預(yù)設(shè)值
- #define BTR1_Rate_20k 0x2F //20KBPS的預(yù)設(shè)值
- #define BTR0_Rate_40k 0x87 //40KBPS的預(yù)設(shè)值
- #define BTR1_Rate_40k 0xFF //40KBPS的預(yù)設(shè)值
- #define BTR0_Rate_50k 0x47 //50KBPS的預(yù)設(shè)值
- #define BTR1_Rate_50k 0x2F //50KBPS的預(yù)設(shè)值
- #define BTR0_Rate_80k 0x83 //80KBPS的預(yù)設(shè)值
- #define BTR1_Rate_80k 0xFF //80KBPS的預(yù)設(shè)值
- #define BTR0_Rate_100k 0x43 //100KBPS的預(yù)設(shè)值
- #define BTR1_Rate_100k 0x2f //100KBPS的預(yù)設(shè)值
- #define BTR0_Rate_125k 0x03 //125KBPS的預(yù)設(shè)值
- #define BTR1_Rate_125k 0x1c //125KBPS的預(yù)設(shè)值
- #define BTR0_Rate_200k 0x81 //200KBPS的預(yù)設(shè)值
- #define BTR1_Rate_200k 0xFA //200KBPS的預(yù)設(shè)值
- #define BTR0_Rate_250k 0x01 //250KBPS的預(yù)設(shè)值
- #define BTR1_Rate_250k 0x1c //250KBPS的預(yù)設(shè)值
- #define BTR0_Rate_400k 0x80 //400KBPS的預(yù)設(shè)值
- #define BTR1_Rate_400k 0xfa //400KBPS的預(yù)設(shè)值
- #define BTR0_Rate_500k 0x00 //500KBPS的預(yù)設(shè)值
- #define BTR1_Rate_500k 0x1c //500KBPS的預(yù)設(shè)值
- #define BTR0_Rate_666k 0x80 //666KBPS的預(yù)設(shè)值
- #define BTR1_Rate_666k 0xb6 //666KBPS的預(yù)設(shè)值
- #define BTR0_Rate_800k 0x00 //800KBPS的預(yù)設(shè)值
- #define BTR1_Rate_800k 0x16 //800KBPS的預(yù)設(shè)值
- #define BTR0_Rate_1000k 0x00 //1000KBPS的預(yù)設(shè)值
- #define BTR1_Rate_1000k 0x14 //1000KBPS的預(yù)設(shè)值
- //BPS
- #define ByteRate_10k 10 //24MHZ**********************
- #define ByteRate_40k 40
- #define ByteRate_50k 50
- #define ByteRate_80k 80
- #define ByteRate_100k 100
- #define ByteRate_125k 125
- #define ByteRate_200k 200
- #define ByteRate_250k 250
- #define ByteRate_400k 400
- #define ByteRate_500k 500
- #define ByteRate_800k 800
- #define ByteRate_1000k 1000
- //命令字
- #define TR_CMD 0X01
- #define AT_CMD 0X02
- #define RRB_CMD 0X04
- #define COS_CMD 0X08
- #define SRR_CMD 0X10
- #define GTS_CMD 0X10
- //錯(cuò)誤字
- #define CAN_INTERFACE_OK 0
- #define CAN_BUS_OK 0
- #define CAN_INTERFACE_ERR 0XFF
- #define CAN_ENTERSET_ERR 0XFE
- #define CAN_QUITSET_ERR 0XFD
- #define CAN_INITOBJECT_ERR 0XFC
- #define CAN_INITBTR_ERR 0XFB
- #define CAN_INITOUTCTL_ERR 0XFA
- #define CAN_INTCLKDIV_ERR 0XF9
- #define CAN_BUS_ERR 0XF8
- //系統(tǒng)指針,指向SJA1000
- unsigned char xdata *SJA_BCANAdr;
- unsigned char data Tmod_data;
- unsigned char run_lamp_flush_count = 0;
- unsigned char run_lamp_flush_time = 10;
- sbit run_lamp = P1^0;
- unsigned char data send_data[10],RevceData[10];
- //unsigned int data rxbuffer[10]={REG_RXBuffer1,REG_RXBuffer2,REG_RXBuffer3,REG_RXBuffer4,REG_RXBuffer5,REG_RXBuffer6,REG_RXBuffer7,REG_RXBuffer8,REG_RXBuffer9,REG_RXBuffer10};
- //unsigned int data txbuffer[10]={REG_TXBuffer1,REG_TXBuffer2,REG_TXBuffer3,REG_TXBuffer4,REG_TXBuffer5,REG_TXBuffer6,REG_TXBuffer7,REG_TXBuffer8,REG_TXBuffer9,REG_TXBuffer10};
- //unsigned char data Send_CAN_Info_ID[5]={0x08,0x55,0xe0,0x55,0x55};
- //unsigned char data Send_CAN_Info_ID[5]={0x01,0x55,0xe0,0x55,0x55};
- unsigned char data Com_RecBuff[8]={0x01,0x02,0x03,0x4,0x05,0x06,0x07,0x08};
- //unsigned char data Com_RecBuff[8];
- unsigned char bdata flag_init;
- //*************************
- #define INBUF_LEN 8 //數(shù)據(jù)長(zhǎng)度
- unsigned char inbuf1[INBUF_LEN];
- unsigned char checksum,count3=0;
- bit read_flag=0;
- sbit P10=P1^0;
- sbit P11=P1^1;
- sbit P12=P1^2;
- sbit P13=P1^3;
- sbit P16=P1^6;
- sbit P37=P3^7;
- sbit P34=P3^4;
- sbit key=P2^5; //Button按鍵
- sbit P3_5=P3^5;//數(shù)碼管位選
- sbit P2_6=P2^6;
- //***************************
- sbit rcv_flag=flag_init^0;
- sbit err_flag=flag_init^0;
- sbit CS=P2^0;
- //sbit RECOK=P3^4;
- unsigned char RECOK;
- unsigned int msg;
- /************************************************************************
- *函數(shù)原型: void init_serialcomm(void) *
- *參數(shù)說(shuō)明: 串口初始化 * *
- *說(shuō)明: 設(shè)值單片機(jī)的定時(shí)器1的方式選擇波特率 。該子程序只能用于復(fù)位模式
- ************************************************************************/
- void init_serialcomm(void)
- {
- SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
- TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
- PCON |= 0x80; //SMOD=1;
- TH1 = 0xF4; //Baud:57600 fosc=11.0592MHz
- TL1 = 0xF4; //baud:57600 fosc=22.1184MHz 0xFE
- IE |= 0x90; //Enable Serial Interrupt
- TR1 = 1; // timer 1 run
- // TI=1;
- }
- //定時(shí)器0初始化
- void timer0initial()
- {
- TMOD |= 0x1; //工作方式16位定時(shí)計(jì)數(shù)器
- TH0=0xb8;TL0=0x00; //50MS定時(shí)初值(T0計(jì)時(shí)用)
- IE |= 0x90; //Enable Serial Interrupt
- ET0=0;TR0=0;
- }
- //向串口發(fā)送一個(gè)字符
- void send_char_com(unsigned char ch)
- {
- SBUF=ch;
- while(!TI);
- TI=0;
- }
- //向串口發(fā)送一個(gè)字符串,strlen為該字符串長(zhǎng)度
- void send_string_com(unsigned char *str,unsigned int strlen)
- {
- unsigned int k=0;
- do
- {
- send_char_com(*(str + k));
- k++;
- } while(k < strlen);
- }
- //定時(shí)器0中斷,不夠8個(gè)就在此發(fā)送
- void time_intt0(void) interrupt 1 using 2
- {
- ET0=0;TR0=0;TH0=0xb8;TL0=0x00;
- CAN_Send_anylength(inbuf1,count3);
- count3=0;
- memset(inbuf1,0,8);
- }
- //串口接收中斷函數(shù)
- void serial () interrupt 4 using 1
- {
-
- if(RI)
- {
-
- unsigned char ch;
- RI = 0;
- ET0=1;TR0=1;
- ch=SBUF;
-
- {
- inbuf1[count3]=ch;
- count3=count3+1;
- if( count3==INBUF_LEN)
- {
- ET0=0;TR0=0;TH0=0xb8;TL0=0x00;//關(guān)閉定時(shí)中斷,停止定時(shí)中斷
- count3=0;
- /*P34=0;
- P10=!P10;
- P11=!P11;
- P12=!P12;
- P13=!P13;*/
- CAN_Send_anylength(inbuf1,8);
- memset(inbuf1,0,8);
-
- }
-
- }
- }
- }
- //***********************************************************************
- /************************************************************************
- *函數(shù)原型: bit BCAN_SET_OUTCLK( unsigned char Clock_Out) *
- *參數(shù)說(shuō)明: *
- * Clock_Out:存放時(shí)鐘分頻寄存器(CDR)的參數(shù)設(shè)置 *
- *返回值: *
- * 0 ;設(shè)置成功 *
- * 1 ;設(shè)置失敗 *
- *說(shuō)明:設(shè)置SJA1000的時(shí)鐘分頻 。該子程序只能用于復(fù)位模式
- ************************************************************************/
- bit BCAN_SET_OUTCLK(unsigned char Clock_Out)
- {
- SJA_BCANAdr=REG_CDR;
- *SJA_BCANAdr=Clock_Out;
- if(*SJA_BCANAdr != Clock_Out)
- return 1;
- else
- return 0;
- }
- /************************************************************************
- *函數(shù)原型: bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3
- BCAN_AMR0, BCAN_AMR1, BCAN_AMR2, BCAN_AMR3
- *參數(shù)說(shuō)明: *
- * BCAN_ACR(0-3):存放驗(yàn)收代碼寄存器(ACR)的參數(shù)設(shè)置 *
- * BCAN_AMR(0-3):存放接收屏蔽寄存器(AMR)的參數(shù)設(shè)置 *
- *返回值: *
- * 0 ;設(shè)置成功 *
- * 1 ;設(shè)置失敗 *
- *說(shuō)明:設(shè)置CAN節(jié)點(diǎn)的通訊對(duì)象,允許接收的報(bào)文,是由AMR和ACR共同決定的. *
- *************************************************************************/
- bit BCAN_SET_OBJECT(unsigned char BCAN_ACR0,BCAN_ACR1,BCAN_ACR2,BCAN_ACR3,BCAN_AMR0,BCAN_AMR1,BCAN_AMR2,BCAN_AMR3)
- {
- SJA_BCANAdr=REG_TXBuffer1;
- *SJA_BCANAdr=BCAN_ACR0; //寫入?yún)?shù)
-
- SJA_BCANAdr=REG_TXBuffer2;
- *SJA_BCANAdr=BCAN_ACR1;
- SJA_BCANAdr=REG_TXBuffer3;
- *SJA_BCANAdr=BCAN_ACR2;
-
- SJA_BCANAdr=REG_TXBuffer4;
- *SJA_BCANAdr=BCAN_ACR3;
-
- //校驗(yàn)寫入值
- if(*SJA_BCANAdr != BCAN_ACR3) return 1;
-
- SJA_BCANAdr=REG_TXBuffer5;
- *SJA_BCANAdr=BCAN_AMR0; //寫入?yún)?shù)
-
- SJA_BCANAdr=REG_TXBuffer6;
- *SJA_BCANAdr=BCAN_AMR1;
- SJA_BCANAdr=REG_TXBuffer7;
- *SJA_BCANAdr=BCAN_AMR2;
- SJA_BCANAdr=REG_TXBuffer8;
- *SJA_BCANAdr=BCAN_AMR3;
- //校驗(yàn)寫入值
- if(*SJA_BCANAdr != BCAN_AMR3) return 1;
- return 0;
- }
- /************************************************************************
- ;*函數(shù)原型: bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) *
- ;*返回值: *
- ;* 0 ;波特率設(shè)置成功 *
- ;* 1 ;波特率設(shè)置失敗 *
- ;* *
- ;*說(shuō)明:設(shè)置CAN控制器SJA1000通訊波特率.SJA1000的晶振必須為16MHZ, *
- ;* 其它晶體的頻率的值的波特率,需自己計(jì)算 。該子程序只能用于 *
- ;* 復(fù)位模式 *
- ;************************************************************************/
- bit BCAN_SET_BANDRATE(unsigned char CAN_ByteRate) //波特率選擇
- {
- unsigned char BR_Num= CAN_ByteRate,BTR0_num,BTR1_num;
- switch (BR_Num)
- {
- case ByteRate_10k:
- BTR0_num=0xef;
- BTR1_num=0xff;
- break;
- case ByteRate_40k :
- BTR0_num=0x87;
- BTR1_num=0xff;
- break;
- case ByteRate_50k:
- //BTR0_num=0x47;
- //BTR1_num=0x2f;
- BTR0_num=0x0e;
- BTR1_num=0x1c;
- break;
- case ByteRate_80k :
- //BTR0_num=0x83;
- //BTR1_num=0xff;
- BTR0_num=0x49; //ok
- BTR1_num=0x1b;
- break;
- case ByteRate_100k :
- //BTR0_num=0x43;
- //BTR1_num=0x2f;
- BTR0_num=0x04; //ok
- BTR1_num=0x1c;
- break;
- case ByteRate_125k : //SJA1000的晶振為必須為16MHZ,波特率設(shè)置為125kpbs
- BTR0_num=0x03;
- BTR1_num=0x1c;
- //BTR0_num=0x44; //ok
- //BTR1_num=0x1f;
- break;
- case ByteRate_200k ://24MHZ
- // BTR0_num=0xc5; //
- // BTR1_num=0xa5;
- BTR0_num=0x43; //ok
- BTR1_num=0x1b;
- break;
- case ByteRate_250k ://24MHZ
- // BTR0_num=0xc5; //
- // BTR1_num=0xa5;
- BTR0_num=0x01; //ok
- BTR1_num=0x1c;
- break;
- /* case ByteRate_200k ://24MHZ
- BTR0_num=0x81;
- BTR1_num=0xFA;
- break;*/
- case ByteRate_400k :
- BTR0_num=0x80;
- BTR1_num=0xfa;
- break;
- case ByteRate_500k :
- BTR0_num=0x01;
- BTR1_num=0x1c;
- break;
- case ByteRate_800k :
- BTR0_num=0x00;
- BTR1_num=0x16;
- break;
- case ByteRate_1000k :
- BTR0_num=0x00;
- BTR1_num=0x14;
- break;
- default :
- return 1;
- break;
- }
- SJA_BCANAdr=REG_BTR0;
- *SJA_BCANAdr=BTR0_num;
- if(*SJA_BCANAdr!=BTR0_num)
- {return 1;}
- SJA_BCANAdr=REG_BTR1;
- *SJA_BCANAdr=BTR1_num;
- if(*SJA_BCANAdr!=BTR1_num)
- {return 1;}
- return 0;
- }
- /************************************************************************
- *函數(shù)原型: bit BCAN_SET_CONTROL(unsigend char CMD) *
- *參數(shù)說(shuō)明: 設(shè)置控制寄存器 *
- ************************************************************************/
- bit BCAN_SET_CONTROL(unsigned char CMD)
- { unsigned char TempData;
-
- SJA_BCANAdr=REG_CONTROL; //SJA_BaseAdr+0x00 控制寄存器
- TempData= *SJA_BCANAdr;
-
- *SJA_BCANAdr=CMD;
-
- if (*SJA_BCANAdr == CMD)
- return 0;
- else
- return 1;
- }
- /************************************************************************
- *函數(shù)原型: bit BCAN_CREATE_COMMUNATION(void) *
- *參數(shù)說(shuō)明: 無(wú) *
- *返回值: *
- * 0 ; 表示SJA1000接口正常 *
- * 1 ; 表示SJA1000與處理器接口不正常 *
- *說(shuō)明:該函數(shù)用于檢測(cè)CAN控制器的接口是否正常 *
- ************************************************************************/
- bit BCAN_CREATE_COMMUNATION(void)
- {
- SJA_BCANAdr=REG_TEST;
- *SJA_BCANAdr=0xaa; //寫入測(cè)試值
- if(*SJA_BCANAdr == 0xaa)
- return 0; //讀測(cè)試正確
- else
- return 1;
-
- }
- /************************************************************************
- *函數(shù)原型: bit BCAN_ENTER_RETMODEL(void) *
- *參數(shù)說(shuō)明: 無(wú) *
- *返回值: *
- * 0 ; 表示成功進(jìn)入復(fù)位工作模式 *
- * 1 ; 表示不能進(jìn)入復(fù)位工作模式 *
- * *
- *說(shuō)明: CAN控制器進(jìn)入復(fù)位工作模式 *
- ************************************************************************/
- bit BCAN_ENTER_RETMODEL(void) //置位復(fù)位請(qǐng)求
- {
- unsigned char TempData;
- SJA_BCANAdr = REG_CONTROL;
- TempData= *SJA_BCANAdr;
- *SJA_BCANAdr=0x01; //置位復(fù)位請(qǐng)求 和雙濾波模式
- if((*SJA_BCANAdr&0x01) == 1)
- return 0;
- else
- return 1;
- }
- /************************************************************************
- *函數(shù)原型: BCAN_CMD_PRG(unsigned char cmd) *
- *參數(shù)說(shuō)明: unsigned char cmd *
- *返回值: *
- * 0 ; 請(qǐng)求成功 *
- * 1 ; 請(qǐng)求失敗 *
- * *
- *說(shuō)明: 啟動(dòng)命令字 *
- ************************************************************************/
- bit BCAN_CMD_PRG(unsigned char cmd)
- {
- SJA_BCANAdr=REG_COMMAND; //訪問(wèn)地址指向命令寄存器
- *SJA_BCANAdr=cmd; //啟動(dòng)命令字
-
- switch(cmd)
- { case TR_CMD:
- return 0;
- break;
- case SRR_CMD:
- return 0;
- break;
-
- case AT_CMD:
- SJA_BCANAdr = REG_STATUS; //訪問(wèn)地址指向狀態(tài)寄存器
- if((*SJA_BCANAdr & 0x20)==0) //判斷是否正在發(fā)送
- return 0;
- else
- return 1;
- break;
- case RRB_CMD:
- SJA_BCANAdr = REG_STATUS; //訪問(wèn)地址指向狀態(tài)寄存器
- if((*SJA_BCANAdr & 0x01)==1)
- return 1;
- else
- return 0;
- break;
- case COS_CMD:
- SJA_BCANAdr = REG_STATUS;
- if((*SJA_BCANAdr & 0x02)==0)//判斷清除超載是否成功
- return 0;
- else
- return 1;
- break;
- default:
- return 1;
- break;
- }
- }
- /****************************************************
- **函數(shù)原型: void ex0_int(void) interrupt 0 //using 1
- **功 能: 中斷接收函數(shù)
- **入口參數(shù): 無(wú)
- **出口參數(shù): RevceData[]數(shù)組
- **說(shuō) 明: 當(dāng)sja1000 收到正確的報(bào)文時(shí),會(huì)產(chǎn)生int中斷
- *****************************************************/
- void ex0_int(void) interrupt 0 using 1
- {
- unsigned char tt,tt1,length,i;
- /*msg++;
- if(msg==2)
- {
- msg=0;
- P34=0;
- P10=!P10;
- P11=!P11;
- P12=!P12;
- P13=!P13;
- } */
- SJA_BCANAdr=REG_INTERRUPT;
- if((*SJA_BCANAdr)&0x01) //產(chǎn)生了接收中斷
- {
- SJA_BCANAdr=REG_RXBuffer1;
- tt=*SJA_BCANAdr;
- tt1=*SJA_BCANAdr;
- length=tt1&0x0F;
- if ((tt&0x40)!=0x40) //數(shù)據(jù)幀 = 為遠(yuǎn)程幀
- {
- SJA_BCANAdr =REG_RXBuffer4 ; //宏定義的變量不能memcpy(RevceData,REG_RXBuffer4,8);
-
- memcpy(RevceData,SJA_BCANAdr,length); //功能:由src所指內(nèi)存區(qū)域復(fù)制count個(gè)字節(jié)到dest所指內(nèi)存區(qū)域
- //memcpy(Com_RecBuff,RevceData,8); //測(cè)試用的主要是把接收到的數(shù)據(jù)在發(fā)出去,驗(yàn)證數(shù)據(jù)的正確
- //以下代碼是發(fā)送到串
- for(i=0;i<length;i++)
- send_char_com(RevceData[i]);
- display(RevceData[0]);
- /* send_char_com(RevceData[0]);
- send_char_com(RevceData[1]);
- send_char_com(RevceData[2]);
- send_char_com(RevceData[3]);
- send_char_com(RevceData[4]);
- send_char_com(RevceData[5]);
- send_char_com(RevceData[6]);
- send_char_com(RevceData[7]);*/
-
- // RECOK=1; //測(cè)試用的主要是把接收到的數(shù)據(jù)在發(fā)出去,驗(yàn)證數(shù)據(jù)的正確
- }
- BCAN_CMD_PRG(RRB_CMD); //釋放SJA1000接收緩沖區(qū),****已經(jīng)修改
- }
- }
- unsigned char BCAN_DATA_WRITE(unsigned char *SendDataBuf)
- { unsigned char temp;
-
- SJA_BCANAdr = REG_STATUS;
- temp=*SJA_BCANAdr;
- if ((temp&0x08)==0) return 1; //上次發(fā)送未完成
- if ((temp&0x04)==0) return 2; //發(fā)送緩沖區(qū)是否鎖定
- if ((temp&0x10)==0x10) return 3; //判斷是否正在接收
- SJA_BCANAdr = REG_RXBuffer1; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- memcpy(SJA_BCANAdr,SendDataBuf,4);
- BCAN_CMD_PRG(TR_CMD); //請(qǐng)求發(fā)送
- return 0;
- }
- //CAN發(fā)送任意長(zhǎng)度字節(jié)
- void CAN_Send_anylength(unsigned char *CAN_TX_Buf,unsigned char length1)
- {
- unsigned char temptt;
- loop:
- SJA_BCANAdr = REG_STATUS;
- temptt=*SJA_BCANAdr;
- //temptt=Read_SJA1000(REG_STATUS);
- if((temptt&0x04)==0x00) goto loop; //循環(huán)檢測(cè)等待
- //可以向發(fā)送緩沖器寫數(shù)據(jù)
- {
- SJA_BCANAdr = REG_RXBuffer1; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=length1;
- SJA_BCANAdr = REG_RXBuffer2; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=0x00;
- SJA_BCANAdr = REG_RXBuffer3; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=0x00;
- SJA_BCANAdr = REG_RXBuffer4;
- memcpy(SJA_BCANAdr,CAN_TX_Buf,length1);
- //數(shù)據(jù)發(fā)送請(qǐng)求
- BCAN_CMD_PRG(TR_CMD); //請(qǐng)求發(fā)送
- }
- }
- //CAN發(fā)送一個(gè)字節(jié)
- void CAN_Send_onebyte(unsigned char CAN_TX_data,unsigned char length1)
- {
- unsigned char temptt;
- loop:
- SJA_BCANAdr = REG_STATUS;
- temptt=*SJA_BCANAdr;
- //temptt=Read_SJA1000(REG_STATUS);
- if((temptt&0x04)==0x00) goto loop; //循環(huán)檢測(cè)等待
- //可以向發(fā)送緩沖器寫數(shù)據(jù)
- {
- SJA_BCANAdr = REG_RXBuffer1; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=length1;
- SJA_BCANAdr = REG_RXBuffer2; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=0x00;
- SJA_BCANAdr = REG_RXBuffer3; //訪問(wèn)地址指向發(fā)送緩沖區(qū)1,修改成頭文件
- *SJA_BCANAdr=0x00;
- SJA_BCANAdr = REG_RXBuffer4;
- //memcpy(SJA_BCANAdr,CAN_TX_Buf,length1);
- *SJA_BCANAdr=CAN_TX_data;
- //數(shù)據(jù)發(fā)送請(qǐng)求
- BCAN_CMD_PRG(TR_CMD); //請(qǐng)求發(fā)送
- }
- }
- /****************************************************
- **函數(shù)原型: bit Sja_1000_Init(void)
- **功 能: 初始化SJA10000
- **入口參數(shù): 無(wú)
- **返 回 值:
- 0: 初始化成功
- 1: 復(fù)位失敗
- 2: 測(cè)試sja1000失敗
- 3: 設(shè)置失敗
- 4: 設(shè)置驗(yàn)收濾波器失敗
- 5: 設(shè)置波特率失敗
- *****************************************************/
- unsigned char Sja_1000_Init(void)
- {
- bit s;
- EA=0; //關(guān)總中斷
- s=BCAN_ENTER_RETMODEL();
- if (s==1) return 1;
- s=BCAN_CREATE_COMMUNATION(); //建立通信
- if (s==1) return 2;
- s=BCAN_SET_OUTCLK(0xC8); //Pelican
- if (s==1) return 3;
- s=BCAN_SET_OBJECT(0x01,0xe0,0x02,0xe0,0x00,0x0F,0x00,0x0F);//屏蔽寄存器,都設(shè)為無(wú)關(guān),接收所有報(bào)文
- //當(dāng)屏蔽位為1,不濾波,0就濾波必須相等
- //s=BCAN_SET_OBJECT(0x55,0xe0,0xaa,0xa1,0x00,0x00,0xff,0xff);//驗(yàn)收碼&屏蔽碼
- if (s==1) return 4;
- s=BCAN_SET_BANDRATE(ByteRate_125k); //設(shè)置波特率125K 16MHZ
- if (s==1) return 5;
-
- SJA_BCANAdr=REG_OCR ; //輸出控制寄存器
- *SJA_BCANAdr=0x1a;
- SJA_BCANAdr=REG_INTENABLE;
- *SJA_BCANAdr=0x1D; //設(shè)置中斷,接收和發(fā)送中斷
-
- // s=BCAN_SET_CONTROL(0x08);
- SJA_BCANAdr=REG_CONTROL; //退出 復(fù)位模式
- *SJA_BCANAdr=*SJA_BCANAdr&0xfe;
- if(*SJA_BCANAdr!=0x00)
- return 6;
- //if (s==1) return 6;
- EA=1;
- return 0;
- }
- /****************************************************
- **函數(shù)原型: void display(unsigned char num)
- **功 能: 數(shù)碼管顯示
- **入口參數(shù): 要顯示字符
- **出口參數(shù): 無(wú)
- **說(shuō) 明: 當(dāng)SJA1000收到正確的報(bào)文時(shí),然后顯示出來(lái)
- *****************************************************/
- unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
- void display(unsigned char num) // 顯示子函數(shù)
- {
- P3_5=0;//選通第一位數(shù)碼管的陽(yáng)極位選端,即給數(shù)碼管的共陽(yáng)極供電
- P2_6=0;//選通第二位數(shù)碼管的陽(yáng)極位選端,即給數(shù)碼管的共陽(yáng)極供電
- P1=table[num]; //將第num個(gè)顯示編碼送P0口
- }
- //***************************************************
- //初始化cpu
- //**************************************************
- void Init_Cpu(void) //單片機(jī)初始化,開放外部中斷0
- {
- PX0=1;
- EX0=1;
- IT0=0;
- // EA=1;
- }
- /****************************************************
- **函數(shù)原型: void main(void)
- **功 能: 主程序部分:
- **入口參數(shù): 無(wú)
- **返 回 值:
- *****************************************************/
- void main(void)
- {
- unsigned char temptt,ss;
- unsigned char num=0;
- CS=0; //片選擇引腳
- EA=0;
- Init_Cpu();
-
- init_serialcomm(); //初始化串口
- timer0initial(); //定時(shí)器0初始化
- P34=0; //選通數(shù)碼管控制開關(guān)
- display(11); //顯示該板號(hào)A
- //初始化SJA1000
- ss=Sja_1000_Init();
- if (ss!=0) //初始化失敗
- //send_string_com("init fail!");**********************
- send_char_com(0xBB); //測(cè)試專用發(fā)送到串口看狀態(tài)
- else
- EA=1; //初始化成功,開總中斷
-
- //次標(biāo)識(shí)位可以作為,串口接收完,置標(biāo)志然后發(fā)送出去或者當(dāng)作按鍵發(fā)送******
- while(1)
- {
-
- //CAN_Send_anylength(Com_RecBuff,8);
- if(key==0)
- {
- delay10ms();
- while(key==0);
- num=num+1;if(num==16) num=0;
- CAN_Send_onebyte(num); //發(fā)送按鍵狀態(tài)
- // CAN_Send_anylength(Com_RecBuff,8);
- CAN_Send_onebyte(num,1);
- display(num);
- if(num==16) num=0;
- delay10ms();
- }
-
- SJA_BCANAdr = REG_STATUS;
- temptt=*SJA_BCANAdr;
- delay_ms(100);
- if ((temptt&0x40)==0x40) //讀錯(cuò)誤狀態(tài)
- {
- Sja_1000_Init();
- send_char_com(0xee); //測(cè)試專用發(fā)送到串口看狀態(tài)
- }
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
點(diǎn)對(duì)點(diǎn)帶濾波的例程.rar
(122.38 KB, 下載次數(shù): 36)
2018-4-13 11:42 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|