S32K144开发笔记5 - SPI驱动MCP2515

article/2025/10/26 8:38:40

1、接线图

MCU端口
MCP2515端
PTB13 — INT 接收数据中断引脚
PTB14 — CLK 时钟
PTB15 — MISO 接收
PTB16 — MOSI 发送
PTB17 — CSN 片选

2、软件SPI

2.1、GPIO口配置


鼠标放在如下位置右击选择Pin Functional Properities,进入引脚属性配置

PTB13引脚配置如下:
PTB13
PTB14引脚配置如下:

PTB15引脚配置如下:

PTB16引脚配置如下:

PTB17引脚配置如下:

2.2、参考代码

2.2.1、mcp2515.c

#include "Cpu.h"
#include "mcp2515.h"
#include "delay.h"//MCP2515波特率预分频
#define	CAN_10Kbps	0x31
#define CAN_25Kbps	0x13
#define CAN_50Kbps	0x09
#define CAN_100Kbps	0x04
#define CAN_125Kbps	0x03
#define CAN_250Kbps	0x01
#define	CAN_500Kbps	0x00#define MCP2515_CS(x) PINS_DRV_WritePin(PTB,17,x)
#define MCP2515_CLK(x) PINS_DRV_WritePin(PTB,14,x)
#define MCP2515_MISO ((PINS_DRV_ReadPins(PTB)>>15)&0x01)
#define MCP2515_MOSI(x) PINS_DRV_WritePin(PTB,16,x)unsigned char SPI_ReadByte(void)
{unsigned char i,rByte=0;MCP2515_CLK(0);for(i=0;i<8;i++){MCP2515_CLK(1);rByte<<=1;rByte|=MCP2515_MISO;MCP2515_CLK(0);}return rByte;
}
void SPI_SendByte(unsigned char dt)
{unsigned char i;for(i=0;i<8;i++){MCP2515_CLK(0);if((dt<<i)&0x80)MCP2515_MOSI(1);elseMCP2515_MOSI(0);MCP2515_CLK(1);}MCP2515_CLK(0);
}
void MCP2515_WriteByte(unsigned char addr,unsigned char dat)
{MCP2515_CS(0);				//置MCP2515的CS为低电平SPI_SendByte(CAN_WRITE);	//发送写命令SPI_SendByte(addr);			//发送地址SPI_SendByte(dat);			//写入数据MCP2515_CS(1);				//置MCP2515的CS为高电平
}
unsigned char MCP2515_ReadByte(unsigned char addr)
{unsigned char rByte;MCP2515_CS(0);				//置MCP2515的CS为低电平SPI_SendByte(CAN_READ);		//发送读命令SPI_SendByte(addr);			//发送地址rByte=SPI_ReadByte();		//读取数据MCP2515_CS(1);				//置MCP2515的CS为高电平return rByte;				//返回读到的一个字节数据
}
void MCP2515_Reset(void)
{MCP2515_CS(0);				//置MCP2515的CS为低电平SPI_SendByte(CAN_RESET);	//发送寄存器复位命令delay_ms(100);MCP2515_CS(1);				//置MCP2515的CS为高电平
}
void MCP2515_Init(void)
{unsigned char temp=0;MCP2515_Reset();	//发送复位指令软件复位MCP2515delay_ms(1);		//通过软件延时约nms(不准确)//设置波特率为125Kbps//set CNF1,SJW=00,长度为1TQ,BRP=49,TQ=[2*(BRP+1)]/Fsoc=2*50/8M=12.5usMCP2515_WriteByte(CNF1,CAN_500Kbps);//set CNF2,SAM=0,在采样点对总线进行一次采样,PHSEG1=(2+1)TQ=3TQ,PRSEG=(0+1)TQ=1TQMCP2515_WriteByte(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);//set CNF3,PHSEG2=(2+1)TQ=3TQ,同时当CANCTRL.CLKEN=1时设定CLKOUT引脚为时间输出使能位MCP2515_WriteByte(CNF3,PHSEG2_3TQ);//	MCP2515_WriteByte(TXB0SIDH,0xFF);//发送缓冲器0标准标识符高位
//	MCP2515_WriteByte(TXB0SIDL,0xE0);//发送缓冲器0标准标识符低位MCP2515_WriteByte(RXB0SIDH,0x00);//清空接收缓冲器0的标准标识符高位MCP2515_WriteByte(RXB0SIDL,0x00);//清空接收缓冲器0的标准标识符低位MCP2515_WriteByte(RXB0CTRL,0x20);//仅仅接收标准标识符的有效信息MCP2515_WriteByte(RXB0DLC,DLC_8);//设置接收数据的长度为8个字节MCP2515_WriteByte(RXF0SIDH,0x00);//配置验收滤波寄存器n标准标识符高位MCP2515_WriteByte(RXF0SIDL,0x00);//配置验收滤波寄存器n标准标识符低位MCP2515_WriteByte(RXM0SIDH,0x00);//配置验收屏蔽寄存器n标准标识符高位MCP2515_WriteByte(RXM0SIDL,0x00);//配置验收屏蔽寄存器n标准标识符低位
/*MCP2515_WriteByte(RXF0SIDH,0xFF);//配置验收滤波寄存器n标准标识符高位MCP2515_WriteByte(RXF0SIDL,0xE0);//配置验收滤波寄存器n标准标识符低位MCP2515_WriteByte(RXM0SIDH,0xFF);//配置验收屏蔽寄存器n标准标识符高位MCP2515_WriteByte(RXM0SIDL,0xE0);//配置验收屏蔽寄存器n标准标识符低位
*/MCP2515_WriteByte(CANINTF,0x00);//清空CAN中断标志寄存器的所有位(必须由MCU清空)MCP2515_WriteByte(CANINTE,0x01);//配置CAN中断使能寄存器的接收缓冲器0满中断使能,其它位禁止中断MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//将MCP2515设置为正常模式,退出配置模式temp=MCP2515_ReadByte(CANSTAT);//读取CAN状态寄存器的值if(OPMODE_NORMAL!=(temp&&0xE0))//判断MCP2515是否已经进入正常模式{MCP2515_WriteByte(CANCTRL,REQOP_NORMAL|CLKOUT_ENABLED);//再次将MCP2515设置为正常模式,退出配置模式}
}/*******************************************************************************
* 函数名  : CAN_Send_Buffer
* 描述    : CAN发送指定长度的数据
* 输入    : *CAN_TX_Buf(待发送数据缓冲区指针),len(待发送数据长度)
* 输出    : 无
* 返回值  : 无
* 说明    : 无
*******************************************************************************/
void CAN_Send_Buffer(unsigned char *CAN_TX_Buf,unsigned char len)
{unsigned char j,dly,count;count=0;while(count<len){dly=0;while((MCP2515_ReadByte(TXB0CTRL)&0x08) && (dly<50))//快速读某些状态指令,等待TXREQ标志清零{delay_ms(1);//通过软件延时约nms(不准确)dly++;}for(j=0;j<8;){MCP2515_WriteByte(TXB0D0+j,CAN_TX_Buf[count++]);//将待发送的数据写入发送缓冲寄存器j++;if(count>=len) break;}MCP2515_WriteByte(TXB0DLC,j);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器MCP2515_CS(0);MCP2515_WriteByte(TXB0CTRL,0x08);//请求发送报文MCP2515_CS(1);}
}void CANSendData(unsigned int id,unsigned char *CAN_TX_Buf,unsigned char len)
{unsigned char j,dly,count;count=0;while(count<len){dly=0;while((MCP2515_ReadByte(TXB0CTRL)&0x08) && (dly<50))//快速读某些状态指令,等待TXREQ标志清零{delay_ms(1);//通过软件延时约nms(不准确)dly++;}unsigned char DH = (unsigned char)(id >> 3);unsigned char DL = (unsigned char)((id & 0x07) << 5);MCP2515_WriteByte(TXB0SIDH,DH);//发送缓冲器0标准标识符高位MCP2515_WriteByte(TXB0SIDL,DL);//发送缓冲器0标准标识符低位for(j=0;j<8;){MCP2515_WriteByte(TXB0D0+j,CAN_TX_Buf[count++]);//将待发送的数据写入发送缓冲寄存器j++;if(count>=len) break;}MCP2515_WriteByte(TXB0DLC,j);//将本帧待发送的数据长度写入发送缓冲器0的发送长度寄存器MCP2515_CS(0);MCP2515_WriteByte(TXB0CTRL,0x08);//请求发送报文MCP2515_CS(1);}
}unsigned char CAN_Receive_Buffer(unsigned char *CAN_RX_Buf)
{unsigned char i=0,len=0,temp=0;temp = MCP2515_ReadByte(CANINTF);if(temp & 0x01){len=MCP2515_ReadByte(RXB0DLC);//读取接收缓冲器0接收到的数据长度(0~8个字节)while(i<len){CAN_RX_Buf[i]=MCP2515_ReadByte(RXB0D0+i);//把CAN接收到的数据放入指定缓冲区i++;}}MCP2515_WriteByte(CANINTF,0);//清除中断标志位(中断标志寄存器必须由MCU清零)return len;
}static unsigned int get_standar_id(void)
{unsigned char id_dh = 0,id_dl = 0;unsigned int return_value = 0,id = 0;id_dh = MCP2515_ReadByte(RXB0SIDH);id_dl = MCP2515_ReadByte(RXB0SIDL);id = (id_dh << 3);id = id + (id_dl >> 5);return_value = id;return (return_value);
}unsigned char CANReceiveBuffer(unsigned int *id,unsigned char *CAN_RX_Buf)
{unsigned char i=0,len=0,temp=0;temp = MCP2515_ReadByte(CANINTF);if(temp & 0x01){*id = get_standar_id();len=MCP2515_ReadByte(RXB0DLC);//读取接收缓冲器0接收到的数据长度(0~8个字节)while(i<len){CAN_RX_Buf[i]=MCP2515_ReadByte(RXB0D0+i);//把CAN接收到的数据放入指定缓冲区i++;}}MCP2515_WriteByte(CANINTF,0);//清除中断标志位(中断标志寄存器必须由MCU清零)return len;
}

2.2.2、mcp2515.h

#ifndef __MCP2515_H_
#define __MCP2515_H_/* 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
#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
#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
#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     0x00void MCP2515_Init(void);
void CAN_Send_Buffer(unsigned char *CAN_TX_Buf,unsigned char len);
unsigned char CAN_Receive_Buffer(unsigned char *CAN_RX_Buf);
void CANSendData(unsigned int id,unsigned char *CAN_TX_Buf,unsigned char len);
unsigned char CANReceiveBuffer(unsigned int *id,unsigned char *CAN_RX_Buf);
#endif

2.2.3、main.c

#include "Cpu.h"
#include "delay.h"
#include "mcp2515.h"volatile int exit_code = 0;/* User includes (#include below this line is not maintained by Processor Expert) *//*! \brief The main function for the project.\details The startup initialization sequence is the following:* - startup asm routine* - main()
*/
unsigned char debug_flag = 0;
void  MCP2515_RECEIVE_IRQ(void)
{uint32_t receive = PINS_DRV_GetPortIntFlag(PORTB) & ( 1 << 13 );  //获取中断标志位状态/*检测中断*/if(receive != 0){if( ((receive >> 13) & 0x01) == 1 ){debug_flag = 1;}}PINS_DRV_ClearPortIntFlagCmd(PORTB);
}
int main(void)
{/* Write your local variable definition here *//*** Processor Expert internal initialization. DON'T REMOVE THIS CODE!!! ***/#ifdef PEX_RTOS_INITPEX_RTOS_INIT();                   /* Initialization of the selected RTOS. Macro is defined by the RTOS component. */#endif/*** End of Processor Expert internal initialization.                    ***//* Write your code here *//* For example: for(;;) { } */CLOCK_SYS_Init(g_clockManConfigsArr, CLOCK_MANAGER_CONFIG_CNT,g_clockManCallbacksArr, CLOCK_MANAGER_CALLBACK_CNT);CLOCK_SYS_UpdateConfiguration(0U, CLOCK_MANAGER_POLICY_AGREEMENT);PINS_DRV_Init(NUM_OF_CONFIGURED_PINS, g_pin_mux_InitConfigArr); //初始化IO/*设置中断触发条件*/PINS_DRV_SetPinIntSel(PORTB,13,PORT_INT_FALLING_EDGE); //设置下降沿触发中断/*设置并使能中断函数*/INT_SYS_InstallHandler(PORTB_IRQn,&MCP2515_RECEIVE_IRQ,NULL);//安装函数名称为 PTC_EXT_IRQ 的中断函数INT_SYS_EnableIRQ(PORTB_IRQn);MCP2515_Init();unsigned char CAN_R_Buffer[8];						//CAN接收数据保存缓冲区for(;;){if(debug_flag == 1){debug_flag = 0;unsigned char len;unsigned int id;len = CANReceiveBuffer(&id,CAN_R_Buffer);unsigned char buffer[8];buffer[0] = CAN_R_Buffer[0];buffer[1] = CAN_R_Buffer[1];buffer[2] = CAN_R_Buffer[2];buffer[3] = CAN_R_Buffer[3];buffer[4] = CAN_R_Buffer[4];buffer[5] = CAN_R_Buffer[5];buffer[6] = CAN_R_Buffer[6];buffer[7] = CAN_R_Buffer[7];CANSendData(id,buffer,8);}}/*** Don't write any code pass this line, or it will be deleted during code generation. ***//*** RTOS startup code. Macro PEX_RTOS_START is defined by the RTOS component. DON'T MODIFY THIS CODE!!! ***/#ifdef PEX_RTOS_STARTPEX_RTOS_START();                  /* Startup of the selected RTOS. Macro is defined by the RTOS component. */#endif/*** End of RTOS startup code.  ***//*** Processor Expert end of main routine. DON'T MODIFY THIS CODE!!! ***/for(;;) {if(exit_code != 0) {break;}}return exit_code;/*** Processor Expert end of main routine. DON'T WRITE CODE BELOW!!! ***/
} /*** End of main routine. DO NOT MODIFY THIS TEXT!!! ***/

http://chatgpt.dhexx.cn/article/YoErql4K.shtml

相关文章

nRF52笔记(26)QSPI接口液晶显示屏

1 平台条件 硬件&#xff1a;nrf52840 软件&#xff1a;sdk17.0 2 QSPI概述 QSPI 外设支持使用 SPI 与外部闪存设备进行通信 此处列出了 QSPI 外设的主要特性&#xff1a; • 单/双/四通道 SPI 输入/输出 • 2–32 MHz 可配置时钟频率 • 从/到外部闪存的单字读/写访问 • …

MPC5744-LINFlexD

目录 一、基本介绍1.功能2.时钟源3.外设控制器4.中断向量5.基地址 二、寄存器介绍1.LIN控制寄存器1 LINFlexD_LINCR12.LIN中断使能寄存器LINFlexD_LINIER3.LIN状态寄存器LINFlexD_LINSR4.LIN错误状态寄存器LINFlexD_LINESR5.UART控制寄存器LINFlexD_UARTCR6.UART状态寄存器LINF…

MP2456的芯片的学习

本章将讲述MP2456的特征、性能、参数、应用电路、以及使用时的注意事项。小白总结&#xff0c;如有错误&#xff0c;请大神指教。 目录 一、MP2456的特征 二、MP2456的性能和参数 四、MP2456使用时的注意事项 五、名词解释 一、MP2456的特征 &#xff08;1&#xff09;MP…

硬件电路-MP2451组成的电压反转/极性反转电路设计

板上要集成一个18V供电的模拟信号处理电路&#xff0c;包括线圈驱动、小信号拾取、滤波、二级放大等部分。因此&#xff0c;需要板上提供18V电源。正负电压需要分开控制&#xff0c;因为正电压需要兼作485传感器供电&#xff0c;此时关闭负电压部分节省耗电以及保护模拟端。 b…

MP2451的应用电路

电阻R32和电阻R23是怎么实现的电压&#xff0c;FB口的输出是0.8V。 正确的计算应该是&#xff1a; 0.8/10*(1027)这样就是输出的电压。 SS14是大电流二极管&#xff0c;可以用5819完全替代。还有续流二极管。 SS14是40V的耐压&#xff0c;SS12是20V的耐压。 8050可以替代BC8…

MP2451问题记录

数据手册 https://pan.baidu.com/s/1ggJs0y3 MP2451应用电路如下图 在我自己的应用电路中R1120K&#xff0c;R224k 问题一、 电源输出0.42V V(FB)手册中应等于0.8V&#xff0c;但在测试中发现该引脚电压仅为0.07V 0.07 * (12024) / 24 0.42V 判断是芯片损坏 问题二、FB引脚输…

MP2451的BUCK电路

5V的稳压模块经常会用得到&#xff0c;普通的AMS1117-5.0虽然电压输出非常稳定&#xff0c;但是只适合低压降&#xff0c;小电流的场合。笔者曾经用AMS1117-5.0把8.4V稳压到5V,电流160mA&#xff08;8.4V端&#xff09;&#xff0c;芯片一会儿就非常烫手了&#xff0c;即使并联…

MP2451使用注意事项

MP2451使用注意事项 MP2451是一个高速2M的高效的降压芯片&#xff0c;提供0.6A的电流输出&#xff0c;输入电压范围3.3V-36V可调&#xff0c;有关闭芯片引脚&#xff0c;关闭电流3uA&#xff0c;用起来还不错&#xff0c;分享一下经验&#xff0c;如下原理图已经制成了板子&am…

类间关系和内部类和数组

Final关键词 定义Pepole类&#xff0c;运用了final修饰方法eat()&#xff0c;该方法不能被改写&#xff0c;但可以随类进行继承。 用final修饰的类&#xff0c;不能有子类。 内部成员类定义方式 外部类.成员类 对象名 new 外部类&#xff08;&#xff09;.new 内部类。 局部…

UML六种关系图示(过目不忘版)

图中&#xff0c;从左到右分别是依赖、关联、聚合、组合、实现、继承六种关系在UML图中的画法&#xff0c;有箭头&#xff0c;有菱形&#xff0c;有三角&#xff0c;他们为什么这么画呢&#xff0c;之间有什么联系呢&#xff0c;这要从全局来看。 首先&#xff0c;依赖关联关系…

类图有哪些关系?

此刻是最佳时间&#xff0c;抓住当下&#xff01;最近在学习设计模式的时候&#xff0c;时常要用到类图及它们的关联&#xff0c;所以学习了UML类图及类图之间的关系&#xff0c;转载记录一下。 首先我们需要知道什么是类图。 类图&#xff08;ClassDiagram&#xff09;是UML图…

UML中的六种关系

UML关系 1、依赖关系 是一种使用关系&#xff0c;它是对象之间耦合度最弱的一种关联方式&#xff0c;是临时性的关联。 在代码中&#xff0c;某个类的方法通过局部变量、方法的参数或者对静态方法的调用来访问另一个类&#xff08;被依赖类&#xff09;中的某些方法来完成一…

UML的六大关系

关联关系 单向关联 双向关联 自关联 聚合关系 聚合关系是关联关系的一种&#xff0c;是强关联关系&#xff0c;是整体和部分之间的关系 聚合关系通过成员对象来实现的&#xff0c;其中成员对象是整体对象的一部分&#xff0c;但是成员对象可以脱离整体对象而独立存在。例如&…

部分和问题

题目来源 挑战程序设计竞赛&#xff08;第二版&#xff09; 语言 C/C 题目 部分和问题 描述 给定整数 a1, a2, ..., an&#xff0c;判断是否可以从中选出若干数&#xff0c;使它们的和恰好为 k。 样例1 输入&#xff1a; n 4 a {1, 2, 4, 7}; k 13 输出&#xff1a…

【UML】2.部分与整体的媒介:关系

UML模块中的任何事物都不是独立存在的&#xff0c;他们之间存在着一定的关系。下面就对这些关系&#xff0c;分类了解一下。 一&#xff0e;概念 【关联】Association 两个类存在某种语义上的联系&#xff0c;关联有单向关联和双向关联。 【聚合】Aggregation 类之间是整体…

干货!基于部分-整体关系的概念、关系和物理场景认知推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 人类视觉感知的一个关键方面是能够将视觉场景解析为单个对象并进一步分解为对象部分&#xff0c;形成部分-整体层次结构。这种复合结构可以产生丰富的语义概念和关系&#xff0c;从而在视觉信号的解释和组织以及…

设计模式.组合模式(整体和部分关系, 树和Node,透明组合和完全组合)

抽象角度看 一棵树有很多节点&#xff0c;根据位置可以分为&#xff1a;根节点&#xff0c;中间节点&#xff0c;叶子节点 所有的节点都是树节点 这两句话转换为代码就是&#xff1a; 你可以有三个Node类&#xff0c;RootNode&#xff0c;TempNode&#xff0c;LeafNode。当然…

HINSTANCE (句柄相关)

在win32下与HMODULE是相同的东西&#xff0c;在Win32下还存在主要是因为win16   程序使用HINSTANCE来区别task。   区别&#xff1a;   Handle 是代表系统的内核对象&#xff0c;如文件句柄&#xff0c;线程句柄&#xff0c;进程句柄。   HMODULE 是代表应用程序载入的…

为什么需要传递HINSTANCE给CreateWindow?

Win32中有两个API函数&#xff0c;CreateWindow和RegisterClass。它们有一个HINSTANCE参数&#xff0c;很多人对这个参数不是很理解&#xff0c;今天就来讲一讲。 窗口类的名称还不足以唯一地确定这个窗口类。每一个进程都会拥有它自己的窗口类列表&#xff0c;而在这个列表中…

HINSTANCE数据类型

作者&#xff1a;马 岩&#xff08;Furzoom&#xff09; &#xff08;http://www.cnblogs.com/furzoom/&#xff09;版权声明&#xff1a;本文的版权归作者与博客园共同所有。转载时请在明显地方注明本文的详细链接&#xff0c;未经作者同意请不要删除此段声明&#xff0c;感谢…