?? mcp2515.c
字號:
case 0x01:
// MCP2515_Enable();
SendSIOData(0x96);
// MCP2515_Disable();
break;
case 0x10:
// MCP2515_Enable();
SendSIOData(0x90);
// MCP2515_Disable();
break;
case 0x11:
// MCP2515_Enable();
SendSIOData(0x94);
// MCP2515_Disable();
break;
}
}
/*************************************************************************/
/*函數名稱:MCP2515_LOAD_TXBUFF */
/*函數功能: 標識符裝載命令 */
/*入口參數: :nu_tx_buff 各位說明如下: */
/* bit0:是否裝載標識符,為0則要裝載; bit2,bit1:選擇發送緩沖區 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_LOAD_TXBUFF(unsigned char nu_tx_buff)
{
SendSIOData(0x40|(nu_tx_buff & 0x07));
}
/*************************************************************************/
/*函數名稱:MCP2515_RX_STATUS */
/*函數功能: 獲取RX狀態 */
/*入口參數: 無 */
/*返回值 : RX狀態 */
/*************************************************************************/
unsigned char MCP2515_RX_STATUS(void)
{
unsigned char rx_stutus_p;
MCP2515_Enable();
SendSIOData(0xB0); //發送 RX 狀態指令 1011 0000
SendSIOData(0);
rx_stutus_p = ReadSIOData(); //
MCP2515_Disable();
return rx_stutus_p;
}
/*************************************************************************/
/*函數名稱:MCP2515_RTS */
/*函數功能: 請求報文發送 */
/*入口參數: n_tx_buf : 發送選項,后三位有效 */
/* n_tx_buf & 0x87 = 0x81 : 發送緩沖器0 請求發送 */
/* n_tx_buf & 0x87 = 0x82 : 發送緩沖器1 請求發送 */
/* n_tx_buf & 0x87 = 0x83 : 發送緩沖器2 請求發送 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_RTS(unsigned char n_tx_buf)
{
MCP2515_Enable();
SendSIOData(0x80|n_tx_buf); //發送 請求發送報文指令(RTS) 1000 0nnn
MCP2515_Disable();
}
/*************************************************************************/
/*函數名稱:MCP2515_WriteBits */
/*函數功能: 修改位數據 (位修改) */
/*入口參數: 1.address : 發送寄存器地址 */
/* 2.data : 修改數據(只能修改屏蔽字節中置 1 的相應位) */
/* 3.mask : 屏蔽字節 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_WriteBits( int address, int data, int mask )
{
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_BITMDFY); //發送位修改指令
SendSIOData((unsigned char)address); //發送寄存器地址
SendSIOData((unsigned char)mask); //發送屏蔽字節
SendSIOData((unsigned char)data); //發送數據字節
MCP2515_Disable(); //MCP2515 Disable
}
/*************************************************************************/
/*函數名稱:MCP2515_SetBandRate */
/*函數功能: 波特率設置 */
/*入口參數: 1.bandrate : 波特率 */
/* 2.IsBackNormal : 1: 使用外部時鐘 0: 不使用外部時鐘 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_SetBandRate(CanBandRate bandrate, unsigned char IsBackNormal)
{
MCP2515_Write(MCP2515REG_CANCTRL, MODE_CONFIG); //進入到配置模式
MCP2515_Read(0x0E); //讀取 CAN 狀態(0xXE)
switch(bandrate)
{
case BandRate_10kbps: //波特率NBR = 1/(同步段+傳播段+相位緩沖段1(PS1)+相位緩沖段2(PS2))
MCP2515_Write(CNF1, SJW1|0x31); //Synchronization Jump Width Length(同步跳轉寬度 SJW ) =1 TQ
//BRP = 0x31
//TQ = 2*(BRP+1)/Fosc = 625ns (Fosc = 16MHz)
//Sync Seg(同步段) = 1TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1(相位緩沖段1) = 4TQ, Prop Seg(傳播) = 7TQ
MCP2515_Write(CNF3, SEG4); // Phase Seg 2(相位緩沖段2) = 4TQ
break; //NBR = 1/((1+7+4+4)*6.25ns)
case BandRate_20kbps:
MCP2515_Write(CNF1, SJW1|0x18); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_50kbps:
MCP2515_Write(CNF1, SJW1|0x9); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_62kbps:
MCP2515_Write(CNF1, SJW1|0x7); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4);// Phase Seg 2 = 4
break;
case BandRate_100kbps:
MCP2515_Write(CNF1, SJW1|0x4); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_125kbps:
MCP2515_Write(CNF1, SJW1|BRP4); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_142kbps:
MCP2515_Write(CNF1, SJW1|0x6); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG3<<3)|SEG2); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG2); // Phase Seg 2 = 4
break;
case BandRate_167kbps:
MCP2515_Write(CNF1, SJW1|0x2); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_200kbps:
MCP2515_Write(CNF1, SJW1|BRP5); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG3<<3)|SEG2); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG2); // Phase Seg 2 = 4
break;
case BandRate_250kbps:
MCP2515_Write(CNF1, SJW1|BRP2); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_500kbps:
MCP2515_Write(CNF1, SJW1|BRP1); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG4<<3)|SEG7); // Phase Seg 1 = 4, Prop Seg = 7
MCP2515_Write(CNF3, SEG4); // Phase Seg 2 = 4
break;
case BandRate_1Mbps: //
MCP2515_Write(CNF1, SJW1|BRP1); //Synchronization Jump Width Length =1 TQ
MCP2515_Write(CNF2, BTLMODE_CNF3|(SEG3<<3)|SEG2); // Phase Seg 1 = 2, Prop Seg = 3
MCP2515_Write(CNF3, SEG2); // Phase Seg 2 = 1
break;
}
if(IsBackNormal)
{
//Enable clock output
MCP2515_Write(CLKCTRL, MODE_NORMAL | CLKEN | CLK1); //使用外部時鐘
}
MCP2515_Read(CNF3);
}
/*************************************************************************/
/*函數名稱:MCP2515_SRead */
/*函數功能: 從MCP2515 讀取一塊數據,即從CAN總線接收一串數據 */
/*入口參數: 1.address : MCP2515接收寄存器地址 */
/* 2.* pdata : 接收數據的存放地址 */
/* 3. nlength : 接收數據長度 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_SRead( unsigned char address, unsigned char* pdata, unsigned char nlength )
{
int i;
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_READ); //發送讀指令
SendSIOData((unsigned char)address); //發送MCP2515接收寄存器地址
for (i=0; i<nlength; i++) //接收數據
{
SendSIOData(0);
*pdata = ReadSIOData();
pdata++;
}
MCP2515_Disable(); //MCP2515 Disable
}
/*************************************************************************/
/*函數名稱:MCP2515_Swrite */
/*函數功能: 向 MCP2515 寫入一塊數據,即向CAN總線發送一串數據 */
/*入口參數: 1.address : MCP2515發送寄存器地址 */
/* 2.* pdata : 待發送數據的存放地址 */
/* 3. nlength : 待發送數據長度 */
/*返回值 : 無 */
/*************************************************************************/
void MCP2515_Swrite(unsigned char address, unsigned char* pdata, unsigned char nlength)
{
int i;
MCP2515_Enable(); //MCP2515 Enable
SendSIOData(MCP2515INSTR_WRITE); //發送寫指令
SendSIOData((unsigned char)address); //發送MCP2515發送寄存器地址
for (i=0; i < nlength; i++) //發送數據
{
SendSIOData((unsigned char)*pdata);
pdata++;
}
MCP2515_Disable(); //MCP2515 Disable
}
/***********************************************************************************************/
/*函數名稱:MCP2515_Write_Can_ID */
/*函數功能: 寫MCP2515 CAN 數據幀 標識符位(ID) */
/*入口參數: 1.address : MCP2515寄存器地址 */
/* 2.can_id : CAN 數據幀標識位 */
/* 3.IsExt : 表示是否為擴展標識符 1 : 是擴展標識符(EID) 0 : 是標準標識符(SID) */
/* 標準標識位 : 11位 擴展標識位 : 29位 */
/*返回值 : 無 */
/***********************************************************************************************/
void MCP2515_Write_Can_ID(U8 address, U32 can_id, U8 IsExt)
{
U32 tbufdata;
if (IsExt) //是擴展標識符(EID17~EID0 SID10~SID0)
{
can_id &= 0x1fffffff; //取后29位
tbufdata = (can_id >>21) | ((can_id>>5) & 0xe000) | ((can_id>>8) & 0x300) | ((can_id<<8) & 0xff0000) | (can_id<<24) | 0x800;
//can_id >>21 :寫標準標識符位(EID)的 SID10~SID3 位
//can_id>>5) & 0xe000 :寫標準標識符位(EID)的 SID2 ~SID0 位
//can_id>>8) & 0x300 :寫擴展標識符位(EID)的 EID17~EID16 位
//can_id<<8) & 0xff0000 :寫擴展標識符位(EID)的 EID15~EID8 位
//can_id<<24 :寫擴展標識符位(EID)的 EID7 ~EID0 位
//0x800 :寫擴展標識符位(EID)的 EID11 位
}
else
{
can_id &= 0x7ff; //取后11位
tbufdata= (can_id>>3)|((can_id & 0x07)<<13);
//can_id>>3 : 寫標準標識符位(SID)的 SID7 ~SID0 位
//(can_id & 0x07)<<13 : 寫標準標識符位(SID)的 SID10~SID8 位
}
MCP2515_Swrite(address, (unsigned char*)&tbufdata, 4);
}
/*********************************************************************************/
/*函數名稱:MCP2515_Read_Can_ID */
/*函數功能: 讀取MCP2515 CAN 數據幀 標識符位(ID) */
/*入口參數: 1.address : MCP2515寄存器地址 */
/* 2.*can_id : 為返回的ID值----(((標準幀ID在高位,擴展幀ID在地位))) */
/*返回值 : 1.TRUE : 表示是擴展ID(29位) */
/* 2.FALSE : 表示非擴展ID(11位) */
/*********************************************************************************/
U8 MCP2515_Read_Can_ID( U8 address, U32 *can_id)
{
U32 tbufdata;
U8 *p = (U8 *) &tbufdata; //? 既然 CAN ID 有可能 28 位 為什么不定義成 U32 ?
MCP2515_SRead(address, p, 4);
*can_id = (tbufdata<<3)|((tbufdata>>13) & 0x7); //標準ID
*can_id &= 0x7ff; //取低 11 位
if ( (p[MCP2515LREG_SIDL] & TXB_EXIDE_M) == TXB_EXIDE_M )
{
*can_id = (*can_id<<2) | (p[MCP2515LREG_SIDL] & 0x03);
*can_id <<= 16;
*can_id |= (tbufdata>>8) & 0xff00; //EID15~8
*can_id |= (tbufdata>>24) & 0xff; //EID 7~0
return 1;
}
return 0;
}
/*********************************************************************************/
/*函數名稱:MCP2515_Write_Can */
/*函數功能: 裝載CAN 發送數據到 MCP2515 的發送緩沖器 */
/*入口參數: 1.nbuffer : 發送緩沖區,可以為0、1、2 */
/* 2.ext : 表示是否是擴展總線 1: 是 0:否 */
/* 3.can_id : 為返回的ID值 */
/* 4.rxRTR : 表示是否是--遠程幀1,數據幀0 */
/* 5.data : 表示發送的數據 */
/* 6.dlc : 表示 數據長度 */
/* 7.FALSE : 表示非擴展總線 */
/*返回值 : 無 */
/*********************************************************************************/
void MCP2515_Write_Can( U8 nbuffer, U8 ext, U32 can_id, U8 rxRTR, U8* data,unsigned char dlc )
{
U8 mcp_addr = (nbuffer<<4) + 0x31; //發送緩沖器 標準標識符(TXBnSID)地址 (高位在前)
//發送緩沖器0標準標識符(TXB0SID)地址 :0x31~0x32
//發送緩沖器1標準標識符(TXB1SID)地址 :0x41~0x42
//發送緩沖器2標準標識符(TXB2SID)地址 :0x51~0x52
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -