⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can._h

📁 单片机中的中断处理模块
💻 _H
字号:
#ifndef		__CAN__H
#define		__CAN__H

#include "stdtypes.h"
#include <iom128v.h>

#define PeliCANMode



#define ADDR_CAN_START 0x4000
#define can_reg    ((UNS8 *)  (ADDR_CAN_START))

/*模式和控制寄存器的地址和位定义 */
#if defined (PeliCANMode)
#define ModeControlReg can_reg[0]
#define RM_RR_Bit 0x01 /*复位模式请求位 */
#define LOM_Bit 0x02 /*仅听模式位 */
#define STM_Bit 0x04 /*自我测试模式位 */
#define AFM_Bit 0x08 /*验收滤波器模式位 */
#define SM_Bit 0x10 /*进入休眠模式位 */
#endif
/*命令寄存器的地址和位定义 */
#define CommandReg can_reg[1]
#define TR_Bit 0x01 /*发送请求位 */
#define AT_Bit 0x02 /*中止发送位 */
#define RRB_Bit 0x04 /*释放接收缓冲器位 */
#define CDO_Bit 0x08 /*清除数据超载位 */
#if defined (PeliCANMode)
#define SRR_Bit 0x10 /*自身接收请求位 */
#else /*BasicCAN 模式 */
#define GTS_Bit 0x10 /*进入睡眠模式位 */
#endif
/*状态寄存器的地址和位定义*/
#define StatusReg can_reg[2] 
#define RBS_Bit 0x01 /*接收缓冲器状态位 */
#define DOS_Bit 0x02 /*数据超载状态位 */
#define TBS_Bit 0x04 /*发送缓冲器状态位 */
#define TCS_Bit 0x08 /*发送完成状态位 */
#define RS_Bit 0x10 /*接收状态位 */
#define TS_Bit 0x20 /*发送状态位 */
#define ES_Bit 0x40 /*错误状态位 */
#define BS_Bit 0x80 /*总线状态位 */
/*中断寄存器的地址和位定义 */
#define InterruptReg can_reg[3]
#define RI_Bit 0x01 /*接收中断位 */
#define TI_Bit 0x02 /*发送中断位 */
#define EI_Bit 0x04 /*错误警告中断位 */
#define DOI_Bit 0x08 /*数据超载中断位 */
#define WUI_Bit 0x10 /*唤醒中断位 */
#if defined (PeliCANMode)
#define EPI_Bit 0x20 /*错误被动中断位 */
#define ALI_Bit 0x40 /*仲裁丢失中断位 */
#define BEI_Bit 0x80 /*总线错误中断位 */
#endif

/*中断使能和控制寄存器的地址和位定义 */
#if defined (PeliCANMode)
#define InterruptEnReg can_reg[4] /* PeliCAN 模式 */
#define RIE_Bit 0x01 /*接收中断使能位 */
#define TIE_Bit 0x02 /*发送中断使能位 */
#define EIE_Bit 0x04 /*错误警告中断使能位 */
#define DOIE_Bit 0x08 /*数据超载中断使能位 */
#define WUIE_Bit 0x10 /*唤醒中断使能位 */
#define EPIE_Bit 0x20 /*错误隐性中断使能位 */
#define ALIE_Bit 0x40 /*仲裁丢失中断使能位 */
#define BEIE_Bit 0x80 /*总线错误中断使能位
/*BasicCAN 模式 */
#else 
#define InterruptEnReg can_reg[0] /* 控制寄存器 */
#define RIE_Bit 0x02 /*接收中断使能位 */
#define TIE_Bit 0x04 /*发送中断使能位 */
#define EIE_Bit 0x08 /*错误中断使能位 */
#define DOIE_Bit 0x10 /*超载中断使能位 */
#endif

