MCP2515板级驱动

  • 前言
  • 一、MCP2515简述
  • 二、硬件连接
  • 三、驱动源码

前言

在需要多路CAN接口应用场景,可选方案一般为带CAN接口的协处理器或者是独立的CAN控制器。独立的CAN控制器常用的有SJA1000、MCP2515等。本次讨论MCP2515板级驱动。


一、MCP2515简述

MCP2515 是一款独立控制器局域网络(Controller Area Network, CAN)协议控制器,完全支持 CAN V2.0B 技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧


二、硬件连接

MCP2515与控制器仅需要连接SPI接口、RST以及中断接口即可;


三、驱动源码

//CS片选拉高
void cs_high(unsigned char chn)
{HAL_GPIO_WritePin(Spi_Cs_Gpio[chn],Spi_Cs_Gpio_Pin[chn],GPIO_PIN_SET);
}//CS片选拉低
void cs_low(unsigned char chn)
{HAL_GPIO_WritePin(Spi_Cs_Gpio[chn],Spi_Cs_Gpio_Pin[chn],GPIO_PIN_RESET);
}//发送一个字节
void SPI_SendByte(unsigned char chn,unsigned char dat)
{HAL_SPI_Transmit(spi_handle[chn],&dat,1,50);
}//接收一个字节
unsigned char SPI_ReadByte(unsigned char chn)
{unsigned char RxData = 0;HAL_SPI_Receive(spi_handle[chn],&RxData,1,50);return RxData ;
}//收发一个字节
unsigned char SPI_ReadWriteByte(unsigned char chn,unsigned char txdata)
{       unsigned char rxdata = 0 ;HAL_SPI_TransmitReceive(spi_handle[chn],&txdata,&rxdata,1,50);return 0;
}//mcp2515写一个字节
void MCP2515_WriteByte(unsigned char chn,unsigned char addr,unsigned char dat)
{cs_low(chn);SPI_SendByte(chn,CAN_WRITE);SPI_SendByte(chn,addr);SPI_SendByte(chn,dat);cs_high(chn);
}//mcp2515读一个字节
unsigned char MCP2515_ReadByte(unsigned char chn,unsigned char addr)
{unsigned char temp = 0;cs_low(chn);SPI_SendByte(chn,CAN_READ);SPI_SendByte(chn,addr);temp=SPI_ReadByte(chn);//读取数据cs_high(chn);return temp ;
}//复位
void MCP2515_Reset(unsigned char chn)
{cs_low(chn);SPI_SendByte(chn,CAN_RESET);cs_high(chn);
}//检查状态
int MCP2515_Check_Status(unsigned char chn)
{unsigned char temp = 0 ;temp = MCP2515_ReadByte(chn,CANSTAT);while(temp!=REQOP_CONFIG){MCP2515_WriteByte(chn,CANCTRL,REQOP_CONFIG);        //MCP2515复位,进入配置模式//HAL_Delay(1);temp=MCP2515_ReadByte(chn,CANSTAT);//读取CAN状态寄存器的值}   return 0 ;
}//设置状态
int MCP2515_Set_Status(unsigned char chn)
{unsigned char temp = 0 ;temp = MCP2515_ReadByte(chn,CANSTAT);if(temp==REQOP_CONFIG){do{MCP2515_WriteByte(chn,CANCTRL,REQOP_NORMAL);    temp=MCP2515_ReadByte(chn,CANSTAT);//读取CAN状态寄存器的值   } while (temp!=REQOP_NORMAL);}return 0 ;
}//设置波特率
int MCP2515_Set_Speed(unsigned char chn,unsigned short speed)
{unsigned char cnf[3] = {0};if(MCP2515_Check_Status(chn)<0) return -1 ;switch (speed){case 0:cnf[0]=0x1,cnf[1]=0xBA,cnf[2]=0x7;break; //250Kcase 1:cnf[0]=0x0,cnf[1]=0xBA,cnf[2]=0x7;break; //500Kcase 2:cnf[0]=0x0,cnf[1]=0x98,cnf[2]=0x3;break; //1000K   case 3:cnf[0]=0x3,cnf[1]=0xBA,cnf[2]=0x7;break; //125K     case 4:cnf[0]=0x3,cnf[1]=0xBF,cnf[2]=0x7;break; //100K                    }MCP2515_WriteByte(chn,CNF1,cnf[0]);  MCP2515_WriteByte(chn,CNF2,cnf[1]);  MCP2515_WriteByte(chn,CNF3,cnf[2]);  return 0 ;
}//设置发送模式
//NormalTxMode  LoopBackTxMode REQOP_LISTEN
int MCP2515_Set_Tx_Mode(unsigned char chn,unsigned char mode)
{unsigned char temp = 0;if(MCP2515_Check_Status(chn)<0) return -1 ;    MCP2515_WriteByte(chn,CANINTF,0x00);//清空中断标志位MCP2515_WriteByte(chn,CANINTE,0x01);//接收缓冲器0满中断使能位do{MCP2515_WriteByte(chn,CANCTRL,mode|CLKOUT_ENABLED);//HAL_Delay(1);  temp=MCP2515_ReadByte(chn,CANSTAT);//读取CAN状态寄存器的值    } while (mode!=(temp&0xE0));return 0 ;
}//设置接收模式
//RxAllMode RxFMExternMode RxFMStandMode RxFMAllMode
int MCP2515_Set_Rx_Mode(unsigned char chn,unsigned char mode)
{if(MCP2515_Check_Status(chn)<0) return -1 ;    MCP2515_WriteByte(chn,RXB0CTRL,mode);return 0 ;
}/*******************************************************************************Mask       Filter       ID         RecviveState0           X           X             OK1           0           0             OK1           0           1             NO1           1           0             NO1           1           1             OK
********************************************************************************///设置标准帧过滤
int MCP2515_Set_Standard_Filter(unsigned char chn,unsigned short Mask,unsigned char Filter)
{if(MCP2515_Check_Status(chn)<0) return -1 ;    MCP2515_WriteByte(chn,RXF0SIDH,Filter>>3);MCP2515_WriteByte(chn,RXF0SIDL,Filter<<5|RxFilterNormal);MCP2515_WriteByte(chn,RXM0SIDH,Mask>>3);MCP2515_WriteByte(chn,RXM0SIDL,Mask<<5);  return 0 ;
}//设置扩展帧过滤
int MCP2515_Set_Extern_Filter(unsigned char chn,unsigned long Mask,unsigned long Filter)
{unsigned char RxFxLow = 0,RxMxLow = 0 ;if(MCP2515_Check_Status(chn)<0) return -1 ;  //29位屏蔽滤波器MCP2515_WriteByte(chn,RXF0EID8,Filter>>19);MCP2515_WriteByte(chn,RXF0EID0,Filter>>11);MCP2515_WriteByte(chn,RXF0SIDH,Filter>>5);RxFxLow = Filter>>27;RxFxLow |= Filter<<5|RxFilterExtern;MCP2515_WriteByte(chn,RXF0SIDL,RxFxLow);MCP2515_WriteByte(chn,RXM0EID8,Mask>>19);MCP2515_WriteByte(chn,RXM0EID0,Mask>>11); MCP2515_WriteByte(chn,RXM0SIDH,Mask>>5);RxMxLow = Mask>>27;RxMxLow |= Mask<<5;MCP2515_WriteByte(chn,RXM0SIDL,Mask<<5);                return 0 ;
}//设置过滤寄存器
int MCP2515_Set_Filter_Register(unsigned char chn,unsigned char mode,unsigned long filter)
{unsigned char RxFxLow = 0,RxMxLow = 0 ;//29位屏蔽滤波器MCP2515_WriteByte(chn,RXF0EID8,filter>>19);MCP2515_WriteByte(chn,RXF0EID0,filter>>11);MCP2515_WriteByte(chn,RXF0SIDH,filter>>3);RxFxLow = filter>>27;if(mode==1){RxFxLow |= filter<<5|RxFilterExtern;}else if(mode==0){RxFxLow |= filter<<5|RxFilterNormal;}MCP2515_WriteByte(chn,RXF0SIDL,RxFxLow);return 0 ;
}//设置屏蔽寄存器
int MCP2515_Set_Mask_Register(unsigned char chn,unsigned long mask)
{unsigned char RxMxLow = 0 ;MCP2515_WriteByte(chn,RXM0EID8,mask>>19);MCP2515_WriteByte(chn,RXM0EID0,mask>>11); MCP2515_WriteByte(chn,RXM0SIDH,mask>>3);RxMxLow = mask>>27;RxMxLow |= mask<<5;MCP2515_WriteByte(chn,RXM0SIDL,RxMxLow);  return 0 ;
}//CAN初始化
int CAN_Channel_Init(unsigned char chn)
{unsigned char temp = 0 ;MCP2515_Reset(chn);vTaskDelay(5);//HAL_Delay(1);temp=MCP2515_ReadByte(chn,CANSTAT);//读取CAN状态寄存器的值if(temp == 0x80){MCP2515_WriteByte(chn,RXB0CTRL,0x60);//仅仅接收标准标识符的有效信息,FIILHIT0=0表示RXB0 ,采用FILHIT0}return 0 ;
}//发送CAN帧
int MCP2515_Can_Send(unsigned char chn,CanTxMsg* CanTxMessage)
{unsigned char j = 0 ;unsigned char count = 0 ;unsigned char dly = 0 ;unsigned char tx_flush_flag = 1 ;while(count<CanTxMessage->DLC){while((MCP2515_ReadByte(chn,TXB0CTRL)&0x08))//快速读某些状态指令,等待TXREQ标志清零{//HAL_Delay(1);//通过软件延时约nms(不准确)vTaskDelay(1);if(dly<5) dly++;else{tx_flush_flag = 0 ;break ;}}if(tx_flush_flag==0) return -1;if(CanTxMessage->IDE==0)   //标准帧{//            if(CanTxMessage->StdId>0x7FF)
//                return -2;                //ID限制//ID设置 标准帧-扩展帧MCP2515_WriteByte(chn,TXB0SIDH,CanTxMessage->StdId>>3);//设置发送缓冲器0的标准标识符MCP2515_WriteByte(chn,TXB0SIDL,((CanTxMessage->StdId<<5)|MCP2515_Tx_Standard_mode));//用到标准标识符  //远程请求帧if(CanTxMessage->Rtr==1) {MCP2515_WriteByte(chn,TXB0DLC,CanTxMessage->DLC|MCP2515_Tx_Remote_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器}//数据帧else if(CanTxMessage->Rtr == 0){for(j=0;j<CanTxMessage->DLC;j++)//数据填充{MCP2515_WriteByte(chn,TXB0D0+j,CanTxMessage->Data[count++]);//将待发送的数据写入发送缓冲寄存器if(count>=CanTxMessage->DLC) break;}MCP2515_WriteByte(chn,TXB0DLC,CanTxMessage->DLC|MCP2515_Tx_Data_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器}            }else if(CanTxMessage->IDE==1) //扩展帧{unsigned char HSID,LSID; unsigned char HEID,LEID; HSID = (unsigned char)( CanTxMessage->ExtId>>21);  LSID = (unsigned char)((( CanTxMessage->ExtId>>13)&0xE0)|(0x08)|(( CanTxMessage->ExtId>>16)&0x03)); HEID = (unsigned char)( CanTxMessage->ExtId>>8);  LEID = (unsigned char)( CanTxMessage->ExtId);          MCP2515_WriteByte(chn,TXB0SIDH,HSID); MCP2515_WriteByte(chn,TXB0SIDL,LSID);MCP2515_WriteByte(chn,TXB0EID8,HEID); MCP2515_WriteByte(chn,TXB0EID0,LEID);      if(CanTxMessage->Rtr==1) //远程请求帧{MCP2515_WriteByte(chn,TXB0DLC,CanTxMessage->DLC|MCP2515_Tx_Remote_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器}   else if(CanTxMessage->Rtr == 0){for(j=0;j<CanTxMessage->DLC;j++)//数据填充{MCP2515_WriteByte(chn,TXB0D0+j,CanTxMessage->Data[count++]);//将待发送的数据写入发送缓冲寄存器if(count>=CanTxMessage->DLC) break;}MCP2515_WriteByte(chn,TXB0DLC,CanTxMessage->DLC|MCP2515_Tx_Data_Frame);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器}         }MCP2515_WriteByte(chn,TXB0CTRL,0x08);//请求发送报文}return 0 ;
}//接收消息
int MCP2515_Can_Recv(unsigned char chn,CanRxMsg* CanRxMessage)
{unsigned char temp = 0 ;unsigned char i = 0 ;unsigned char len = 0 ;unsigned char dat1=0,dat2=0,dat3=0,dat4=0;temp = MCP2515_ReadByte(chn,CANINTF);if(temp & 0x01){dat1 = MCP2515_ReadByte(chn,RXB0SIDH);dat2 = MCP2515_ReadByte(chn,RXB0SIDL);dat3 = MCP2515_ReadByte(chn,RXB0EID8);dat4 = MCP2515_ReadByte(chn,RXB0EID0);     CanRxMessage->Chn = chn;       //通道号if(((dat2>>3)&0x01)==1){CanRxMessage->IDE = 1 ;    //扩展帧}          else CanRxMessage->IDE = 0 ;        //标准帧if(((dat2>>4)&0x01)==1)    {CanRxMessage->S_Rtr = 1;    //接收到标准 远程帧}else CanRxMessage->S_Rtr = 0;                      //接收到标准 数据帧CanRxMessage->StdId = dat1<<3|dat2>>5;   //标准ID//CanRxMessage->ExtId = (dat2&0x03)<<16|dat3<<8|dat4;//扩展标识符IDCanRxMessage->ExtId = (((dat1>>3)&0x1F)<<24)|(((dat1&0x07)<<5)|((dat2&0xE0)>>3)|(dat2&0x03))<<16|dat3<<8|dat4;len=MCP2515_ReadByte(chn,RXB0DLC);//读取接收缓冲器0接收到的数据长度(0~8个字节)if(CanRxMessage->IDE==1){if(((len>>6)&0x01)==0x01)  CanRxMessage->E_Rtr = 1;        //扩展标识符远程帧else CanRxMessage->E_Rtr = 0;     //  扩展标识符 数据帧}CanRxMessage->DLC = len&0x0F;         //获取数据长度while(i<CanRxMessage->DLC)                                            //读取数据{ CanRxMessage->Data[i]=MCP2515_ReadByte(chn,RXB0D0+i);//把CAN接收到的数据放入指定缓冲区i++;}        //MCP2515_WriteByte(chn,CANINTF,0);//清除中断标志位(中断标志寄存器必须由MCU清零)}MCP2515_WriteByte(chn,CANINTF,0);//清除中断标志位(中断标志寄存器必须由MCU清零)return 0 ;
}//CAN通道使能
int MCP2515_Channel_Open(unsigned char chn,unsigned char mode)
{unsigned char temp = 0 ;if(mode!=REQOP_NORMAL&&mode!=REQOP_LISTEN&&mode!=REQOP_LOOPBACK)   return -1;MCP2515_WriteByte(chn,CANINTF,0x00);//清空中断标志位MCP2515_WriteByte(chn,CANINTE,0x01);//接收缓冲器0满中断使能位do{MCP2515_WriteByte(chn,CANCTRL,mode|CLKOUT_ENABLED);//将MCP2515设置为正常模式,退出配置模式    //HAL_Delay(1);vTaskDelay(1);temp=MCP2515_ReadByte(chn,CANSTAT);//读取CAN状态寄存器的值} while (mode!=(temp&0xE0));return 0 ;
}int MCP2515_Channel_Close(unsigned char chn)
{MCP2515_Reset(chn);vTaskDelay(1);//HAL_Delay(1);return 0 ;
}
#ifndef __BSP_MCP2515_H
#define __BSP_MCP2515_H#define EXTID  0x08              //��չ֡
#define STDID  0x00             //��չ֡
#define CAN_RTR      0x40               //����Զ��֡#define Standard_Mode               0x00  //��׼֡
#define Exit_Mode                       0x01  //��չ֡
#define Data_Mode                       0x00     //RTR Զ��֡ģʽ
#define Rtr_Mode                        0x01     //RTR Զ��֡ģʽ//װ�ط��ͼĴ���
#define MCP2515_Tx_Standard_mode   (0<<3)
#define MCP2515_Tx_Exit_mode         (1<<3)
#define MCP2515_Tx_Data_Frame            (0<<6)
#define MCP2515_Tx_Remote_Frame      (1<<6)//����֡�Ĵ���
// bit0~2   ֡��DLC
// bit3     ����ͨ��
// bit4~5       ͨ��0~3
// bit6  0:����֡  1:Զ��֡
// bit7  0:��׼֡  1:��չ֡//�����ϴ�
//��׼֡/��չ֡
#define TxStandFrame        (0<<7)
#define TxExitFrame         (1<<7)
//����֡/Զ��֡
#define TxDataFrame         (0<<6)
#define TxRemoteFrame   (1<<6)
//����ͨ��
#define TxCh1Frame      (0<<4)
#define TxCh2Frame      (1<<4)
#define TxCh3Frame      (2<<4)
#define TxCh4Frame      (3<<4)
//ȫ��ͨ��
#define TxChnSingFrame  (1<<3)
#define TxChAllFrame    (0<<3)//�����˲���
#define RxFilterNormal      (0<<3)
#define RxFilterExtern    (1<<3)//����ģʽ
#define RxAllMode               (3<<5)    //���������
#define RxFMExternMode  (2<<5)        //���շ��������˲�������չ֡����
#define RxFMStandMode       (1<<5)        //���շ��������˲����ı�׼֡����
#define RxFMAllMode         (0<<5)        //���շ��������˲��������б���//����ģʽ
#define NormalTxMode         0              //��������
#define LoopBackTxMode  (1<<6)        //�ػ�����typedef struct
{//  unsigned char Chn;unsigned short StdId;  //This parameter can be a value between 0 to 0x7FFunsigned long ExtId;   //This parameter can be a value between 0 to 0x1FFFFFFFunsigned char IDE;   //֡���� ��׼֡ ��չ֡unsigned char Rtr;   //���ݳ���unsigned char DLC;unsigned char Data[8];
}CanTxMsg;typedef struct
{unsigned char Chn;  //ͨ����unsigned short StdId;   //��׼ID  0 to 0x7FFunsigned long ExtId;   //          0 to 0x1FFFFFFFunsigned char IDE; //���յ�֡���� ��׼֡ ��չ֡unsigned char S_Rtr; //  ��׼    ����֡ Զ��֡unsigned char E_Rtr; //  ��չ    ����֡ Զ��֡unsigned char DLC;  //���ݳ���unsigned char Data[8];  //����
}CanRxMsg;/* Configuration Registers */
#define CANSTAT         0x0E
#define CANCTRL         0x0F
#define BFPCTRL         0x0C
#define TEC             0x1C
#define REC             0x1D
#define CNF3            0x28
#define CNF2            0x29
#define CNF1            0x2A
#define CANINTE         0x2B
#define CANINTF         0x2C
#define EFLG            0x2D
#define TXRTSCTRL       0x0D/*  Recieve Filters */
#define RXF0SIDH        0x00
#define RXF0SIDL        0x01
#define RXF0EID8        0x02
#define RXF0EID0        0x03
#define RXF1SIDH        0x04
#define RXF1SIDL        0x05
#define RXF1EID8        0x06
#define RXF1EID0        0x07
#define RXF2SIDH        0x08
#define RXF2SIDL        0x09
#define RXF2EID8        0x0A
#define RXF2EID0        0x0B
#define RXF3SIDH        0x10
#define RXF3SIDL        0x11
#define RXF3EID8        0x12
#define RXF3EID0        0x13
#define RXF4SIDH        0x14
#define RXF4SIDL        0x15
#define RXF4EID8        0x16
#define RXF4EID0        0x17
#define RXF5SIDH        0x18
#define RXF5SIDL        0x19
#define RXF5EID8        0x1A
#define RXF5EID0        0x1B/* Receive Masks */
#define RXM0SIDH        0x20
#define RXM0SIDL        0x21
#define RXM0EID8        0x22
#define RXM0EID0        0x23
#define RXM1SIDH        0x24
#define RXM1SIDL        0x25
#define RXM1EID8        0x26
#define RXM1EID0        0x27/* Tx Buffer 0 */
#define TXB0CTRL        0x30
#define TXB0SIDH        0x31
#define TXB0SIDL        0x32
#define TXB0EID8        0x33
#define TXB0EID0        0x34
#define TXB0DLC         0x35
#define TXB0D0          0x36
#define TXB0D1          0x37
#define TXB0D2          0x38
#define TXB0D3          0x39
#define TXB0D4          0x3A
#define TXB0D5          0x3B
#define TXB0D6          0x3C
#define TXB0D7          0x3D/* Tx Buffer 1 */
#define TXB1CTRL        0x40
#define TXB1SIDH        0x41
#define TXB1SIDL        0x42
#define TXB1EID8        0x43
#define TXB1EID0        0x44
#define TXB1DLC         0x45
#define TXB1D0          0x46
#define TXB1D1          0x47
#define TXB1D2          0x48
#define TXB1D3          0x49
#define TXB1D4          0x4A
#define TXB1D5          0x4B
#define TXB1D6          0x4C
#define TXB1D7          0x4D/* Tx Buffer 2 */
#define TXB2CTRL        0x50
#define TXB2SIDH        0x51
#define TXB2SIDL        0x52
#define TXB2EID8        0x53
#define TXB2EID0        0x54
#define TXB2DLC         0x55
#define TXB2D0          0x56
#define TXB2D1          0x57
#define TXB2D2          0x58
#define TXB2D3          0x59
#define TXB2D4          0x5A
#define TXB2D5          0x5B
#define TXB2D6          0x5C
#define TXB2D7          0x5D/* Rx Buffer 0 */
#define RXB0CTRL        0x60
#define RXB0SIDH        0x61
#define RXB0SIDL        0x62
#define RXB0EID8        0x63
#define RXB0EID0        0x64
#define RXB0DLC         0x65
#define RXB0D0          0x66
#define RXB0D1          0x67
#define RXB0D2          0x68
#define RXB0D3          0x69
#define RXB0D4          0x6A
#define RXB0D5          0x6B
#define RXB0D6          0x6C
#define RXB0D7          0x6D/* Rx Buffer 1 */
#define RXB1CTRL        0x70
#define RXB1SIDH        0x71
#define RXB1SIDL        0x72
#define RXB1EID8        0x73
#define RXB1EID0        0x74
#define RXB1DLC         0x75
#define RXB1D0          0x76
#define RXB1D1          0x77
#define RXB1D2          0x78
#define RXB1D3          0x79
#define RXB1D4          0x7A
#define RXB1D5          0x7B
#define RXB1D6          0x7C
#define RXB1D7          0x7D/********************************************************************               Bit register masks                                ********************************************************************//* TXBnCTRL */
#define TXREQ           0x08
#define TXP             0x03/* RXBnCTRL */
#define RXM             0x60
#define BUKT            0x04/* CANCTRL */
#define REQOP           0xE0
#define ABAT            0x10
#define OSM             0x08
#define CLKEN           0x04
#define CLKPRE          0x03/* CANSTAT */
#define REQOP           0xE0
#define ICOD            0x0E/* CANINTE */
#define RX0IE           0x01
#define RX1IE           0x02
#define TX0IE           0x04
#define TX1IE           0x80
#define TX2IE           0x10
#define ERRIE           0x20
#define WAKIE           0x40
#define MERRE           0x80/* CANINTF */
#define RX0IF           0x01
#define RX1IF           0x02
#define TX0IF           0x04
#define TX1IF           0x80
#define TX2IF           0x10
#define ERRIF           0x20
#define WAKIF           0x40
#define MERRF           0x80/* BFPCTRL */
#define B1BFS           0x20
#define B0BFS           0x10
#define B1BFE           0x08
#define B0BFE           0x04
#define B1BFM           0x02
#define B0BFM           0x01/* CNF1 Masks */
#define SJW             0xC0
#define BRP             0x3F/* CNF2 Masks */
#define BTLMODE         0x80
#define SAM             0x40
#define PHSEG1          0x38
#define PRSEG           0x07/* CNF3 Masks */
#define WAKFIL          0x40
#define PHSEG2          0x07/* TXRTSCTRL Masks */
#define TXB2RTS         0x04
#define TXB1RTS         0x02
#define TXB0RTS         0x01/********************************************************************                    Bit Timing Configuration                     ********************************************************************//* CNF1 */
#define SJW_1TQ         0x40
#define SJW_2TQ         0x80
#define SJW_3TQ         0x90
#define SJW_4TQ         0xC0/* CNF2 */
#define BTLMODE_CNF3    0x80
#define BTLMODE_PH1_IPT 0x00#define SMPL_3X         0x40
#define SMPL_1X         0x00#define PHSEG1_8TQ      0x38   //�����PS1
#define PHSEG1_7TQ      0x30
#define PHSEG1_6TQ      0x28
#define PHSEG1_5TQ      0x20
#define PHSEG1_4TQ      0x18
#define PHSEG1_3TQ      0x10
#define PHSEG1_2TQ      0x08
#define PHSEG1_1TQ      0x00#define PRSEG_8TQ       0x07        //������  PropSeg  1~8TQ
#define PRSEG_7TQ       0x06
#define PRSEG_6TQ       0x05
#define PRSEG_5TQ       0x04
#define PRSEG_4TQ       0x03
#define PRSEG_3TQ       0x02
#define PRSEG_2TQ       0x01
#define PRSEG_1TQ       0x00/* CNF3 */
#define PHSEG2_8TQ      0x07   //�����PS2
#define PHSEG2_7TQ      0x06
#define PHSEG2_6TQ      0x05
#define PHSEG2_5TQ      0x04
#define PHSEG2_4TQ      0x03
#define PHSEG2_3TQ      0x02
#define PHSEG2_2TQ      0x01
#define PHSEG2_1TQ      0x00#define SOF_ENABLED     0x80
#define WAKFIL_ENABLED  0x40
#define WAKFIL_DISABLED 0x00/********************************************************************                  Control/Configuration Registers                ********************************************************************//* CANINTE */
#define RX0IE_ENABLED   0x01
#define RX0IE_DISABLED  0x00
#define RX1IE_ENABLED   0x02
#define RX1IE_DISABLED  0x00
#define G_RXIE_ENABLED  0x03
#define G_RXIE_DISABLED 0x00#define TX0IE_ENABLED   0x04
#define TX0IE_DISABLED  0x00
#define TX1IE_ENABLED   0x08
#define TX2IE_DISABLED  0x00
#define TX2IE_ENABLED   0x10
#define TX2IE_DISABLED  0x00
#define G_TXIE_ENABLED  0x1C
#define G_TXIE_DISABLED 0x00#define ERRIE_ENABLED   0x20
#define ERRIE_DISABLED  0x00
#define WAKIE_ENABLED   0x40
#define WAKIE_DISABLED  0x00
#define IVRE_ENABLED    0x80
#define IVRE_DISABLED   0x00/* CANINTF */
#define RX0IF_SET       0x01
#define RX0IF_RESET     0x00
#define RX1IF_SET       0x02
#define RX1IF_RESET     0x00
#define TX0IF_SET       0x04
#define TX0IF_RESET     0x00
#define TX1IF_SET       0x08
#define TX2IF_RESET     0x00
#define TX2IF_SET       0x10
#define TX2IF_RESET     0x00
#define ERRIF_SET       0x20
#define ERRIF_RESET     0x00
#define WAKIF_SET       0x40
#define WAKIF_RESET     0x00
#define IVRF_SET        0x80
#define IVRF_RESET      0x00/* CANCTRL */
#define REQOP_CONFIG    0x80
#define REQOP_LISTEN    0x60
#define REQOP_LOOPBACK  0x40
#define REQOP_SLEEP     0x20
#define REQOP_NORMAL    0x00#define ABORT           0x10#define OSM_ENABLED     0x08#define CLKOUT_ENABLED  0x04
#define CLKOUT_DISABLED 0x00
#define CLKOUT_PRE_8    0x03
#define CLKOUT_PRE_4    0x02
#define CLKOUT_PRE_2    0x01
#define CLKOUT_PRE_1    0x00/* CANSTAT */
#define OPMODE_CONFIG   0x80
#define OPMODE_LISTEN   0x60
#define OPMODE_LOOPBACK 0x40
#define OPMODE_SLEEP    0x20
#define OPMODE_NORMAL   0x00/* RXBnCTRL */
#define RXM_RCV_ALL     0x60
#define RXM_VALID_EXT   0x40
#define RXM_VALID_STD   0x20
#define RXM_VALID_ALL   0x00#define RXRTR_REMOTE    0x08
#define RXRTR_NO_REMOTE 0x00#define BUKT_ROLLOVER    0x04
#define BUKT_NO_ROLLOVER 0x00#define FILHIT0_FLTR_1  0x01
#define FILHIT0_FLTR_0  0x00#define FILHIT1_FLTR_5  0x05
#define FILHIT1_FLTR_4  0x04
#define FILHIT1_FLTR_3  0x03
#define FILHIT1_FLTR_2  0x02
#define FILHIT1_FLTR_1  0x01
#define FILHIT1_FLTR_0  0x00/* TXBnCTRL */
#define TXREQ_SET       0x08
#define TXREQ_CLEAR     0x00#define TXP_HIGHEST     0x03
#define TXP_INTER_HIGH  0x02
#define TXP_INTER_LOW   0x01
#define TXP_LOWEST      0x00/********************************************************************                  Register Bit Masks                             ********************************************************************/#define DLC_0          0x00#define DLC_1          0x01#define DLC_2          0x02#define DLC_3          0x03#define DLC_4          0x04#define DLC_5          0x05#define DLC_6          0x06#define DLC_7          0x07    #define DLC_8          0x08/********************************************************************                  CAN SPI commands                               ********************************************************************/#define CAN_RESET       0xC0
#define CAN_READ        0x03
#define CAN_WRITE       0x02
#define CAN_RTS         0x80
#define CAN_RTS_TXB0    0x81
#define CAN_RTS_TXB1    0x82
#define CAN_RTS_TXB2    0x84
#define CAN_RD_STATUS   0xA0
#define CAN_BIT_MODIFY  0x05
#define CAN_RX_STATUS   0xB0
#define CAN_RD_RX_BUFF  0x90
#define CAN_LOAD_TX     0X40  /********************************************************************                  Miscellaneous                                  ********************************************************************/#define DUMMY_BYTE      0x00
#define TXB0            0x31
#define TXB1            0x41
#define TXB2            0x51
#define RXB0            0x61
#define RXB1            0x71
#define EXIDE_SET       0x08
#define EXIDE_RESET     0x00int CAN_Channel_Init(unsigned char chn);
int MCP2515_Set_Speed(unsigned char chn,unsigned short speed);
int MCP2515_Set_Tx_Mode(unsigned char chn,unsigned char mode);
int MCP2515_Set_Rx_Mode(unsigned char chn,unsigned char mode);
int MCP2515_Channel_Open(unsigned char chn,unsigned char mode);
int MCP2515_Set_Filter_Register(unsigned char chn,unsigned char mode,unsigned long filter);
int MCP2515_Set_Mask_Register(unsigned char chn,unsigned long mask);
int MCP2515_Can_Send(unsigned char chn,CanTxMsg* CanTxMessage);
int MCP2515_Can_Recv(unsigned char chn,CanRxMsg* CanRxMessage);
#endif

MCP2515板级驱动相关推荐

  1. apm驱动与板级驱动

    apm版本的驱动放在libraries文件夹下,另外一个原生代码版本,在PX4Frimware/src/drivers目录下.注意,对于Pixhawk,apm代码使用的是Pixhawk原生驱动,因为原 ...

  2. IMX6Q,fsl,mxc_sdc_fb显示屏驱动移植,板级文件到设备树

    使用的是飞凌OKMX6Q/DL-C板子,和它对应的FIT-LVDS 10.1吋液晶显示模块.由3.0.35的板级文件移植到飞思卡尔官方IMX6Q的4.1.15内核的设备树使用,设备树关于显示部分也是参 ...

  3. OpenBoard的板级支持包(BSP)开发召集令

    OpenBoard的板级支持包(BSP)开发召集令 什么是"板级支持包"? 在嵌入式系统中,Board Support Package(简称BSP,中译板支持包)是实现特定的支持代 ...

  4. 高速信号传输约翰逊 pdf_高速串口技术如何突破板级连接限制

    但在信号完整性上,USB4对系统设计提出了更大挑战.能否以比较便宜的板材,实现USB4传输速度,成为USB4普及初期所面临的考验. 文︱王树一 图︱硅谷数模 虚拟现实(VR)对显示技术的要求有多高?在 ...

  5. at91sam9260ek的板级、irq初始化-小试牛刀

    话不多说,先上代码. //code path:arch/arm/mach-at91/board-sam9260ek.c MACHINE_START(AT91SAM9260EK, "Atmel ...

  6. i.MX283开发板SPI驱动——RC522

    一.Linux下SPI驱动介绍 内核版本:2.6.35 Linux下SPI驱动和I2C驱动很类似,他们都是一种总线,且都不支持热拔插,因为一般情况下spi或者i2c设备都是直接焊接在板子上的,不像US ...

  7. STM32G0-BSP板级支持包

    目录 STM32G0-BSP 依赖 示例 文件结构 命名约定 轻量级时间片 移植 STM32G0-BSP STM32G0-BSP是基于STM32G070CBT6微控制器的板级支持包,它提供了一系列常见 ...

  8. i.MX6 u-boot 怎么确定板级头文件

    /*********************************************************************** i.MX6 u-boot 怎么确定板级头文件* 说明: ...

  9. Beaglebone Black开发板安装驱动

    Beaglebone Black开发板安装驱动 Beaglebone Black开发板安装驱动,在使用Beaglebone Black开发板子做任何事情之前首先需要安装驱动.下面的内容就了展示在Win ...

最新文章

  1. c# 小票打印机打条形码_C#打印小票自带条形码打印
  2. 钻井缸套排量_川庆钻探||合理化建议成果展示:用陶瓷代替金属,缸套使用寿命延长了10倍...
  3. 全世界都认为汉语是婴儿语(转载)
  4. 算法竞赛入门经典(第二版) | 例题4-2 刽子手游戏 (UVa489,Hangman Judge)
  5. 【转】WCF与Web API 区别(应用场景)
  6. NGUI_2.6.3_系列教程六(序列帧动画)
  7. SQLPro Studio mac如何链接MYSQL?
  8. idea格式化代码小技巧
  9. php root进程保存文件夹,thinkphp5日志文件夹及文件权限问题的解决
  10. 不可用来编辑html的文件,Word2016
  11. 第九届蓝桥杯,赛后感!!含泪写完。
  12. (转)牛牛牌型判定(五小牛 五花牛 炸弹 银牛 牛牛 有牛没牛)
  13. 怎样修改PDF中的文本的字体
  14. MDCC 2014移动开发人员大会參会实录
  15. Flask中蓝本(Blueprint)的使用
  16. quoted string not properly terminated错误提示
  17. PX Deq Create send blkd
  18. AIML标签中srai不起作用的原因
  19. NOR 与 NAND的区别对比分析
  20. 【STM32】使用BRR与BSRR寄存器控制GPIO输出

热门文章

  1. SpringBoot之:SpringBoot中使用HATEOAS
  2. 走进新疆,带你探索西域风情
  3. 矩阵键盘简易计算机设计报告,矩阵键盘设计实验报告.doc
  4. 用计算机把老式的织布机,电脑织布机的操作怎样操作电脑织布机
  5. 专利大战:详解苹果三星矩形设计风波
  6. 两款不错的网络电视录制软件
  7. camera中文版软件 ip_ip camera viewer中文版-ip camera viewer(远程监控器管理软件) 4.07 官方版 - 河东下载站...
  8. Java系列一些小计
  9. 家校互联:蓝牙短信帮你搞定
  10. STM32小系统板焊接 电烙铁的使用和烙铁头的选型及保养