stm32驱动MCP2515芯片,项目已通过测试
最近公司做一个项目,需要3路can通道,但是stm32看了很久,最多也就只有2个can,所以找到了一款MCP2515芯片,可以用spi驱动can。
已经实现了can的发送和接收,接收采用的是外部中断接收的方式。和单片机本身带的can功能一样。
还有就是要注意的是CAN的接收是通过外部中断引脚下拉来确定接收缓冲器接收到数据,可以通过设置接收屏蔽和滤波。
spi的初始化就不介绍 直接放出MCP2515的关键代码
首先是MCP2515的头文件 主要是一些宏定义和API
#ifndef MCP2515_H_
#define MCP2515_H_
#include "stm32f10x.h"#define USE_INT_STAT 1 // use INT pin indicate recived data//MCP2515 RX/TX buffers selection
#define MCP2515_RX_BUF_0 0
#define MCP2515_RX_BUF_1 1
#define MCP2515_TX_BUF_0 0
#define MCP2515_TX_BUF_1 1
#define MCP2515_TX_BUF_2 2//MCP2515 SPI instructions
#define MCP2515_RESET 0xC0
#define MCP2515_READ 0x03
#define MCP2515_READ_BUF_RXB0SIDH 0x90 //read data from begin address of Standard ID (MSB) of RX buffer 0
#define MCP2515_READ_BUF_RXB0D0 0x92 //read data from begin address of data byte 0 of RX buffer 0
#define MCP2515_READ_BUF_RXB1SIDH 0x94 //...RX buffer 1
#define MCP2515_READ_BUF_RXB1D0 0x96 //...RX buffer 1
#define MCP2515_WRITE 0x02
#define MCP2515_LOAD_BUF_TXB0SIDH 0x40 //load data from begin address of Standard ID (MSB) of TX buffer 0
#define MCP2515_LOAD_BUF_TXB0D0 0X41 //load data from begin address of data byte 0 of TX buffer 0
#define MCP2515_LOAD_BUF_TXB1SIDH 0x42 //...TX buffer 1
#define MCP2515_LOAD_BUF_TXB1D0 0X43 //...TX buffer 1
#define MCP2515_LOAD_BUF_TXB2SIDH 0x44 //...TX buffer 2
#define MCP2515_LOAD_BUF_TXB2D0 0X45 //...TX buffer 2
#define MCP2515_RTS_TXB0 0x81 //activate the RTS of TX buffer 0.
#define MCP2515_RTS_TXB1 0x82 //...TX buffer 1.
#define MCP2515_RTS_TXB2 0x84 //...TX buffer 2.
#define MCP2515_RTS_ALL 0x87 //...TX buffer 0, 1 and 2.
#define MCP2515_READ_RXTX_STATUS 0xA0
#define MCP2515_RX_STATUS 0xB0
#define MCP2515_BIT_MODIFY 0x05//MCP2515 control settings register address.
//All can be used with the Bit Modify command, except the CANSTAT register.
#define MCP2515_BFPCTRL 0x0C //RXnBF pin control/status
#define MCP2515_TXRTSCTRL 0x0D //TXnRTS pin control/status
#define MCP2515_CANSTAT 0x0E //CAN status. any addr of MSB will give the same info???
#define MCP2515_CANCTRL 0x0F //CAN control status. any addr of MSB will give the same info???
#define MCP2515_TEC 0x1C //Transmit Error Counter
#define MCP2515_REC 0x1D //Receive Error Counter
#define MCP2515_CNF3 0x28 //Phase segment 2
#define MCP2515_CNF2 0x29 //Propagation segment & Phase segment 1 & n sample setting
#define MCP2515_CNF1 0x2A //Baud rate prescaler & Sync Jump Width
#define MCP2515_CANINTE 0x2B //CAN interrupt enable
#define MCP2515_CANINTF 0x2C //Interrupt flag
#define MCP2515_EFLG 0x2D //Error flag
#define MCP2515_TXB0CTRL 0x30 //TX buffer 0 control
#define MCP2515_TXB1CTRL 0x40 //TX buffer 1 control
#define MCP2515_TXB2CTRL 0x50 //TX buffer 2 control
#define MCP2515_RXB0CTRL 0x60 //RX buffer 0 control
#define MCP2515_RXB1CTRL 0x70 //RX buffer 1 control//MCP2515 relate to CAN settings/status register address.
//Only the most used are listed below. please see the datasheet MCP2515.pdf p61 for complete info.
#define MCP2515_RXF0SIDH 0x00 //RX standard ID (High bits) filter 0
#define MCP2515_RXF0SIDL 0x01 //RX standard ID (Low bits) filter 0
#define MCP2515_RXF0EID8 0x02 //RX Extended ID (High bits) filter 0 ->can be reached by bust read/write Standard ID then Ext. ID
#define MCP2515_RXF0EID0 0x03 //RX Extended ID (Low bits) filter 0
#define MCP2515_RXF1SIDH 0x04 //RX standard ID (High bits) filter 1
#define MCP2515_RXF1SIDL 0x05 //RX standard ID (Low bits) filter 1
#define MCP2515_RXF1EID8 0x06 //RX Extended ID (High bits) filter 1
#define MCP2515_RXF1EID0 0x07 //RX Extended ID (Low bits) filter 1
#define MCP2515_RXF2SIDH 0x08 //RX standard ID (High bits) filter 2
#define MCP2515_RXF2SIDL 0x09 //RX standard ID (Low bits) filter 2
#define MCP2515_RXF2EID8 0x0A //RX Extended ID (High bits) filter 2
#define MCP2515_RXF2EID0 0x0B //RX Extended ID (Low bits) filter 2
#define MCP2515_RXF3SIDH 0x10 //RX standard ID (High bits) filter 3
#define MCP2515_RXF3SIDL 0x11 //RX standard ID (Low bits) filter 3
#define MCP2515_RXF3EID8 0x12 //RX Extended ID (High bits) filter 3
#define MCP2515_RXF3EID0 0x13 //RX Extended ID (Low bits) filter 3
#define MCP2515_RXF4SIDH 0x14 //RX standard ID (High bits) filter 4
#define MCP2515_RXF4SIDL 0x15 //RX standard ID (Low bits) filter 4
#define MCP2515_RXF4EID8 0x16 //RX Extended ID (High bits) filter 4
#define MCP2515_RXF4EID0 0x17 //RX Extended ID (Low bits) filter 4
#define MCP2515_RXF5SIDH 0x18 //RX standard ID (High bits) filter 5
#define MCP2515_RXF5SIDL 0x19 //RX standard ID (Low bits) filter 5
#define MCP2515_RXF5EID8 0x1A //RX Extended ID (High bits) filter 5
#define MCP2515_RXF5EID0 0x1B //RX Extended ID (Low bits) filter 5
#define MCP2515_RXM0SIDH 0x20 //RX standard ID (High bits) mask filter 0
#define MCP2515_RXM0SIDL 0x21 //RX standard ID (Low bits) mask filter 0
#define MCP2515_RXM0EID8 0x22 //RX Extended ID (High bits) mask filter 0
#define MCP2515_RXM0EID0 0x23 //RX Extended ID (Low bits) mask filter 0
#define MCP2515_RXM1SIDH 0x24 //RX standard ID (High bits) mask filter 1
#define MCP2515_RXM1SIDL 0x25 //RX standard ID (Low bits) mask filter 1
#define MCP2515_RXM1EID8 0x26 //RX Extended ID (High bits) mask filter 1
#define MCP2515_RXM1EID0 0x27 //RX Extended ID (Low bits) mask filter 1
#define MCP2515_RXB0SIDH 0x61 //RX buffer 0 standard ID (High bits)
#define MCP2515_RXB0SIDL 0x62 //RX buffer 0 standard ID (Low bits)
#define MCP2515_RXB0EID8 0x63 //RX buffer 0 Extended ID (High bits) ->can be reached by bust read/write Standard ID then Ext. ID
#define MCP2515_RXB0EID0 0x64 //RX buffer 0 Extended ID (Low bits)
#define MCP2515_RXB0DLC 0x65 //RX buffer 0 DLC ->can be reached by bust read/write Standard ID, Ext. ID then DLC
#define MCP2515_RXB0D0 0x66 //RX buffer 0 data byte0
#define MCP2515_RXB1SIDH 0x71 //RX buffer 1 standard ID (High bits)
#define MCP2515_RXB1SIDL 0x72 //RX buffer 1 standard ID (Low bits)
#define MCP2515_RXB1EID8 0x73 //RX buffer 1 Extended ID (High bits)
#define MCP2515_RXB1EID0 0x74 //RX buffer 1 Extended ID (Low bits)
#define MCP2515_RXB1DLC 0x75 //RX buffer 1 DLC
#define MCP2515_RXB1D0 0x76 //RX buffer 1 data byte0#define MCP2515_TXB0SIDH 0x31 //TX buffer 0 standard ID (High bits)
#define MCP2515_TXB0SIDL 0x32 //TX buffer 0 standard ID (Low bits)
#define MCP2515_TXB0EID8 0x33 //TX buffer 0 Extended ID (High bits) ->can be reached by bust read/write Standard ID then Ext. ID
#define MCP2515_TXB0EID0 0x34 //TX buffer 0 Extended ID (Low bits)
#define MCP2515_TXB0DLC 0x35 //TX buffer 0 DLC ->can be reached by bust read/write Standard ID, Ext. ID then DLC
#define MCP2515_TXB0D0 0x36 //TX buffer 0 data byte0
#define MCP2515_TXB1SIDH 0x41 //TX buffer 1 standard ID (High bits)
#define MCP2515_TXB1SIDL 0x42 //TX buffer 1 standard ID (Low bits)
#define MCP2515_TXB1EID8 0x43 //TX buffer 1 Extended ID (High bits)
#define MCP2515_TXB1EID0 0x44 //TX buffer 1 Extended ID (Low bits)
#define MCP2515_TXB1DLC 0x45 //TX buffer 1 DLC
#define MCP2515_TXB1D0 0x46 //TX buffer 1 data byte0
#define MCP2515_TXB2SIDH 0x51 //TX buffer 2 standard ID (High bits)
#define MCP2515_TXB2SIDL 0x52 //TX buffer 2 standard ID (Low bits)
#define MCP2515_TXB2EID8 0x53 //TX buffer 2 Extended ID (High bits)
#define MCP2515_TXB2EID0 0x54 //TX buffer 2 Extended ID (Low bits)
#define MCP2515_TXB2DLC 0x55 //TX buffer 2 DLC
#define MCP2515_TXB2D0 0x56 //TX buffer 2 data byte0//MCP2515 limit values
#define MCP2515_MIN_TQ 0x07 //7 = Minimum TQ in 1 bit of CAN bus time
#define MCP2515_MAX_TQ 0x19 //25 = Maximum TQ in 1 bit of CAN bus time
#define MCP2515_MIN_BRP 0x00 //0 = Minimum baud rate prescaler clock
#define MCP2515_MAX_BRP 0x3F //63 = Maximum baud rate prescaler clock
#define MCP2515_MAX_SJW 0x03 //4 = Maximum Synchronization Jump Width. 4-1 = 3 actually
#define MCP2515_MAX_BYTE_CANFRM 0x08//8 = Maximun bytes in a CAN frame//MCP2515 register values: CANCTRL register
#define MCP2515_MODE_NORMAL 0x00
#define MCP2515_MODE_SLEEP 0x20
#define MCP2515_MODE_LOOPBACK 0x40
#define MCP2515_MODE_LISTENONLY 0x60
#define MCP2515_MODE_CONFIG 0x80
#define MCP2515_ABORT_TX 0x10
#define MCP2515_MODE_MASK 0xE0
#define MCP2515_MODE_ONESHOT 0x08
#define MCP2515_CLKOUT_ENABLE 0x04
#define MCP2515_CLKOUT_PS1 0x00 //Set CLK out prescaler to 1. Note: not the same as the CAN CLK prescaler.
#define MCP2515_CLKOUT_PS2 0x01 //... to 2
#define MCP2515_CLKOUT_PS4 0x02 //... to 4
#define MCP2515_CLKOUT_PS8 0x03 //... to 8//MCP2515 CAN Status Register bits (CANSTAT 0xXE, ICOD)
#define MCP2515_CANSTAT_NO_INT 0x00
#define MCP2515_CANSTAT_ERR_INT 0x02
#define MCP2515_CANSTAT_WAK_INT 0x04 //Wake-up Interrupt
#define MCP2515_CANSTAT_TXB0_INT 0x06
#define MCP2515_CANSTAT_TXB1_INT 0x08
#define MCP2515_CANSTAT_TXB2_INT 0x0A
#define MCP2515_CANSTAT_RXB0_INT 0x0C
#define MCP2515_CANSTAT_RXB1_INT 0x0E//MCP2515 CAN Interrupt Flag Define
#define MCP2515_CANINTF_MERRF 0x80
#define MCP2515_CANINTF_WAKIF 0x40
#define MCP2515_CANINTF_ERRIF 0x20
#define MCP2515_CANINTF_TX2IF 0x10
#define MCP2515_CANINTF_TX1IF 0x08
#define MCP2515_CANINTF_TX0IF 0x04
#define MCP2515_CANINTF_RX1IF 0x02
#define MCP2515_CANINTF_RX0IF 0x01#define MCP2515_CANINT_MERR 0x80
#define MCP2515_CANINT_WAKI 0x40
#define MCP2515_CANINT_ERRI 0x20
#define MCP2515_CANINT_TX2I 0x10
#define MCP2515_CANINT_TX1I 0x08
#define MCP2515_CANINT_TX0I 0x04
#define MCP2515_CANINT_RX1I 0x02
#define MCP2515_CANINT_RX0I 0x01#define MCP2515_CAN_Standard (0) /*!< Standard Id */
#define MCP2515_CAN_Extended (8) /*!< Extended Id */
/** * @brief MCP2515_CAN Tx message structure definition */typedef struct
{uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. */uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. */unsigned char IDE; /*!< Specifies the type of identifier for the message that will be transmitted. This parameter can be a value of @ref CAN_identifier_type */unsigned char RTR; /*!< Specifies the type of frame for the message that will be transmitted. This parameter can be a value of @ref CAN_remote_transmission_request */unsigned char DLC; /*!< Specifies the length of the frame that will be transmitted. This parameter can be a value between 0 to 8 */unsigned char Data[8]; /*!< Contains the data to be transmitted. It ranges from 0 to 0xFF. */
}MCP2515_CanTxMsg;/** * @brief MCP2515_CAN Rx message structure definition */typedef struct
{uint32_t StdId; /*!< Specifies the standard identifier.This parameter can be a value between 0 to 0x7FF. */uint32_t ExtId; /*!< Specifies the extended identifier.This parameter can be a value between 0 to 0x1FFFFFFF. */unsigned char IDE; /*!< Specifies the type of identifier for the message that will be received. This parameter can be a value of @ref CAN_identifier_type */unsigned char RTR; /*!< Specifies the type of frame for the received message.This parameter can be a value of @ref CAN_remote_transmission_request */unsigned char DLC; /*!< Specifies the length of the frame that will be received.This parameter can be a value between 0 to 8 */unsigned char Data[8]; /*!< Contains the data to be received. It ranges from 0 to 0xFF. */unsigned char FMI; /*!< Specifies the index of the filter the message stored in the mailbox passes through. This parameter can be a value between 0 to 0xFF */
}MCP2515_CanRxMsg;extern MCP2515_CanRxMsg MCP2515_Rxmsg;
extern MCP2515_CanTxMsg MCP2515_Txmsg;/*KEY API*/
void MCP2515_CAN_Init(unsigned char brp,unsigned char ps1,unsigned char ps2);
unsigned char MCP2515_CAN_ReceiveData(MCP2515_CanRxMsg * rxmsg);
void MCP2515_CAN_SendData(MCP2515_CanTxMsg *txmsg);
void CANINT_GPIO_Init(void);/*General API*/
void MCP2515_Reset(void);
unsigned char MCP2515_ReadByte(unsigned char addr);
void MCP2515_WriteByte(unsigned char addr,unsigned char data);
void MCP2515_BitModify(unsigned char Addr, unsigned char MASK, unsigned char data);
uint8_t MCP2515_Get_ReadStatus(void);
uint8_t MCP2515_Get_RxStatus(void);
void MCP2515_RTS(unsigned char TxBn);/*Set MCP2515*/
void MCP2515_SetCNF1(unsigned char data);
void MCP2515_SetCNF2(unsigned char data);
void MCP2515_SetCNF3(unsigned char data);
void MCP2515_SetMode(unsigned char data);
unsigned char MCP2515_GetCanStatus(void);/*TX API*/
void MCP2515_SetTXID(unsigned char TxBnID,MCP2515_CanTxMsg *txmsg);
void MCP2515_SetTXDLC(unsigned char TxBnDLC,MCP2515_CanTxMsg *txmsg);
void MCP2515_SetTXDATA(unsigned char TxBnDm,MCP2515_CanTxMsg *txmsg);/*RX API*/#endif /*MCP2515_H_*/
接下来就是MCP2515的源文件代码 和头文件是对应的
#include "mcp2515.h"
#include "spi.h"
#include "System/Utils.h"
#include "GPIO/GPIO.h"
#include <stdio.h>MCP2515_CanRxMsg MCP2515_Rxmsg;
MCP2515_CanTxMsg MCP2515_Txmsg;void EXTI9_5_IRQHandler(void)
{if(!GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_9)){/*can中断*/MCP2515_CAN_ReceiveData(&MCP2515_Rxmsg);}EXTI_ClearITPendingBit(EXTI_Line9); //清除LINE9上的中断标志位
}
void CANINT_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入GPIO_Init(GPIOD, &GPIO_InitStructure);//中断线以及中断初始化配置 下降沿触发GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource9); EXTI_InitStructure.EXTI_Line=EXTI_Line9;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); }/********* * @brief MCP2515_CAN_Init* @param brp:0~63* @param ps1:0~7* @param ps2:1~7* Baudrate=Fosc/( 2+ (ps1+1) + (ps2+1) ) * 2*(1+brp) )* eg:brp=1 ps1=3 ps2=1Baudrate=8Mhz/(2+(3+1)+(1+1))*2*(1+1) =250Khz* eg:brp=0 ps1=3 ps2=1Baudrate=8Mhz/(2+(1+1)+(1+1))*2*(1+1) =250Khz* @retval none*/
void MCP2515_CAN_Init(unsigned char brp,unsigned char ps1,unsigned char ps2)
{这个是CAN初始化的代码 主要是配置CAN的波特率 模式 通道等具体代码可以小窗找我
}/********* * @brief Receive n bytes from MCP2515 RXB0* @param rxmsg:RxDataStruct* @retval Data:return the effectively data from RXB0*/
unsigned char MCP2515_CAN_ReceiveData(MCP2515_CanRxMsg * rxmsg)
{这个是CAN的接收函数 可以在中断中来读取这个API 得到接收的can数据具体代码可以小窗找我}
/********* * @brief Send n bytes to MCP2515 txb0* @param txmsg: data to be sent * @retval None*/
void MCP2515_CAN_SendData(MCP2515_CanTxMsg *txmsg)
{这个是CAN的发送函数 代入CAN的结构体参数就可以具体代码可以小窗找我
}//功能:复位MCP2515
void MCP2515_Reset(void)
{MC2515_CS(0);SPI_MCP2515_Write_Read(MCP2515_RESET);MC2515_CS(1);
}
//功能:读MCP2515的数据
//入口参数:Addr:寄存器地址
//返回值:寄存器地址中的数据
unsigned char MCP2515_ReadByte(unsigned char addr)
{unsigned char ReadData;MC2515_CS(0);SPI_MCP2515_Write_Read(MCP2515_READ);SPI_MCP2515_Write_Read(addr);ReadData=SPI_MCP2515_Write_Read(0xff);MC2515_CS(1);return ReadData;
}
//功能:读MCP2515的寄存器
//入口参数:Addr:寄存器地址 data:数据字节
void MCP2515_WriteByte(unsigned char addr,unsigned char data)
{MC2515_CS(0);SPI_MCP2515_Write_Read(MCP2515_WRITE);SPI_MCP2515_Write_Read(addr);SPI_MCP2515_Write_Read(data);MC2515_CS(1);
}
//功能:只修改寄存器中的某些位
//入口参数:Addr:寄存器地址 MASK:屏蔽字 data:数据字节
void MCP2515_BitModify(unsigned char Addr, unsigned char MASK, unsigned char data)
{MC2515_CS(0);SPI_MCP2515_Write_Read(MCP2515_BIT_MODIFY);SPI_MCP2515_Write_Read(Addr);SPI_MCP2515_Write_Read(MASK);SPI_MCP2515_Write_Read(data);MC2515_CS(1);
}
//功能:获取读状态指令中的数据
//返回值:读状态指令中的数据
uint8_t MCP2515_Get_ReadStatus(void)
{unsigned char ReadData;MC2515_CS(0); ReadData=SPI_MCP2515_Write_Read(MCP2515_READ_RXTX_STATUS);MC2515_CS(1);return ReadData;
}
//功能:获取读状态指令中的数据
//返回值:读状态指令中的数据
uint8_t MCP2515_Get_RxStatus(void)
{unsigned char ReadData;MC2515_CS(0); ReadData=SPI_MCP2515_Write_Read(MCP2515_RX_STATUS);MC2515_CS(1);return ReadData;
}
//功能:请求发送功能
//入口参数:TxBn 发送缓冲器序号
//MCP2515_RTS_TXB0/MCP2515_RTS_TXB1/MCP2515_RTS_TXB2/MCP2515_RTS_ALL
void MCP2515_RTS(unsigned char TxBn)
{MC2515_CS(0); SPI_MCP2515_Write_Read(TxBn);MC2515_CS(1);
}
/*
bit 7-6 SJW:同步跳转宽度位 <1:0>11 = 长度 = 4 x TQ10 = 长度 = 3 x TQ01 = 长度 = 2 x TQ00 = 长度 = 1 x TQ
bit 5-0 BRP:波特率预分频比位 <5:0>TQ = 2 x (BRP + 1)/FOSC
*/
void MCP2515_SetCNF1(unsigned char data)
{MCP2515_WriteByte(MCP2515_CNF1,data);
}/*
bit 7 BTLMODE:相位缓冲段 PS2 位时间长度位1 = PS2 时间长度由 CNF3 的 PHSEG22:PHSEG20 位决定0 = PS2 时间长度为 PS1 和 IPT (2 TQ)两者的较大值
bit 6 SAM:采样点配置位1 = 在采样点对总线进行三次采样0 = 在采样点对总线进行一次采样
bit 5-3 PHSEG1:相位缓冲段 PS1 位时间长度位 <2:0>(PHSEG1 + 1) x TQ
bit 2-0 PRSEG:传播段长度位 <2:0>(PRSEG + 1) x TQ
*/
void MCP2515_SetCNF2(unsigned char data)
{MCP2515_WriteByte(MCP2515_CNF2,data);
}/*
bit 7 SOF:起始帧信号位如果 CANCTRL.CLKEN = 1:1 = CLKOUT 引脚使能为 SOF 信号0 = CLKOUT 引脚使能为时间输出功能如果 CANCTRL.CLKEN = 0,该位为任意状态 .
bit 6 WAKFIL:唤醒滤波使能位1 = 唤醒滤波器使能0 = 唤醒滤波器禁止
bit 2-0 PHSEG2:相位缓冲段 PS2 长度 <2:0>(PHSEG2 + 1) x TQ 注: PS2 的最小有效值为 2 TQ
*/
void MCP2515_SetCNF3(unsigned char data)
{MCP2515_WriteByte(MCP2515_CNF3,data);
}/*
bit 7-5 REQOP<2:0>:请求工作模式的位000 = 设定为正常工作模式001 = 设定为休眠模式010 = 设定为环回模式011 = 设定为仅监听模式100 = 设定为配置模式REQOP 位不应设置为其他值,因为这些值都是无效的。
注: 上电时, REQOP = b’111’
bit 4 ABAT:中止所有当前报文发送的位1 = 请求中止所有当前报文发送的缓冲器0 = 终止对所有报文发送中止的请求
bit 3 OSM:单触发模式位1 = 使能。报文仅尝试发送一次0 = 禁止。如有需要,报文会重新发送。
bit 2 CLKEN:CLKOUT 引脚使能位1 = CLKOUT 引脚使能0 = CLKOUT 引脚禁止 (引脚处于高阻态)
bit 1-0 CLKPRE<1:0>:CLKOUT 引脚预分频比位00 =FCLKOUT = 系统时钟频率 /101 =FCLKOUT = 系统时钟频率 /210 =FCLKOUT = 系统时钟频率 /411 =FCLKOUT = 系统时钟频率 /8
*/
void MCP2515_SetMode(unsigned char data)
{MCP2515_WriteByte(MCP2515_CANCTRL,data);
}/*
bit 7-5 OPMOD:工作模式位 <2:0>000 = 器件处于正常工作模式001 = 器件处于休眠模式010 = 器件处于环回模式011 = 器件处于仅监听模式100 = 器件处于配置模式
bit 4 未用:读为 0
bit 3-1 ICOD:中断标志代码位 <2:0>000 = 无中断001 = 出错中断010 = 唤醒中断011 = TXB0 中断100 = TXB1 中断101 = TXB2 中断110 = RXB0 中断111 = RXB1 中断bit 0 未用:读为 0
*/
unsigned char MCP2515_GetCanStatus(void)
{return MCP2515_ReadByte(MCP2515_CANSTAT);
}void MCP2515_SetTXID(unsigned char TxBnID,MCP2515_CanTxMsg *txmsg)
{unsigned char HSID,LSID,EID8,EID0;unsigned int SendId[2];if(txmsg->IDE==MCP2515_CAN_Standard){SendId[0]=txmsg->StdId;HSID=(unsigned char)(SendId[0]>>3);LSID=(unsigned char)((SendId[0]<<5)&0xE0); MCP2515_WriteByte(MCP2515_TXB0SIDH,HSID);MCP2515_WriteByte(MCP2515_TXB0SIDL,LSID); MCP2515_WriteByte(MCP2515_TXB0DLC,txmsg->DLC);}else if(txmsg->IDE==MCP2515_CAN_Extended){SendId[0]=(txmsg->ExtId)>>18;SendId[1]=(txmsg->ExtId)&0x03FFFF;HSID=(unsigned char)(SendId[0]>>3);LSID=((unsigned char)((SendId[0]<<5)&0xE0) | MCP2515_CAN_Extended | (unsigned char)((SendId[1]>>16)&0x03) );EID8=(unsigned char)(SendId[1]>>8);EID0=(unsigned char)SendId[1];
// printf("\r\nHSID=%x HSID=%x EID8=%x EID0=%x",HSID,LSID,EID8,EID0);MCP2515_WriteByte(MCP2515_TXB0SIDH,HSID);MCP2515_WriteByte(MCP2515_TXB0SIDL,LSID); MCP2515_WriteByte(MCP2515_TXB0EID8,EID8);MCP2515_WriteByte(MCP2515_TXB0EID0,EID0); }
}void MCP2515_SetTXDLC(unsigned char TxBnDLC,MCP2515_CanTxMsg *txmsg)
{if(txmsg->DLC>=8)txmsg->DLC=8;MCP2515_WriteByte(TxBnDLC,txmsg->DLC|0x40);//默认数据帧
}/*
TXBnDM7:TXBnDM0:发送缓冲器 n 数据字段字节 m
*/
void MCP2515_SetTXDATA(unsigned char TxBnDm,MCP2515_CanTxMsg *txmsg)
{for(unsigned char i=0;i<txmsg->DLC;i++){MCP2515_WriteByte(TxBnDm+i,txmsg->Data[i]);}
}
相关文章:
stm32驱动MCP2515芯片,项目已通过测试
最近公司做一个项目,需要3路can通道,但是stm32看了很久,最多也就只有2个can,所以找到了一款MCP2515芯片,可以用spi驱动can。 已经实现了can的发送和接收,接收采用的是外部中断接收的方式。和单片机本身带的…...

Nginx部署前后端分离项目
dev.env.js解释 //此文件时开发环境配置文件 use strice//使用严格模式 const merge require(webpacl-merge)//合并对象 const prodEnv require(./prod.env)//导出 module.exports merge(prodEnv,{//合并两个配置文件对象并生成一个新的配置文件,如果合并的过程…...

pytorch多分类问题 CrossEntropyLoss()函数的输入size/shape不一致问题
在使用pytorch实现一个多分类任务的时候,许多多分类任务在训练过程中都会有如下的代码: criterion nn.CrossEntropyLoss() loss criterion(output, target) # output.size : [batch_size, class_num] # target.size : [batch_size]许多的初学者会卡在…...

硬盘或者U盘提示需要格式化的解决办法
插入硬盘之后提示: 使用驱动器 G:中的光盘之前需要将其格式化 是否要将其格式化? 如下图所示 顿时慌了啊,里面还有比较重要的东西呢,这一下子完蛋? 遇事找某宝,上面估计有这种技术服务。果然有这一类的技术服务&…...

Clip-Path
前言 借助clip-path,我们可以实现一些复杂的animation动画效果,我们先来简单概述一下它的特性,如MDN所描述的。 The clip-path CSS property creates a clipping region that sets what part of an element should be shown. Parts that are inside the region are shown, whi…...

Matlab绘图系列教程-Matlab 34 种绘图函数示例(下)
Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化 文章目录 Matlab绘图系列教程:揭秘高质量科学图表的绘制与优化第一部分:入门指南1.1 简介关于本教程的目的与范围Matlab绘图在科学研究中的重要性 1.2 准备工作安装Matlab及其工具箱 1.3 …...

【Vue+Django】Training Management Platform Axios并发请求 - 20230703
需求陈述 由于API是特定单位/特定类别/特定教学方式的数据,故汇总数据需要循环请求不同单位/不同类别/不同教学方式。 技术要点 1.axios并发请求 2.JS for循环 3.Vue数组中出现 ob :Observer无法取值问题的解决方法 4.将数据转化为数组 5.一次请求所有数据后&…...

smart Spring:自定义注解、拦截器的使用(更新中...)
文章目录 〇、使用自定义注解的好处和工作原理一、如何使用自定义注解1.自定义一个注解2.在类、属性、方法上进行使用3.元注解 二、使用拦截器的好处和工作原理三、如何使用拦截器参考 本博客源码: 〇、使用自定义注解的好处和工作原理 自定义注解是Java语言提供的…...

php导出pdf
插件官网:TCPDF 博主用的是tp6框架 、tcpdf插件 composer require tecnickcom/tcpdf --ignore-platform-reqs 后面是忽略平台要求的参数 ---------------中文乱码start------------------ 关于中文乱码问题: 网上说的下载字体放入fonts 利用tools…...
【ECMAScript6_2】字符串
1、字符的Unicode表示法 ES6 加强了对 Unicode 的支持,允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。(\u0000-\uFFFF) 码点超过取值范围之后不能正确解读,但是只要给码点加上{}就可以正确解读。 …...

37.RocketMQ之Broker消息存储源码分析
highlight: arduino-light 消息存储文件 rocketMQ的消息持久化在我们在搭建集群时都特意指定的文件存储路径,进入指定的store目录下就可以看到。 下面介绍各文件含义 CommitLog 存储消息的元数据。produce发出的所有消息都会顺序存入到CommitLog文件当中。 CommitLog由多个文件…...

RabbitMq应用延时消息
一.建立绑定关系 package com.lx.mq.bind;import com.lx.constant.MonitorEventConst; import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.*; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annota…...
【WEB自动化测试】- 浏览器操作方法
一、常用方法 1. maximize_window() 最大化窗口 (重点) 说明:如果能够在打开页面时,全屏显示页面,就能尽最大可能加载更多的页面,提高可定位性 2. set_window_size(width, height) 设置浏览器窗口的大小 (了解) 场景࿱…...
VSCode设置鼠标滚轮滑动设置字体大小
1:打开"文件->首选项->设置 2 :打开settings.json文件 英文版这里有个坑 一般点击我下图右上角那个{ } 就可以打开了 在 设置的json 文件中加入如下 “editor.mouseWheelZoom”: true { “editor.mouseWheelZoom”: true, “json.schemas”: [ ]}...

Spring MVC是什么?详解它的组件、请求流程及注解
作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解Spring MVC是什么,它的优缺点与九大组件,以及它的请求流程与常用的注解。 目录 一、Spring MVC是什…...

基于Spring Boot的广告公司业务管理平台设计与实现(Java+spring boot+MySQL)
获取源码或者论文请私信博主 演示视频: 基于Spring Boot的广告公司业务管理平台设计与实现(Javaspring bootMySQL) 使用技术: 前端:html css javascript jQuery ajax thymeleaf 后端:Java springboot框架 …...
docker 基本命令安装流程
docker 基本命令安装流程 1.更新Ubuntu的apt源索引 $ sudo apt-get update2.安装包允许apt通过HTTPS使用仓库 $ sudo dpkg --configure -a $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common3.添加Docker官方GPG key $ curl -f…...

尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】
尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Flink1.17实战教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据Flink1.17实战教程-笔记01【Flink概述、Flink快速上手】尚硅谷大数据Flink1.17实战教程-笔记02【Flink部署】尚硅谷…...

【LeetCode每日一题合集】2023.7.3-2023.7.9
文章目录 2023.7.3——445. 两数相加 II(大数相加/高精度加法)2023.7.4——2679. 矩阵中的和2023.7.5——2600. K 件物品的最大和(贪心)代码1——贪心模拟代码2——Java一行 2023.7.6——2178. 拆分成最多数目的正偶数之和&#x…...

java企业工程项目管理系统平台源码
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&#…...

高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

ui框架-文件列表展示
ui框架-文件列表展示 介绍 UI框架的文件列表展示组件,可以展示文件夹,支持列表展示和图标展示模式。组件提供了丰富的功能和可配置选项,适用于文件管理、文件上传等场景。 功能特性 支持列表模式和网格模式的切换展示支持文件和文件夹的层…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...

从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

结构化文件管理实战:实现目录自动创建与归类
手动操作容易因疲劳或疏忽导致命名错误、路径混乱等问题,进而引发后续程序异常。使用工具进行标准化操作,能有效降低出错概率。 需要快速整理大量文件的技术用户而言,这款工具提供了一种轻便高效的解决方案。程序体积仅有 156KB,…...

Appium下载安装配置保姆教程(图文详解)
目录 一、Appium软件介绍 1.特点 2.工作原理 3.应用场景 二、环境准备 安装 Node.js 安装 Appium 安装 JDK 安装 Android SDK 安装Python及依赖包 三、安装教程 1.Node.js安装 1.1.下载Node 1.2.安装程序 1.3.配置npm仓储和缓存 1.4. 配置环境 1.5.测试Node.j…...
验证redis数据结构
一、功能验证 1.验证redis的数据结构(如字符串、列表、哈希、集合、有序集合等)是否按照预期工作。 2、常见的数据结构验证方法: ①字符串(string) 测试基本操作 set、get、incr、decr 验证字符串的长度和内容是否正…...