/*总线定时寄存器的地址和位定义 */
#define BusTiming0Reg can_reg[6]
#define BusTiming1Reg can_reg[7]
#define SAM_Bit 0x80 /*采样模式位 1 总线被采样三次 0 总线被采样一次 */
/*输出控制寄存器的地址和位定义 */
#define OutControlReg can_reg[8]
/*OCMODE1 OCMODE0 */
#define BiPhaseMode 0x00 /*双相输出模式 */
#define NormalMode 0x02 /*正常输出模式 */
#define ClkOutMode 0x03 /*时钟输出模式 */
/*TX1 的输出管脚配置 */
#define OCPOL1_Bit 0x20 /*输出极性控制位 */
#define Tx1Float 0x00 /*配置为悬空 */
#define Tx1PullDn 0x40 /*配置为下拉 */
#define Tx1PullUp 0x80 /*配置为上拉 */
#define Tx1PshPull 0Xc0 /*配置为推挽 */
/*TX0 的输出管脚配置 */
#define OCPOL0_Bit 0x04 /*输出极性控制位 */
#define Tx0Float 0x00 /*配置为悬空 */
#define Tx0PullDn 0x08 /*配置为下拉 */
#define Tx0PullUp 0x10 /*配置为上拉 */
#define Tx0PshPull 0X18 /*配置为推挽 */

/*验收代码和屏蔽寄存器的地址定义 */
#if defined (PeliCANMode)
#define AcceptCode0Reg can_reg[16]
#define AcceptCode1Reg can_reg[17]
#define AcceptCode2Reg can_reg[18]
#define AcceptCode3Reg can_reg[19]
#define AcceptMask0Reg can_reg[20]
#define AcceptMask1Reg can_reg[21]
#define AcceptMask2Reg can_reg[22]
#define AcceptMask3Reg can_reg[23]
/*BasicCAN 模式*/
#else 
#define AcceptCodeReg can_reg[4]
#define AcceptMaskReg can_reg[5]
#endif
/*Rx-缓冲器的地址定义 */
#if defined (PeliCANMode)
#define RxFramInFo can_reg[16]
#define RxBuffer1 can_reg[17]
#define RxBuffer2 can_reg[18]
#define RxBuffer3 can_reg[19]
#define RxBuffer4 can_reg[20]
#define RxBuffer5 can_reg[21]
#define RxBuffer6 can_reg[22]
#define RxBuffer7 can_reg[23]
#define RxBuffer8 can_reg[24]
#define RxBuffer9 can_reg[25]
#define RxBuffer10 can_reg[26]
#define RxBuffer11 can_reg[27]
#define RxBuffer12 can_reg[28]
/*BasicCAN 模式*/
#else 
#define RxBuffer1 can_reg[20]
#define RxBuffer2 can_reg[21]
#define RxBuffer3 can_reg[22]
#define RxBuffer4 can_reg[23]
#define RxBuffer5 can_reg[24]
#define RxBuffer6 can_reg[25]
#define RxBuffer7 can_reg[26]
#define RxBuffer8 can_reg[27]
#define RxBuffer9 can_reg[28]
#define RxBuffer10 can_reg[29]
#endif
/*Tx 缓冲器的地址定义 */
#if defined (PeliCANMode)
/*仅写地址 */
#define TxFramInFo can_reg[16]

