主函數(shù):
#include #include #include #define uchar unsigned char #define uint unsigned int #define nop() asm("nop") #define CS RD1 //標(biāo)簽為CANCSRH4 #define RESET RD0 //標(biāo)簽為RESETCAN __CONFIG (CP_OFF &WDTE_OFF& BOREN_OFF&PWRTE_OFF &FOSC_HS&WRT_OFF&LVP_OFF&CPD_OFF); void Init_Int(void);//初始化中斷 void Init_Can(void);//初始化CAN通訊 void interrupt ISR(void);//中斷處理函數(shù) void delay(unsigned int n);//毫秒延時(shí)函數(shù) void CAN_Set_Var(uchar address,uchar mask,uchar dat);//修改寄存器的值,mask為掩碼 void Init_Spi(void);//初始化SPI void SPISendByte(unsigned char dat);//SPI 發(fā)送一個(gè)字節(jié)數(shù)據(jù) char SPIRecvByte(void);//SPI 讀取一個(gè)字節(jié)數(shù)據(jù) void CAN_Write_SS(uchar address ,uchar Value);//往MCP2515寫一個(gè)字節(jié)數(shù) char CAN_Read_SS(uchar address);//從MCP2515讀一個(gè)字節(jié)數(shù) //void CAN_Send_End(void);//CAN發(fā)送程序 void CAN_Send(unsigned char *CAN_TX_Buf);//發(fā)送數(shù)據(jù) void SPIReset(void);//SPI復(fù)位 void CAN_writetxb0id(unsigned int txb0id); unsigned char dummy; unsigned char cansentbuf[8]; unsigned char canrecbuf[8]; void main() { Init_Int();//初始化中斷 //SPI init Init_Spi();//初始化SPI //can init RESET=0; delay(100); RESET=1; delay(100); Init_Can();//初始化CAN通訊 CAN_writetxb0id(0x0025); cansentbuf[0]=1; cansentbuf[1]=0; cansentbuf[2]=0x29; cansentbuf[3]=0; cansentbuf[4]=0; cansentbuf[5]=0; cansentbuf[6]=0; cansentbuf[7]=0; // for(bats2chloop=3;bats2chloop<8;bats2chloop++) // { // cansentbuf[bats2chloop]=0; // } // cansentbuf[5]=batleft; // cansentbuf[6]=batright; /*發(fā)一幀數(shù)據(jù)*/ CAN_Send(cansentbuf); while(1) { //發(fā)送數(shù)據(jù) CAN_writetxb0id(0x0025);//幀ID // cansentbuf[0]=1; // cansentbuf[1]=0; // cansentbuf[2]=0x29; // cansentbuf[3]=0; // cansentbuf[4]=0; // cansentbuf[5]=0; // cansentbuf[6]=0; // cansentbuf[7]=0; CAN_Send(cansentbuf); // CAN_Send(cansentbuf); // delay(100); // SPISendByte(0XAA); // SPISendByte(0X00); // SPISendByte(0X00); delay(100); } } //初始化中斷 void Init_Int(void) { OPTION_REG = 0b00000000;//B口弱上拉,RB0為下降沿觸發(fā)中斷 TRISB = 0b00000001;//設(shè)定RB0為輸入,其余為輸出 INTCON = 0b10010000;//允許RB0/INT中斷 } //初始化SPI void Init_Spi(void) { TRISC=0b00010000;//RC5/SDO為輸出,RD4/SDI為輸入,RC3/SCK為輸出 //SSPSTAT_SMP=0;//在數(shù)據(jù)輸出時(shí)間的中間采樣輸入數(shù)據(jù) //CKE:SPI 時(shí)鐘邊沿選擇位 CKP = 0: STAT_CKE=1 在SCK 引腳的上升沿發(fā)送數(shù)據(jù) //SSPSTAT=0X80;//在數(shù)據(jù)輸出時(shí)間的末尾采樣輸入數(shù)據(jù) SSPSTAT=0X40;//在數(shù)據(jù)輸出時(shí)間的中間采樣輸入數(shù)據(jù) bit 7,SMP=0,采樣位 //SSPEN=1;//SPI串口使能 //CKP=0;//空閑時(shí)鐘為低電平 //SSPCON+=0b0001;//SPI主控模式,時(shí)鐘為Fosc/16 /*SSPEN=1;使能串行端口;CKP=2,時(shí)鐘空閑狀態(tài)為高電平 SSPM<3:0>=0001,主控模式,時(shí)鐘=Fosc/16 */ //SSPCON=0x31; SSPCON=0x21;//bit 4,CKP:時(shí)鐘極性選擇位,0 = 時(shí)鐘空閑狀態(tài)為低電平 TRISD=0b00000000;//RD1輸出;RD0輸出; } //中斷服務(wù)程序 void interrupt ISR(void) { // if(INTF==1)//如果是INT中斷才執(zhí)行以下程序 // { // // INTF==1;//清中斷標(biāo)志位 // } uchar Sta_Int,i; Sta_Int=CAN_Read_SS(0X2C);//讀中斷標(biāo)志寄存器 CAN_Write_SS(0X2C,0x00);//清除所有中斷標(biāo)志位 /*如果為接收緩沖器0中斷*/ if(Sta_Int & 0x01) { for(i=0;i<12;i++) { //Put_Char(CAN_Read_SS(0x60+i)); } //com_fs=com_fs+12 } } //延時(shí)(n)ms void delay(unsigned int n) { unsigned int j; char k; for(j=0;j nop(); } //SPI 讀取一個(gè)字節(jié)數(shù)據(jù) char SPIRecvByte(void) { //從MISO線上讀取一個(gè)數(shù)據(jù)字節(jié) char BUF; // SPISendByte(0x01); // SPISendByte(0x80|0x00); // nop();//延時(shí) // SPISendByte(0);//給SSPBUF一個(gè)0,才能開始讀取SSPBUF的數(shù)據(jù) SSPBUF=0x00; delay(2); BUF=SSPBUF; delay(20); return BUF; } //SPI 發(fā)送一個(gè)字節(jié)數(shù)據(jù) void SPISendByte(unsigned char dat) { SSPBUF=dat;//往緩沖里面寫入dat // while(!SSPIF)//等待寫入成功 // SSPIF=0;//SSPIF清零 delay(20); } //往MCP2515指定地址addr寫一個(gè)字節(jié)數(shù)據(jù)value void CAN_Write_SS(uchar address ,uchar Value) { CS=0; SPISendByte(0x02);//寫命令 SPISendByte(address);//寫地址 SPISendByte(Value);//寫數(shù)據(jù) CS=1; } //從MCP2515指定地址addr讀取一個(gè)字節(jié)數(shù)據(jù)value char CAN_Read_SS(uchar address) { char BUF; CS=0; // delay(5); SPISendByte(0x03);//讀命令 SPISendByte(address);//讀地址 BUF=SPIRecvByte();//讀一個(gè)字節(jié)數(shù)據(jù) CS=1; return BUF; } //SPI復(fù)位 void SPIReset(void) { // CS=LOW; // WriteSPI(CAN_RESET); // CS=HIGH; CS=0; SSPBUF=0XC0;//CAN_RESET=0XC0 // RESET=1; // RESET=0; delay(20); // RESET=1; CS=1; } /**修改寄存器的值**/ //mask為掩碼 void CAN_Set_Var(uchar address,uchar mask,uchar dat) { // CS=1;//片選 // delay(10); CS=0; delay(10); SPISendByte(0x05);//位修改命令 CAN_BIT_MODIFY //CANCTRL——CAN 控制寄存器(地址:XFh) SPISendByte(address);//地址為0fH SPISendByte(mask);//掩碼為E0H,修改CANCTRL的高三位 SPISendByte(dat); CS=1;//片選 } //初始化CAN通訊 void Init_Can(void) { /**復(fù)位MCP2515**/ SPIReset(); delay(20); /**設(shè)置為配置模式**/ //CAN_Set_Var(0x0F,0XE0,0X80); CAN_Write_SS(RXM0SIDH, 0x00); CAN_Write_SS(RXM0SIDL,0x00); CAN_Write_SS(RXF0SIDH,0x00); CAN_Write_SS(RXF0SIDL,0x00); /**設(shè)置通訊速率 晶振16M 速率125K**/ //CAN_Write_SS(0x2A,0X03); //CAN_Write_SS(0x29,0XB9); //CAN_Write_SS(0x28,0X04); //設(shè)置波特率為125Kbps //set CNF1,SJW=00,長(zhǎng)度為1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5us,16M CAN_Write_SS(CNF1,CAN_125Kbps);//CNF1=0X03 //set CNF2,SAM=0,在采樣點(diǎn)對(duì)總線進(jìn)行一次采樣,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQ CAN_Write_SS(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);//3,1;6,2 //set CNF3,PHSEG2=(2+1)TQ=3TQ,同時(shí)當(dāng)CANCTRL.CLKEN=1時(shí)設(shè)定CLKOUT引腳為時(shí)間輸出使能位 CAN_Write_SS(CNF3,PHSEG2_3TQ);//3;7 //set TXB0,設(shè)置發(fā)送緩沖器0的標(biāo)識(shí)符和發(fā)送的數(shù)據(jù),以及發(fā)送的數(shù)據(jù)長(zhǎng)度 CAN_Write_SS(TXB0SIDH,0x06);//設(shè)置發(fā)送緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改*** CAN_Write_SS(TXB0SIDL,0x00);//用到標(biāo)準(zhǔn)標(biāo)識(shí)符 CAN_Write_SS(TXB0DLC,DLC_8);//設(shè)置發(fā)送數(shù)據(jù)的長(zhǎng)度為8個(gè)字節(jié),DLC_1 //CAN_Write_SS(TXB0D0,0x1E);//有待修改及確定是否使用 //CAN_Write_SS(TXB0D1,0x10);//有待修改及確定是否使用 /*set TXB1 CAN_Write_SS(TXB1SIDH,0x50); //Set TXB0 SIDH CAN_Write_SS(TXB1SIDL,0x00); //Set TXB0 SIDL CAN_Write_SS(TXB1DLC,0x40 | DLC_8); //Set DLC = 3 bytes and RTR bit*/ //設(shè)置接收緩沖器0的標(biāo)識(shí)符和初始化數(shù)據(jù) CAN_Write_SS(RXB0SIDH,0x00);//設(shè)置接收緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改*** CAN_Write_SS(RXB0SIDL,0x60);//用到標(biāo)準(zhǔn)標(biāo)識(shí)符 CAN_Write_SS(RXB0CTRL,0x60);//僅僅接收標(biāo)準(zhǔn)標(biāo)識(shí)符的有效信息,F(xiàn)IILHIT0=0表示RXB0 ,采用FILHIT0 CAN_Write_SS(RXB0DLC,DLC_8);//設(shè)置接收數(shù)據(jù)的長(zhǎng)度為8個(gè)字節(jié) CAN_Write_SS(RXF0SIDH,0xFF);//初始化接收濾波器0,待修改*** CAN_Write_SS(RXF0SIDL,0xE0); CAN_Write_SS(RXM0SIDH,0xFF);//初始化接收屏蔽器0,待修改*** CAN_Write_SS(RXM0SIDL,0xE0); //設(shè)置接收緩沖器0中斷 CAN_Write_SS(CANINTF,0x00);//清空中斷標(biāo)志位 CAN_Write_SS(CANINTE,0x01);//接收緩沖器0滿中斷使能位 CAN_Write_SS(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//設(shè)置正常模式 delay(10); dummy=CAN_Read_SS(CANSTAT); if (OPMODE_NORMAL != (dummy && 0xE0)) CAN_Write_SS(CANCTRL,REQOP_NORMAL | CLKOUT_ENABLED);//判斷進(jìn)入正常工作模式 //CAN_Write_SS(CANCTRL,0x00);//選定正常工作模式 0x00 僅接收標(biāo)準(zhǔn)或擴(kuò)展標(biāo)識(shí)符 0x60 關(guān)閉接收所有數(shù)據(jù) //CAN_Write_SS(0x60,0X60); // 濾波 //CAN_Write_SS(0x00,0); //CAN_Write_SS(0x01,0); //CAN_Write_SS(0x02,0); //CAN_Write_SS(0x03,0); // 屏蔽 //CAN_Write_SS(0x20,0); //CAN_Write_SS(0x21,0); //CAN_Write_SS(0x22,0); // 接收數(shù)據(jù)產(chǎn)生中斷 //CAN_Write_SS(0x2B,0X01); // 環(huán)回模式 CAN_Set_Var(0x0F,0XE0,0X40); 工作模式 //CAN_Set_Var(0x0F,0XE0,0); } void CAN_writetxb0id(unsigned int txb0id) { CAN_Write_SS(TXB0SIDH,(txb0id>>3));//設(shè)置發(fā)送緩沖器0的標(biāo)準(zhǔn)標(biāo)識(shí)符,待修改*** CAN_Write_SS(TXB0SIDL,(0x00FF&(txb0id<<5)));//用到標(biāo)準(zhǔn)標(biāo)識(shí)符 } //CAN發(fā)送數(shù)據(jù)程序 void CAN_Send(unsigned char *CAN_TX_Buf) { unsigned char tempdata; tempdata=CAN_Read_SS(CAN_RD_STATUS); CAN_Write_SS(TXB0D0,CAN_TX_Buf[0]); CAN_Write_SS(TXB0D1,CAN_TX_Buf[1]); CAN_Write_SS(TXB0D2,CAN_TX_Buf[2]); CAN_Write_SS(TXB0D3,CAN_TX_Buf[3]); CAN_Write_SS(TXB0D4,CAN_TX_Buf[4]); CAN_Write_SS(TXB0D5,CAN_TX_Buf[5]); CAN_Write_SS(TXB0D6,CAN_TX_Buf[6]); CAN_Write_SS(TXB0D7,CAN_TX_Buf[7]); if(tempdata&0x04)//判斷TXREQ標(biāo)志位 { delay(5); CAN_Write_SS(TXB0CTRL,0);//清除TXREQ標(biāo)志位 while(CAN_Read_SS(CAN_RD_STATUS)&0x04);//等待TXREQ清零 } CS=0; SPISendByte(CAN_RTS_TXB0);//發(fā)送緩沖器0請(qǐng)求發(fā)送 CS=1; } 頭文件1: #ifndef __CAN_H__ #define __CAN_H__ // write your header here #include #define CAN_10Kbps 0x31 #define CAN_25Kbps 0x13 #define CAN_50Kbps 0x09 #define CAN_100Kbps 0x04 #define CAN_125Kbps 0x07 #define CAN_250Kbps 0x01 #define CAN_500Kbps 0x00 #endif 頭文件2: #ifndef __2515_h__ #define __2515_h__ // write your header here //#pragma nolist /********************************************************************* * CAN MCP2510 C definitions file * ********************************************************************* * Filename: 2515REGS.h * * Date: 06/17/03 * * File Version: 1.00 (Beta) * ********************************************************************* * Functions: * * Header file * ********************************************************************* * Revision History: * * 06/17/03 Updated from MCP2510.inc which was for the 756 board * *********************************************************************/ /******************************************************************* * Register Definitions *
上一篇:PIC18F45K80 將RA0等配置為數(shù)字輸入I/O
下一篇:PIC知識(shí)點(diǎn)匯總
推薦閱讀
史海拾趣
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦
- 神經(jīng)形態(tài)芯片可能是革新機(jī)器人實(shí)時(shí)電機(jī)控制的未來
- 從三個(gè)方面理解ARM嵌入式系統(tǒng)
- 自動(dòng)報(bào)警 基于MCU的家庭防盜報(bào)警系統(tǒng)的設(shè)計(jì)
- 存儲(chǔ)控制器及其訪問外設(shè)的原理
- 基于51系列單片機(jī)的智能照明控制系統(tǒng)設(shè)計(jì)方案
- 基于STM32的四旋翼飛行器控制系統(tǒng)
- 單片機(jī)應(yīng)用編程技巧解析
- 基于89C52的教室智能節(jié)能照明系統(tǒng)設(shè)計(jì)
- 一種新型的雨量光照傳感器的設(shè)計(jì)
- 蜂巢能源2025年試產(chǎn)半固態(tài)電池,2027年大批量供貨
- 激光雷達(dá)進(jìn)化論:RoboSense如何持續(xù)領(lǐng)跑?
- 法雷奧-全景顯示技術(shù) Panovision | 申報(bào)2025第七屆金輯獎(jiǎng)中國汽車新供應(yīng)鏈百強(qiáng)
- 公安部:目前我國市售汽車搭載的“智駕”系統(tǒng),都不具備“自動(dòng)駕駛”功能
- 德賽西威-旗艦級(jí)AI智能座艙域控制器 | 申報(bào)2025第七屆金輯獎(jiǎng)中國汽車新供應(yīng)鏈百強(qiáng)
- Mobileye推出駕駛員監(jiān)測(cè)系統(tǒng)(DMS)技術(shù) ,實(shí)現(xiàn)人與車輛協(xié)同駕駛
- 第三屆安富利汽車生態(tài)圈峰會(huì)盛大啟幕,雙城聯(lián)動(dòng)激發(fā)智慧出行產(chǎn)業(yè)新動(dòng)能
- Vicor Corporation 2025年第二季度財(cái)報(bào):專利訴訟和解推動(dòng)強(qiáng)勁增長(zhǎng)
- 智能底盤2.0競(jìng)賽,這家外資巨頭按下加速鍵
- GaN技術(shù)如何應(yīng)用到人形機(jī)器人執(zhí)行關(guān)節(jié)?
- Silicon Labs BG22-EK4108A 開發(fā)套件 用科技連接未來 申請(qǐng)進(jìn)行時(shí)!
- 【主題月活動(dòng)】術(shù)業(yè)有專攻,電容我在行!
- 有獎(jiǎng)評(píng)測(cè):平頭哥RISC-V低功耗板——RVB2601
- 【白皮書免費(fèi)下載】施耐德電氣三寶典:智能配電、關(guān)鍵電源,全生命周期服務(wù)
- 閱讀并了解是德科技 Power Supply 精彩專題,參與答題贏好禮!
- 親歷易電源——易電源電源模塊試用!
- TI“無線”風(fēng)光可穿戴現(xiàn)場(chǎng)培訓(xùn)直播,誠邀參與,預(yù)注冊(cè)贏好禮
- 低電平大本營(yíng) 這些熱門研究正在發(fā)生 速度解密!
- 國網(wǎng)浙江電力創(chuàng)新拓展綜合能源服務(wù)業(yè)務(wù)
- 華北電網(wǎng)負(fù)荷創(chuàng)歷史新高
- 國網(wǎng)江蘇電力投運(yùn)“多站合一”全直流預(yù)制式數(shù)據(jù)中心
- 紐約停電!安全以外,讓我們?cè)僬務(wù)勚腔?/a>
- CiA推出全新CAN-FD Light,引入主從概念
- 無手無腳:4毫米軟體機(jī)器人能派上什么用場(chǎng)?
- 國家力推IPv6舉步維艱 主要有六大原因
- Molex/Microchip聯(lián)合開發(fā)汽車USB媒體模組與USB功率輸出解決方案
- 自動(dòng)駕駛車還需 10~15 年才能成熟 Uber欲打造“純”電力飛行
- 愛奇藝推科技綜藝《機(jī)器人爭(zhēng)霸》
- 開關(guān)電源SPICE仿真與實(shí)用設(shè)計(jì)
- 請(qǐng)教射頻信號(hào)一分二分配器原理,有原理圖
- TC35開發(fā)的程序,遇到“你撥打的號(hào)碼是空號(hào)”
- 射頻放大器的種類和結(jié)構(gòu)
- 32768晶體不能碰,一碰就停
- 求助計(jì)算兩個(gè)存儲(chǔ)器數(shù)的差
- MSP430F5529 看門狗的設(shè)置
- 如何在仿真時(shí)觀察變量[2407的問題]
- ADUC 模擬微控制器全系列列表圖
- 有沒有那位做過Labview for ARM的,問下如何添加在Labview中添加對(duì)LM3S9b96的支持?