版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
/*============================================================
CfileaboutMCP2515
V1.00
==============================================================
Chip:
MCP2515
Function:
ThecontrollerofCAN-BUS
Writer:
FenghuiZhu
Data:
2009.3.31
Reference:
"mcp2515.c"ofFabianGreif
=============================================================*///*********************
//*頭文件配置區(qū)*
//*********************
#include"mcp2515.h"http://**********************
//*
函數(shù)聲明區(qū)
*
//**********************
voidmcp2515_init(void);voidmcp2515_write_register(u08data,u08adress);u08mcp2515_read_register(u08adress);voidmcp2515_bit_modify(u08data,u08mask,u08adress);voidmcp2515_write_register_p(u08adress,u08*data,u08length);//**********************
//*
函數(shù)定義區(qū)
*
//**********************//**********************************************************//
//
函數(shù)說明:MCP2515初始化程序
//
//
輸入:
無
//
//
輸出:
無
//
//
調(diào)用函數(shù):
//
//**********************************************************//
voidmcp2515_init(void)
{
//初始化MCU的SPI總線
//SPI_MasterInit();
//MCP2515啟動前進(jìn)行軟件復(fù)位
SPI_PORT&=~(1<<SPI_CS);
//MCP2515的CS有效
SPI_MasterTransmit(SPI_RESET);
SPI_PORT|=(1<<SPI_CS);
//MCP2515的CS無效
//使用位修改指令將MCP2515設(shè)置為配置模式
//也就是將CANCTRL寄存器的REQOP[2:0]設(shè)置為100
mcp2515_bit_modify(CANCTRL,0xE0,(1<<REQOP2));
/*
//計(jì)算并設(shè)置MCP2515的位時(shí)間
//時(shí)鐘頻率:Fosc
=16MHz
//分頻控制器CNF1.BRP[5:0]=7
//最小時(shí)間份額TQ=2*(BRP+1)/Fosc
=2*(7+1)/16M=1uS
//同步段SyncSeg
=1TQ
//傳播段PropSeg
=(PRSEG+1)*TQ
=1TQ
//相位緩沖段PhaseSeg1=(PHSEG1+1)*TQ=3TQ
//相位緩沖段PhaseSeg2=(PHSEG2+1)*TQ=3TQ
//同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=00,即1TQ
//總線波特率NBR=Fbit=
1/(syncseg+Propseg+PS1+PS2)
//
=1/(8TQ)=1/8uS=125kHz
//設(shè)置分頻控制器CNF1.BRP[5:0]=7,同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=00
mcp2515_write_register(CNF1,(1<<BRP0)|(1<<BRP1)|(1<<BRP2));
//設(shè)置傳播段PropSeg為00,即1TQ,相位緩沖段PhaseSeg1的長度3TQ
mcp2515_write_register(CNF2,(1<<BTLMODE)|(1<<PHSEG11));
//設(shè)置相位緩沖段PhaseSeg2為3TQ,禁用喚醒濾波器
mcp2515_write_register(CNF3,(1<<PHSEG21));
*/
//設(shè)置為500kbps,TQ=1/8us
//設(shè)置分頻控制器CNF1.BRP[5:0]=0,同步跳轉(zhuǎn)長度設(shè)置為CNF1.SJW[1:0]=01
//mcp2515_write_register(CNF1,(1<<BRP0)|(1<<SJW0));
//500kbps
mcp2515_write_register(CNF1,(1<<SJW0));
//1Mbps
//設(shè)置傳播段PropSeg為00,即1TQ,相位緩沖段PhaseSeg1的長度3TQ
mcp2515_write_register(CNF2,(1<<BTLMODE)|(1<<PHSEG11));
//設(shè)置相位緩沖段PhaseSeg2為3TQ,禁用喚醒濾波器
mcp2515_write_register(CNF3,(1<<PHSEG21));
//設(shè)置MCP2515中斷使能寄存器,禁用所有中斷
//mcp2515_write_register(CANINTE,/*(1<<RX1IE)|(1<<RX0IE)*/0);
//設(shè)置MCP2515中斷使能寄存器,使能接收緩沖器中斷
mcp2515_write_register(CANINTE,(1<<RX1IE)|(1<<RX0IE));
//設(shè)置數(shù)據(jù)接收相關(guān)寄存器
//設(shè)置RXM[1:0]=11,關(guān)閉接收緩沖器0屏蔽/濾波功能,接收所有報(bào)文;禁止?jié)L存功能
mcp2515_write_register(RXB0CTRL,(1<<RXM1)|(1<<RXM0));
//設(shè)置RXM[1:0]=11,關(guān)閉接收緩沖器1屏蔽/濾波功能,接收所有報(bào)文;
mcp2515_write_register(RXB1CTRL,(1<<RXM1)|(1<<RXM0));u08temp[4]={0,0,0,0};
//設(shè)置6個(gè)驗(yàn)收濾波寄存器為0,
mcp2515_write_register_p(RXF0SIDH,temp,4);
mcp2515_write_register_p(RXF1SIDH,temp,4);
mcp2515_write_register_p(RXF2SIDH,temp,4);
mcp2515_write_register_p(RXF3SIDH,temp,4);
mcp2515_write_register_p(RXF4SIDH,temp,4);
mcp2515_write_register_p(RXF5SIDH,temp,4);
//設(shè)置2個(gè)驗(yàn)收濾波寄存器為0,
mcp2515_write_register_p(RXM0SIDH,temp,4);
mcp2515_write_register_p(RXM1SIDH,temp,4);
//配置引腳
//設(shè)置接收相關(guān)引腳控制寄存器,配置它們禁用第二功能
mcp2515_write_register(BFPCTRL,0);
//調(diào)試使用,設(shè)置BFPCTRL使RX0BF,RX1BF設(shè)置為數(shù)字輸出。
//mcp2515_bit_modify(BFPCTRL,(1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM),(1<<B1BFE)|(1<<B0BFE));
//設(shè)置發(fā)送相關(guān)引腳控制寄存器,配置它們禁用第二功能
mcp2515_write_register(TXRTSCTRL,0);
//MCP2515進(jìn)入環(huán)回模式,進(jìn)行功能測試
//mcp2515_bit_modify(CANCTRL,0XE0,(1<<REQOP1));
//MCP2515進(jìn)入正常模式
mcp2515_bit_modify(CANCTRL,0xE0,0);
}
//**********************************************************//
//
函數(shù)說明:MCP2515寫控制寄存器程序
//
//
輸入:
寄存器地址,寫入數(shù)據(jù)
//
//
輸出:
無
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//voidmcp2515_write_register(u08adress,u08data)
{
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_WRITE);//發(fā)送SPI寫寄存器控制字
SPI_MasterTransmit(adress);
//發(fā)送寄存器地址
SPI_MasterTransmit(data);
//發(fā)送寄存器數(shù)據(jù)
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
}//**********************************************************//
//
函數(shù)說明:MCP2515讀控制寄存器程序
//
//
輸入:
寄存器地址,
//
//
輸出:
寄存器數(shù)據(jù)
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//u08mcp2515_read_register(u08adress)
{
u08data;
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_READ);//發(fā)送SPI寫寄存器控制字
SPI_MasterTransmit(adress);//發(fā)送寄存器地址
data=SPI_MasterTransmit(0xff);//回讀寄存器數(shù)據(jù)
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
returndata;
}//**********************************************************//
//
函數(shù)說明:讀MCP2515接收緩沖器程序
//
//
輸入:
緩沖器地址,
//
//
輸出:
緩沖器數(shù)據(jù)
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//u08mcp2515_read_rx_buffer(u08adress)
{
u08data;
//判斷adress是否有效,除了1,2位,其余都應(yīng)為0
if(adress&0xF9)
return0;
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_READ_RX|adress);//發(fā)送讀取控制字
data=SPI_MasterTransmit(0xff);//讀回?cái)?shù)據(jù)
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
returndata;
}//**********************************************************//
//
函數(shù)說明:MCP2515控制寄存器位修改程序
//
//
輸入:
寄存器地址,修改位,修改數(shù)據(jù)
//
//
輸出:
無
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//voidmcp2515_bit_modify(u08adress,u08mask,u08data)
{
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_BIT_MODIFY);//SPI位修改指令
SPI_MasterTransmit(adress);
//發(fā)送寄存器地址
SPI_MasterTransmit(mask);
//發(fā)送屏蔽字節(jié),
//屏蔽字節(jié)中“1”表示允許對相應(yīng)位修改,“0”表示禁止修改
SPI_MasterTransmit(data);
//發(fā)送數(shù)據(jù)字節(jié)
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
}//**********************************************************//
//
函數(shù)說明:對MCP2515連續(xù)寄存器進(jìn)行連續(xù)寫操作
//
//
輸入:
連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長度
//
//
輸出:
無
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//
voidmcp2515_write_register_p(u08adress,u08*data,u08length)
{
u08i;
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_WRITE);
//發(fā)送SPI寫指令
SPI_MasterTransmit(adress);
//發(fā)送起始寄存器地址
for(i=0;i<length;i++)
SPI_MasterTransmit(*data++);
//發(fā)送數(shù)據(jù)
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
}//**********************************************************//
//
函數(shù)說明:對MCP2515連續(xù)寄存器進(jìn)行連續(xù)讀操作
//
//
輸入:
連續(xù)寄存器起始地址,數(shù)據(jù)指針,數(shù)據(jù)長度
//
//
輸出:
無
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//
voidmcp2515_read_register_p(u08adress,u08*data,u08length)
{
u08i;
//CSlow,MCP2515enable
SPI_PORT&=~(1<<SPI_CS);
SPI_MasterTransmit(SPI_READ);
//發(fā)送SPI讀指令
SPI_MasterTransmit(adress);
//發(fā)送起始寄存器地址
for(i=0;i<length;i++)
*data++=SPI_MasterTransmit(0xff);
//數(shù)據(jù)保存
//CShigh,MCP2515disable
SPI_PORT|=(1<<SPI_CS);
}頭文件:/*============================================================
HeadfileaboutMCP2515
V1.00
==============================================================
Chip:
MCP2515
Function:
ThecontrollerofCAN-BUS
Writer:
FenghuiZhu
Data:
2009-3-31
Reference:
"mcp2515.h"ofFabianGreif
=============================================================*/#ifndef_MCP2515_H_
#define_MCP2515_H_//*********************
//*用戶類型定義區(qū)
*
//*********************//*********************
//*頭文件配置區(qū)*
//*********************
#include"Habit_Frank.h"
#include"SPI_Ctrl.h"
//********************
//*
系統(tǒng)宏定義
*
//********************//定義寄存器地址
#defineRXF0SIDH0x00
#defineRXF0SIDL0x01
#defineRXF0EID80x02
#defineRXF0EID00x03
#defineRXF1SIDH0x04
#defineRXF1SIDL0x05
#defineRXF1EID80x06
#defineRXF1EID00x07
#defineRXF2SIDH0x08
#defineRXF2SIDL0x09
#defineRXF2EID80x0A
#defineRXF2EID00x0B
#defineBFPCTRL
0x0C
#defineTXRTSCTRL0x0D
#defineCANSTAT
0x0E
#defineCANCTRL
0x0F#defineRXF3SIDH0x10
#defineRXF3SIDL0x11
#defineRXF3EID80x12
#defineRXF3EID00x13
#defineRXF4SIDH0x14
#defineRXF4SIDL0x15
#defineRXF4EID80x16
#defineRXF4EID00x17
#defineRXF5SIDH0x18
#defineRXF5SIDL0x19
#defineRXF5EID80x1A
#defineRXF5EID00x1B
#defineTEC
0x1C
#defineREC
0x1D#defineRXM0SIDH0x20
#defineRXM0SIDL0x21
#defineRXM0EID80x22
#defineRXM0EID00x23
#defineRXM1SIDH0x24
#defineRXM1SIDL0x25
#defineRXM1EID80x26
#defineRXM1EID00x27
#defineCNF3
0x28
#defineCNF2
0x29
#defineCNF1
0x2A
#defineCANINTE
0x2B
#defineCANINTF
0x2C
#defineEFLG
0x2D#defineTXB0CTRL0x30
#defineTXB0SIDH0x31
#defineTXB0SIDL0x32
#defineTXB0EID80x33
#defineTXB0EID00x34
#defineTXB0DLC
0x35
#defineTXB0D0
0x36
#defineTXB0D1
0x37
#defineTXB0D2
0x38
#defineTXB0D3
0x39
#defineTXB0D4
0x3A
#defineTXB0D5
0x3B
#defineTXB0D6
0x3C
#defineTXB0D7
0x3D#defineTXB1CTRL0x40
#defineTXB1SIDH0x41
#defineTXB1SIDL0x42
#defineTXB1EID80x43
#defineTXB1EID00x44
#defineTXB1DLC
0x45
#defineTXB1D0
0x46
#defineTXB1D1
0x47
#defineTXB1D2
0x48
#defineTXB1D3
0x49
#defineTXB1D4
0x4A
#defineTXB1D5
0x4B
#defineTXB1D6
0x4C
#defineTXB1D7
0x4D#defineTXB2CTRL0x50
#defineTXB2SIDH0x51
#defineTXB2SIDL0x52
#defineTXB2EID80x53
#defineTXB2EID00x54
#defineTXB2DLC
0x55
#defineTXB2D0
0x56
#defineTXB2D1
0x57
#defineTXB2D2
0x58
#defineTXB2D3
0x59
#defineTXB2D4
0x5A
#defineTXB2D5
0x5B
#defineTXB2D6
0x5C
#defineTXB2D7
0x5D#defineRXB0CTRL0x60
#defineRXB0SIDH0x61
#defineRXB0SIDL0x62
#defineRXB0EID80x63
#defineRXB0EID00x64
#defineRXB0DLC
0x65
#defineRXB0D0
0x66
#defineRXB0D1
0x67
#defineRXB0D2
0x68
#defineRXB0D3
0x69
#defineRXB0D4
0x6A
#defineRXB0D5
0x6B
#defineRXB0D6
0x6C
#defineRXB0D7
0x6D#defineRXB1CTRL0x70
#defineRXB1SIDH0x71
#defineRXB1SIDL0x72
#defineRXB1EID80x73
#defineRXB1EID00x74
#defineRXB1DLC
0x75
#defineRXB1D0
0x76
#defineRXB1D1
0x77
#defineRXB1D2
0x78
#defineRXB1D3
0x79
#defineRXB1D4
0x7A
#defineRXB1D5
0x7B
#defineRXB1D6
0x7C
#defineRXB1D7
0x7D//定義寄存器BFPCTRL位信息
#defineB1BFS
5
#defineB0BFS
4
#defineB1BFE
3
#defineB0BFE
2
#defineB1BFM
1
#defineB0BFM
0//定義寄存器TXRTSCTRL位信息
#defineB2RTS
5
#defineB1RTS
4
#defineB0RTS
3
#defineB2RTSM
2
#defineB1RTSM
1
#defineB0RTSM
0//定義寄存器CANSTAT位信息
#defineOPMOD2
7
#defineOPMOD1
6
#defineOPMOD0
5
#defineICOD2
3
#defineICOD1
2
#defineICOD0
1
//定義寄存器CANCTRL位信息
#defineREQOP2
7
#defineREQOP1
6
#defineREQOP0
5
#defineABAT
4
#defineCLKEN
2
#defineCLKPRE1
1
#defineCLKPRE0
0
//定義寄存器CNF3位信息
#defineWAKFIL
6
#definePHSEG22
2
#definePHSEG21
1
#definePHSEG20
0
//定義寄存器CNF2位信息
#defineBTLMODE
7
#defineSAM
6
#definePHSEG12
5
#definePHSEG11
4
#definePHSEG10
3
#definePHSEG2
2
#definePHSEG1
1
#definePHSEG0
0
//定義寄存器CNF1位信息
#defineSJW1
7
#defineSJW0
6
#defineBRP5
5
#defineBRP4
4
#defineBRP3
3
#defineBRP2
2
#defineBRP1
1
#defineBRP0
0
//定義寄存器CANINTE位信息
#defineMERRE
7
#defineWAKIE
6
#defineERRIE
5
#defineTX2IE
4
#defineTX1IE
3
#defineTX0IE
2
#defineRX1IE
1
#defineRX0IE
0
//定義寄存器CANINTF位信息
#defineMERRF
7
#defineWAKIF
6
#defineERRIF
5
#defineTX2IF
4
#defineTX1IF
3
#defineTX0IF
2
#defineRX1IF
1
#defineRX0IF
0
//定義寄存器EFLG位信息
#defineRX1OVR
7
#defineRX0OVR
6
#defineTXB0
5
#defineTXEP
4
#defineRXEP
3
#defineTXWAR
2
#defineRXWAR
1
#defineEWARN
0
//定義寄存器TXBnCTRL(n=0,1,2)位信息
#defineABTF
6
#defineMLOA
5
#defineTXERR
4
#defineTXREQ
3
#defineTXP1
1
#defineTXP0
0
//定義寄存器RXB0CTRL位信息
#defineRXM1
6
#defineRXM0
5
#defineRXRTR
3
#defineBUKT
2
#defineBUKT1
1
#defineFILHIT0
0//定義發(fā)送緩沖寄存器TXBnSIDL(n=0,1)的位信息#defineEXIDE
3//定義接受緩沖器1控制寄存器的位信息
#defineFILHIT2
2
#defineFILHIT1
1/**
*定義接收緩沖器n標(biāo)準(zhǔn)標(biāo)示符低位RXBnSIDL(n=0,1)的位信息
*/
#defineSRR
4
#defineIDE
3
//定義接收緩沖器n數(shù)據(jù)長度碼RXBnDLC(n=0,1)的位信息#defineRTR
6
#defineDLC3
3
#defineDLC2
2
#defineDLC1
1
#defineDLC0
0//定義SPI控制命令字
#defineSPI_RESET
0xC0
#defineSPI_READ
0x03
#defineSPI_READ_RX
0x90
#defineSPI_WRITE
0x02
#defineSPI_WRITE_TX
0x40
#defineSPI_RTS
0x80
#defineSPI_READ_STATUS0xA0
#defineSPI_RX_STATUS
0xB0
#defineSPI_BIT_MODIFY0x05
//*********************
//*
常數(shù)宏定義
*
//*********************//**********************
//*
動作宏定義
*
//**********************//**********************
//*
全局變量聲明區(qū)
*
//**********************//**********************
//*
函數(shù)聲明區(qū)
*
//**********************
//**********************************************************//
//
函數(shù)說明:MCP2515初始化程序
//
//
輸入:
無
//
//
輸出:
無
//
//
調(diào)用函數(shù):
//
//**********************************************************//
externvoidmcp2515_init(void);//**********************************************************//
//
函數(shù)說明:MCP2515寫控制寄存器程序
//
//
輸入:
寄存器地址,寫入數(shù)據(jù)
//
//
輸出:
無
//
//
調(diào)用函數(shù):SPI發(fā)送程序SPI_MasterTransmit
//
//**********************************************************//
externvoidmcp2515_write_register(u08adress,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 白酒帶貨培訓(xùn)課程設(shè)計(jì)
- 箱包結(jié)構(gòu)課程設(shè)計(jì)
- 2025重慶市安全員考試題庫附答案
- 機(jī)械怎樣課程設(shè)計(jì)
- 煙霧傳感器的課程設(shè)計(jì)
- 禮儀 個(gè)人課程設(shè)計(jì)
- 液位測量系統(tǒng)課程設(shè)計(jì)
- 熱砂振動篩課程設(shè)計(jì)
- 智能儀表儀器課程設(shè)計(jì)
- 2024年安全員考試題庫
- 《隧道工程監(jiān)控量測》課件
- 監(jiān)理對進(jìn)度控制的目標(biāo)及方法措施
- 2024年內(nèi)科醫(yī)生年終工作總結(jié)參考(2篇)
- 環(huán)保項(xiàng)目荒山租賃協(xié)議模板
- 2024年度校園體育設(shè)施維修保養(yǎng)合同
- 機(jī)電一體化項(xiàng)目職業(yè)技能大賽試題(SX-815Q)
- 電廠應(yīng)急物資培訓(xùn)
- 2025年春九年級語文下冊 第三單元綜合測試卷(人教陜西版)
- 2024年國家基本藥物考核試題及答案
- 吊裝起重作業(yè)安全培訓(xùn)課件
- 行政人員的培訓(xùn)
評論
0/150
提交評論