MCP2515板级驱动
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板级驱动相关推荐
- apm驱动与板级驱动
apm版本的驱动放在libraries文件夹下,另外一个原生代码版本,在PX4Frimware/src/drivers目录下.注意,对于Pixhawk,apm代码使用的是Pixhawk原生驱动,因为原 ...
- IMX6Q,fsl,mxc_sdc_fb显示屏驱动移植,板级文件到设备树
使用的是飞凌OKMX6Q/DL-C板子,和它对应的FIT-LVDS 10.1吋液晶显示模块.由3.0.35的板级文件移植到飞思卡尔官方IMX6Q的4.1.15内核的设备树使用,设备树关于显示部分也是参 ...
- OpenBoard的板级支持包(BSP)开发召集令
OpenBoard的板级支持包(BSP)开发召集令 什么是"板级支持包"? 在嵌入式系统中,Board Support Package(简称BSP,中译板支持包)是实现特定的支持代 ...
- 高速信号传输约翰逊 pdf_高速串口技术如何突破板级连接限制
但在信号完整性上,USB4对系统设计提出了更大挑战.能否以比较便宜的板材,实现USB4传输速度,成为USB4普及初期所面临的考验. 文︱王树一 图︱硅谷数模 虚拟现实(VR)对显示技术的要求有多高?在 ...
- at91sam9260ek的板级、irq初始化-小试牛刀
话不多说,先上代码. //code path:arch/arm/mach-at91/board-sam9260ek.c MACHINE_START(AT91SAM9260EK, "Atmel ...
- i.MX283开发板SPI驱动——RC522
一.Linux下SPI驱动介绍 内核版本:2.6.35 Linux下SPI驱动和I2C驱动很类似,他们都是一种总线,且都不支持热拔插,因为一般情况下spi或者i2c设备都是直接焊接在板子上的,不像US ...
- STM32G0-BSP板级支持包
目录 STM32G0-BSP 依赖 示例 文件结构 命名约定 轻量级时间片 移植 STM32G0-BSP STM32G0-BSP是基于STM32G070CBT6微控制器的板级支持包,它提供了一系列常见 ...
- i.MX6 u-boot 怎么确定板级头文件
/*********************************************************************** i.MX6 u-boot 怎么确定板级头文件* 说明: ...
- Beaglebone Black开发板安装驱动
Beaglebone Black开发板安装驱动 Beaglebone Black开发板安装驱动,在使用Beaglebone Black开发板子做任何事情之前首先需要安装驱动.下面的内容就了展示在Win ...
最新文章
- c# 小票打印机打条形码_C#打印小票自带条形码打印
- 钻井缸套排量_川庆钻探||合理化建议成果展示:用陶瓷代替金属,缸套使用寿命延长了10倍...
- 全世界都认为汉语是婴儿语(转载)
- 算法竞赛入门经典(第二版) | 例题4-2 刽子手游戏 (UVa489,Hangman Judge)
- 【转】WCF与Web API 区别(应用场景)
- NGUI_2.6.3_系列教程六(序列帧动画)
- SQLPro Studio mac如何链接MYSQL?
- idea格式化代码小技巧
- php root进程保存文件夹,thinkphp5日志文件夹及文件权限问题的解决
- 不可用来编辑html的文件,Word2016
- 第九届蓝桥杯,赛后感!!含泪写完。
- (转)牛牛牌型判定(五小牛 五花牛 炸弹 银牛 牛牛 有牛没牛)
- 怎样修改PDF中的文本的字体
- MDCC 2014移动开发人员大会參会实录
- Flask中蓝本(Blueprint)的使用
- quoted string not properly terminated错误提示
- PX Deq Create send blkd
- AIML标签中srai不起作用的原因
- NOR 与 NAND的区别对比分析
- 【STM32】使用BRR与BSRR寄存器控制GPIO输出
热门文章
- SpringBoot之:SpringBoot中使用HATEOAS
- 走进新疆,带你探索西域风情
- 矩阵键盘简易计算机设计报告,矩阵键盘设计实验报告.doc
- 用计算机把老式的织布机,电脑织布机的操作怎样操作电脑织布机
- 专利大战:详解苹果三星矩形设计风波
- 两款不错的网络电视录制软件
- camera中文版软件 ip_ip camera viewer中文版-ip camera viewer(远程监控器管理软件) 4.07 官方版 - 河东下载站...
- Java系列一些小计
- 家校互联:蓝牙短信帮你搞定
- STM32小系统板焊接 电烙铁的使用和烙铁头的选型及保养