#define TxBuffer1 can_reg[17]
#define TxBuffer2 can_reg[18]
#define TxBuffer3 can_reg[19]
#define TxBuffer4 can_reg[20]
#define TxBuffer5 can_reg[21]
#define TxBuffer6 can_reg[22]
#define TxBuffer7 can_reg[23]
#define TxBuffer8 can_reg[24]
#define TxBuffer9 can_reg[25]
#define TxBuffer10 can_reg[26]
#define TxBuffer11 can_reg[27]
#define TxBuffer12 can_reg[28]
/*仅读地址*/
#define TxFramInFoRd can_reg[96]
#define TxBufferRd1 can_reg[97]
#define TxBufferRd2 can_reg[98]
#define TxBufferRd3 can_reg[99]
#define TxBufferRd4 can_reg[100]
#define TxBufferRd5 can_reg[101]
#define TxBufferRd6 can_reg[102]
#define TxBufferRd7 can_reg[103]
#define TxBufferRd8 can_reg[104]
#define TxBufferRd9 can_reg[105]
#define TxBufferRd10 can_reg[106]
#define TxBufferRd11 can_reg[107]
#define TxBufferRd12 can_reg[108]
/*BasicCAN 模式*/
#else                  
#define TxBuffer1 can_reg[10]
#define TxBuffer2 can_reg[11]
#define TxBuffer3 can_reg[12]
#define TxBuffer4 can_reg[13]
#define TxBuffer5 can_reg[14]
#define TxBuffer6 can_reg[15]
#define TxBuffer7 can_reg[16]
#define TxBuffer8 can_reg[17]
#define TxBuffer9 can_reg[18]
#define TxBuffer10 can_reg[19]
#endif
/*其他寄存器的地址定义*/
#if defined (PeliCANMode)
#define ArbLostCapReg can_reg[11]
#define ErrCodeCapReg can_reg[12]
#define ErrWarnLimitReg can_reg[13]
#define RxErrCountReg can_reg[14]
#define TxErrCountReg can_reg[15]
#define RxMsgCountReg can_reg[29]
#define RxBufstartAdr can_reg[30]
#endif
/*时钟分频寄存器的地址和位定义 */
#define ClockDivideReg can_reg[31]
#define DivBy1 0x07 /*CLKOUT=振荡器频率 */
#define DivBy2 0x00 /*CLKOUT=1/2 振荡器频率 */
#define CLKOff_Bit 0x08 /*时钟关闭位时钟输出管脚控制位 */
#define RXINTEN_Bit 0x20 /*用于接收中断的管脚TX1 */
#define CBP_Bit 0x40 /*CAN 比较器旁路控制位 */
#define CANMode_Bit 0x80 /*CAN 模式控制位 */



#define CAN_RX_BUFFER_SIZE 128 /* 1,2,4,8,16,32,64,128 or 256 bytes */

#define CAN_RX_BUFFER_MASK  CAN_RX_BUFFER_SIZE-1

#define CAN_RX_MSG_SIZE (14-1)  /**/
/*
 * Convert 29-bit ID into values to place in TouCAN ID_HIGH and ID_LOW
 * fields.
 */
#define ID_29_TO_HIGH(id)   ((UNS16)((((UNS32)(id) & 0x00038000u) >> 15) |  \
				     (((UNS32)(id) & 0x1FFC0000u) >> 13) |  \
				     0x0018u))

#define ID_29_TO_LOW(id)    ((UNS16)(((UNS32)(id) & 0x00007FFFu) << 1))


/* Convert values from the TouCAN registers into a 29-bit ID */
#define ID_HIGH_LOW_TO_29(high,low) ((((UNS32)(high) << 13) & 0x1FFC0000u) |\
				     (((UNS32)(high) << 15) & 0x00038000u) |\
				     (((UNS32)(low) >> 1) & 0x00007FFFu))

#define ID_TO_29(ID1,ID2,ID3,ID4)   ((UNS32)((ID1)&0xf8)<<21)|\
                                    ((UNS32)((ID2)&0xf8)<<13)|((UNS32)((ID1)&0x07)<<21)|\
								    ((UNS32)((ID3)&0xf8)<<5 )|((UNS32)((ID2)&0x07)<<13)|\
								    ((UNS32)((ID4)&0xf8)>>3 )|((UNS32)((ID3)&0x07)<<5)
                                  
#define ID_TO_13(ID1,ID2,ID3,ID4)   ((UNS32)((ID1)&0xf8)<<5 )|\
								    ((UNS32)((ID2)&0xf8)>>3 )|((UNS32)((ID1)&0x07)<<5)	
							
void can_init(void);
void can_receive(UNS8 length);
void can_transmit(UNS8 data1);
void can_process(UNS8 length);
void can_msg_process(UNS32 id,UNS8 msg_length);

#endif




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -