感谢您,我马上试一下!
好像我们版本不一样啊?
其实我是使能了接收和发送中断的,但是生成的CAN文件中:
没有这4行:
BOOL fCAN1SendBusy; //发送FIFO中的CAN数据包发送忙标志
BOOL fCANIReadyRead; //接收FIFO中有待读取的CAN数据包标志
BOOL fCAN2SendEUsy; //发送FIFO中的CAN数据包发送忙标志
BOOL fCAN2Readyfead; //接收FIFO中有待读取的CAN数据包标志
- //<<AICUBE_USER_HEADER_REMARK_BEGIN>>
- ////////////////////////////////////////
- // 在此添加用户文件头说明信息
- // 文件名称: can.c
- // 文件描述:
- // 文件版本: V1.0
- // 修改记录:
- // 1. (2026-04-07) 创建文件
- ////////////////////////////////////////
- //<<AICUBE_USER_HEADER_REMARK_END>>
-
-
- #include "config.h"
-
-
- //<<AICUBE_USER_INCLUDE_BEGIN>>
- // 在此添加用户头文件包含
- //<<AICUBE_USER_INCLUDE_END>>
-
-
- //<<AICUBE_USER_GLOBAL_DEFINE_BEGIN>>
- // 在此添加用户全局变量定义、用户宏定义以及函数声明
- //<<AICUBE_USER_GLOBAL_DEFINE_END>>
-
-
-
-
- const uint8_t CAN_DLC_MAP[2][16] =
- {
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 8, 8, 8 }, //CAN2.0
- { 0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64 }, //CAN-FD
- };
-
-
- ////////////////////////////////////////
- // CAN1初始化函数
- // 入口参数: 无
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN1_Init(void)
- {
- #define CAN1_SBT_BAUDRATE (500UL) //SYSCLK/(S_PRESC+1)/((S_SEG1+2)+(S_SEG2+1))
- #define CAN1_SBT_SJW (0)
- #define CAN1_SBT_PRESC (1)
- #define CAN1_SBT_SEG1 (31)
- #define CAN1_SBT_SEG2 (14)
-
- #define CAN1_FBT_BAUDRATE (500UL) //SYSCLK/(F_PRESC+1)/((F_SEG1+2)+(F_SEG2+1))
- #define CAN1_FBT_SJW (0)
- #define CAN1_FBT_PRESC (1)
- #define CAN1_FBT_SEG1 (31)
- #define CAN1_FBT_SEG2 (14)
-
- CAN16_SetEndianMode(CAN16_LE); //设置CAN的大小端模式
- CAN1_Enable(); //使能CAN1功能
-
- CAN1_SwitchP505122(); //选择CAN1数据口: CANRX (P5.0), CANTX (P5.1), CANSTB(P2.2)
- CAN1_DisableStandbyPin(); //禁止CAN1STB管脚功能
-
- CAN1_EnterResetMode(); //进入复位模式,开始对CAN1模块进行初始化
- CAN1_NormalMode(); //CAN1模块为普通工作模式
- CAN1_FD_BoschMode(); //Bosch CAN-FD模式
-
- CAN1_SetSBT_SEG1(CAN1_SBT_SEG1); //设置慢速波特率同步采样段1
- CAN1_SetSBT_SEG2(CAN1_SBT_SEG2); //设置慢速波特率同步采样段2
- CAN1_SetSBT_SJW(CAN1_SBT_SJW); //设置慢速波特率重新同步跳跃宽度
- CAN1_SetSBT_PRESC(CAN1_SBT_PRESC); //设置慢速波特率分频系数
-
- CAN1_SetFBT_SEG1(CAN1_FBT_SEG1); //设置快速波特率同步采样段1
- CAN1_SetFBT_SEG2(CAN1_FBT_SEG2); //设置快速波特率同步采样段2
- CAN1_SetFBT_SJW(CAN1_FBT_SJW); //设置快速波特率重新同步跳跃宽度
- CAN1_SetFBT_PRESC(CAN1_FBT_PRESC); //设置快速波特率分频系数
-
- CAN1_RBStoreCorrectData(); //仅存储接收正确的数据
- CAN1_OVFSaveNewest(); //RB上溢时,保存最新接收的数据(最早接收数据被覆盖)
- CAN1_SetAFWLimit(1); //设置RB将满警告阈值
- CAN1_SetEWLimit_8(); //设置RB错误警告编程值((EWL+1)*8)
- CAN1_DisableSelfACK(); //关闭自动应答
-
- CAN1_PTBAutoRetransmit(); //PTB自动重传
- CAN1_STBAutoRetransmit(); //STB自动重传
- CAN1_STBPriorityFIFO(); //STB依据FIFO写入的先后顺序发送
- CAN1_DisableTDC(); //关闭发送延迟补偿功能
-
- CAN1_EnableReceiveInt(); //使能接收中断
- CAN1_EnableRBOverrunInt(); //使能接收溢出中断
- CAN1_EnableRBFIFOFullInt(); //使能接收缓冲区满中断
- CAN1_EnableRBAlmostFullInt(); //使能接收缓冲区将满中断
- CAN1_EnablePTBTransmitInt(); //使能PTB发送中断
- CAN1_EnableSTBTransmitInt(); //使能STB发送中断
- CAN1_EnableErrorInt(); //使能错误中断
- CAN1_EnableErrorPassiveInt(); //使能被动错误中断
- CAN1_EnableArbitrateLostInt(); //使能仲裁丢失中断
- CAN1_EnableBusErrorInt(); //使能总线错误中断
- CAN1_SetIntPriority(0); //设置中断为最低优先级
- CAN1_EnableInt(); //使能CAN1中断
-
- CAN1_ClearFlags(0xff); //清除全部中断标志位
- CAN1_ClearErrorFlags(0xff); //清除全部错误中断标志位
- CAN1_ReleaseRBUF(); //清除ROV标志位
- CAN1_ExitResetMode(); //退出复位模式,
-
- //<<AICUBE_USER_CAN1_INITIAL_BEGIN>>
- // 在此添加用户初始化代码
- //<<AICUBE_USER_CAN1_INITIAL_END>>
- }
-
- ////////////////////////////////////////
- // CAN1发送数据帧函数
- // 入口参数: *pCAN: (发送CAN消息缓冲区)
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN1_SendData(CAN_TxDataDef *pCAN)
- {
- uint8_t cnt, i;
-
- CAN1_WriteTBUF(0, pCAN->ID.u8[3]); //写ID到TBUF
- CAN1_WriteTBUF(1, pCAN->ID.u8[2]);
- CAN1_WriteTBUF(2, pCAN->ID.u8[1]);
- CAN1_WriteTBUF(3, pCAN->ID.u8[0]);
-
- CAN1_WriteTBUF(4, pCAN->CTRL.u8); //写帧控制字节到TBUF
-
- CAN1_WriteTBUF(5, pCAN->RSVD[0]);
- CAN1_WriteTBUF(6, pCAN->RSVD[1]);
- CAN1_WriteTBUF(7, pCAN->RSVD[2]);
-
- cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
-
- for (i = 0; i < cnt; i++)
- CAN1_WriteTBUF((8 + i), pCAN->pu8Data[i]); //写帧数据到TBUF
-
- CAN1_SelectNextTBSlot(); //指向下一个STB SLOT
- #if (TRANS_MODE == PTB_MODE)
- CAN1_TransmitPTB(); //使能PTB发送
- #else
- CAN1_TransmitAllSTB(); //使能STB发送
- #endif
- }
-
- ////////////////////////////////////////
- // CAN1接收数据帧函数
- // 入口参数: *pCAN: (接收CAN消息缓冲区)
- // 函数返回: 帧个数
- ////////////////////////////////////////
- uint8_t CAN1_ReceiveData(CAN_RxDataDef *pCAN)
- {
- uint8_t cnt, i;
- uint8_t n = 0;
-
- while (CAN1_CheckRBStatus() != CANRCTRL_RSTAT_EMPTY)
- {
- pCAN->ID.u8[3] = CAN1_ReadRBUF(0); //从RBUF中读取ID
- pCAN->ID.u8[2] = CAN1_ReadRBUF(1);
- pCAN->ID.u8[1] = CAN1_ReadRBUF(2);
- pCAN->ID.u8[0] = CAN1_ReadRBUF(3);
- pCAN->ID.u32 &= 0x1FFFFFFFUL;
-
- pCAN->CTRL.u8 = CAN1_ReadRBUF(4); //从RBUF中读取帧控制字
- pCAN->CTRL2.u8 = CAN1_ReadRBUF(5);
-
- pCAN->CYCLE.u8[1] = CAN1_ReadRBUF(6); //从RBUF中读取TTCAN周期字
- pCAN->CYCLE.u8[0] = CAN1_ReadRBUF(7);
-
- cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
-
- for (i = 0; i < cnt; i++)
- pCAN->pu8Data[i] = CAN1_ReadRBUF(8 + i); //从RBUF中读取帧数据
-
- CAN1_ReleaseRBUF(); //释放RBUF,准备读取下一个SLOT
-
- pCAN++;
- n++; //帧个数+1
- }
-
- return n; //返回帧个数
- }
-
- ////////////////////////////////////////
- // CAN2初始化函数
- // 入口参数: 无
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN2_Init(void)
- {
- #define CAN2_SBT_BAUDRATE (500UL) //SYSCLK/(S_PRESC+1)/((S_SEG1+2)+(S_SEG2+1))
- #define CAN2_SBT_SJW (0)
- #define CAN2_SBT_PRESC (1)
- #define CAN2_SBT_SEG1 (31)
- #define CAN2_SBT_SEG2 (14)
-
- #define CAN2_FBT_BAUDRATE (500UL) //SYSCLK/(F_PRESC+1)/((F_SEG1+2)+(F_SEG2+1))
- #define CAN2_FBT_SJW (0)
- #define CAN2_FBT_PRESC (1)
- #define CAN2_FBT_SEG1 (31)
- #define CAN2_FBT_SEG2 (14)
-
- CAN16_SetEndianMode(CAN16_LE); //设置CAN的大小端模式
- CAN2_Enable(); //使能CAN2功能
-
- CAN2_SwitchP525323(); //选择CAN2数据口: CAN2RX (P52), CAN2TX (P53), CANSTB(P2.3)
- CAN2_DisableStandbyPin(); //禁止CAN2STB管脚功能
-
- CAN2_EnterResetMode(); //进入复位模式,开始对CAN2模块进行初始化
- CAN2_NormalMode(); //CAN2模块为普通工作模式
- CAN2_FD_BoschMode(); //Bosch CAN-FD模式
-
- CAN2_SetSBT_SEG1(CAN2_SBT_SEG1); //设置慢速波特率同步采样段1
- CAN2_SetSBT_SEG2(CAN2_SBT_SEG2); //设置慢速波特率同步采样段2
- CAN2_SetSBT_SJW(CAN2_SBT_SJW); //设置慢速波特率重新同步跳跃宽度
- CAN2_SetSBT_PRESC(CAN2_SBT_PRESC); //设置慢速波特率分频系数
-
- CAN2_SetFBT_SEG1(CAN2_FBT_SEG1); //设置快速波特率同步采样段1
- CAN2_SetFBT_SEG2(CAN2_FBT_SEG2); //设置快速波特率同步采样段2
- CAN2_SetFBT_SJW(CAN2_FBT_SJW); //设置快速波特率重新同步跳跃宽度
- CAN2_SetFBT_PRESC(CAN2_FBT_PRESC); //设置快速波特率分频系数
-
- CAN2_RBStoreCorrectData(); //仅存储接收正确的数据
- CAN2_OVFSaveNewest(); //RB上溢时,保存最新接收的数据(最早接收数据被覆盖)
- CAN2_SetAFWLimit(1); //设置RB将满警告阈值
- CAN2_SetEWLimit_8(); //设置RB错误警告编程值((EWL+1)*8)
- CAN2_DisableSelfACK(); //关闭自动应答
-
- CAN2_PTBAutoRetransmit(); //PTB自动重传
- CAN2_STBAutoRetransmit(); //STB自动重传
- CAN2_STBPriorityFIFO(); //STB依据FIFO写入的先后顺序发送
- CAN2_DisableTDC(); //关闭发送延迟补偿功能
-
- CAN2_EnableReceiveInt(); //使能接收中断
- CAN2_EnableRBOverrunInt(); //使能接收溢出中断
- CAN2_EnableRBFIFOFullInt(); //使能接收缓冲区满中断
- CAN2_EnableRBAlmostFullInt(); //使能接收缓冲区将满中断
- CAN2_EnablePTBTransmitInt(); //使能PTB发送中断
- CAN2_EnableSTBTransmitInt(); //使能STB发送中断
- CAN2_EnableErrorInt(); //使能错误中断
- CAN2_EnableErrorPassiveInt(); //使能被动错误中断
- CAN2_EnableArbitrateLostInt(); //使能仲裁丢失中断
- CAN2_EnableBusErrorInt(); //使能总线错误中断
- CAN2_SetIntPriority(0); //设置中断为最低优先级
- CAN2_EnableInt(); //使能CAN2中断
-
- CAN2_ClearFlags(0xff); //清除全部中断标志位
- CAN2_ClearErrorFlags(0xff); //清除全部错误中断标志位
- CAN2_ReleaseRBUF(); //清除ROV标志位
- CAN2_ExitResetMode(); //退出复位模式,
-
- //<<AICUBE_USER_CAN2_INITIAL_BEGIN>>
- // 在此添加用户初始化代码
- //<<AICUBE_USER_CAN2_INITIAL_END>>
- }
-
- ////////////////////////////////////////
- // CAN2发送数据帧函数
- // 入口参数: *pCAN: (发送CAN消息缓冲区)
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN2_SendData(CAN_TxDataDef *pCAN)
- {
- uint8_t cnt, i;
-
- CAN2_WriteTBUF(0, pCAN->ID.u8[3]); //写ID到TBUF
- CAN2_WriteTBUF(1, pCAN->ID.u8[2]);
- CAN2_WriteTBUF(2, pCAN->ID.u8[1]);
- CAN2_WriteTBUF(3, pCAN->ID.u8[0]);
-
- CAN2_WriteTBUF(4, pCAN->CTRL.u8); //写帧控制字节到TBUF
-
- CAN2_WriteTBUF(5, pCAN->RSVD[0]);
- CAN2_WriteTBUF(6, pCAN->RSVD[1]);
- CAN2_WriteTBUF(7, pCAN->RSVD[2]);
-
- cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
-
- for (i = 0; i < cnt; i++)
- CAN2_WriteTBUF((8 + i), pCAN->pu8Data[i]); //写帧数据到TBUF
-
- CAN2_SelectNextTBSlot(); //指向下一个STB SLOT
- #if (TRANS_MODE == PTB_MODE)
- CAN2_TransmitPTB(); //使能PTB发送
- #else
- CAN2_TransmitAllSTB(); //使能STB发送
- #endif
- }
-
- ////////////////////////////////////////
- // CAN2接收数据帧函数
- // 入口参数: *pCAN: (接收CAN消息缓冲区)
- // 函数返回: 帧个数
- ////////////////////////////////////////
- uint8_t CAN2_ReceiveData(CAN_RxDataDef *pCAN)
- {
- uint8_t cnt, i;
- uint8_t n = 0;
-
- while (CAN2_CheckRBStatus() != CANRCTRL_RSTAT_EMPTY)
- {
- pCAN->ID.u8[3] = CAN2_ReadRBUF(0); //从RBUF中读取ID
- pCAN->ID.u8[2] = CAN2_ReadRBUF(1);
- pCAN->ID.u8[1] = CAN2_ReadRBUF(2);
- pCAN->ID.u8[0] = CAN2_ReadRBUF(3);
- pCAN->ID.u32 &= 0x1FFFFFFFUL;
-
- pCAN->CTRL.u8 = CAN2_ReadRBUF(4); //从RBUF中读取帧控制字
- pCAN->CTRL2.u8 = CAN2_ReadRBUF(5);
-
- pCAN->CYCLE.u8[1] = CAN2_ReadRBUF(6); //从RBUF中读取TTCAN周期字
- pCAN->CYCLE.u8[0] = CAN2_ReadRBUF(7);
-
- cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
-
- for (i = 0; i < cnt; i++)
- pCAN->pu8Data[i] = CAN2_ReadRBUF(8 + i); //从RBUF中读取帧数据
-
- CAN2_ReleaseRBUF(); //释放RBUF,准备读取下一个SLOT
-
- pCAN++;
- n++; //帧个数+1
- }
-
- return n; //返回帧个数
- }
-
-
- ////////////////////////////////////////
- // 初始化CAN消息帧数据结构
- // 入口参数: *pCAN: (CAN消息缓冲区)
- // *pData: (待发送的消息数据)
- // u8DLC: (数据的DLC值
- // !!! 注意:对于CAN-FD消息,当数据长度大于8时,DLC的值与
- // 实际的数据长度不一致,建议使用CAN_DLC_8、CAN_DLC_64
- // 等格式的宏定义当作参数传递给u8DLC)
- // u32ID: (帧ID)
- // bCANFD: (0:CAN2.0 1:CAN-FD)
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN_InitFrame(CAN_TxDataDef *pCAN, uint8_t *pData, uint8_t u8DLC, uint32_t u32ID, BOOL bCANFD)
- {
- uint8_t cnt;
- uint8_t i;
-
- pCAN->ID.u32 = u32ID; //设置帧ID
- pCAN->CTRL.u8 = 0; //初始化控制字
- if (!bCANFD) //判断时CAN2.0帧还是CAN-FD帧
- {
- pCAN->CTRL.b.FDF = 0; //0:CAN2.0帧
- pCAN->CTRL.b.BRS = 0; //CAN2.0帧波特率不可变,必须设置为0
- pCAN->CTRL.b.DLC = (u8DLC & 0x0f); //设置帧数据长度参数,CAN2.0不可大于8
- }
- else
- {
- pCAN->CTRL.b.FDF = 1; //1:CAN-FD帧
- pCAN->CTRL.b.BRS = 1; //0:整帧为低速波特率; 1:数据和CRC为快速波特率(CAN-FD可设置为0或者1)
- pCAN->CTRL.b.DLC = (u8DLC & 0x0f); //设置帧数据长度参数
- }
- pCAN->CTRL.b.IDE = 0; //0:标准帧; 1:扩展帧
- pCAN->CTRL.b.RTR = 0; //0:数据帧; 1:远程帧
-
- cnt = CAN_DLC_MAP[pCAN->CTRL.b.FDF][pCAN->CTRL.b.DLC]; //获取数据长度
-
- for (i = 0; i < cnt; i++)
- pCAN->pu8Data[i] = *pData++;
- }
-
-
- ////////////////////////////////////////
- // CAN1中断服务程序
- // 入口参数: 无
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN1_ISR(void) interrupt CAN1_VECTOR
- {
- //<<AICUBE_USER_CAN1_ISR_CODE1_BEGIN>>
- // 在此添加中断函数用户代码
- uint8_t isr;
- uint8_t err;
-
- isr = CAN1_ReadIntStatus(); //读取中断标志位
- CAN1_ClearFlags(isr); //写1清除中断标志位
- err = CAN1_ReadErrorStatus(); //读取错误标志位
- CAN1_ClearErrorFlags(err); //写1清除错误标志位
-
- if (CAN1_CheckReceive(isr)) //判断接收中断标志位
- {
- }
- if (CAN1_CheckRBOverrun(isr)) //判断接收溢出中断标志位
- {
- }
- if (CAN1_CheckRBFIFOFull(isr)) //判断接收缓冲区满中断标志位
- {
- }
- if (CAN1_CheckRBAlmostFull(isr)) //判断接收缓冲区将满中断标志位
- {
- }
- if (CAN1_CheckPTBTransmit(isr)) //判断PTB发送中断标志位
- {
- }
- if (CAN1_CheckSTBTransmit(isr)) //判断STB发送中断标志位
- {
- }
- if (CAN1_CheckError(isr)) //判断错误中断标志位
- {
- }
- if (CAN1_CheckArbitrateLost(err)) //判断仲裁丢失中断标志位
- {
- }
- if (CAN1_CheckErrorPassive(err)) //判断被动错误中断标志位
- {
- }
- if (CAN1_CheckBusError(err)) //判断总线错误中断标志位
- {
- }
-
- if (CAN1_CheckRBUFOverflow()) //判断接收BUF上溢标志位
- {
- CAN1_ReleaseRBUF(); //写1到RREL来清除ROV只读标志位
- }
- //<<AICUBE_USER_CAN1_ISR_CODE1_END>>
- }
-
- ////////////////////////////////////////
- // CAN2中断服务程序
- // 入口参数: 无
- // 函数返回: 无
- ////////////////////////////////////////
- void CAN2_ISR(void) interrupt CAN2_VECTOR
- {
- //<<AICUBE_USER_CAN2_ISR_CODE1_BEGIN>>
- // 在此添加中断函数用户代码
- uint8_t isr;
- uint8_t err;
-
- isr = CAN2_ReadIntStatus(); //读取中断标志位
- CAN2_ClearFlags(isr); //写1清除中断标志位
- err = CAN2_ReadErrorStatus(); //读取错误标志位
- CAN2_ClearErrorFlags(err); //写1清除错误标志位
-
- if (CAN2_CheckReceive(isr)) //判断接收中断标志位
- {
- }
- if (CAN2_CheckRBOverrun(isr)) //判断接收溢出中断标志位
- {
- }
- if (CAN2_CheckRBFIFOFull(isr)) //判断接收缓冲区满中断标志位
- {
- }
- if (CAN2_CheckRBAlmostFull(isr)) //判断接收缓冲区将满中断标志位
- {
- }
- if (CAN2_CheckPTBTransmit(isr)) //判断PTB发送中断标志位
- {
- }
- if (CAN2_CheckSTBTransmit(isr)) //判断STB发送中断标志位
- {
- }
- if (CAN2_CheckError(isr)) //判断错误中断标志位
- {
- }
- if (CAN2_CheckArbitrateLost(err)) //判断仲裁丢失中断标志位
- {
- }
- if (CAN2_CheckErrorPassive(err)) //判断被动错误中断标志位
- {
- }
- if (CAN2_CheckBusError(err)) //判断总线错误中断标志位
- {
- }
-
- if (CAN2_CheckRBUFOverflow()) //判断接收BUF上溢标志位
- {
- CAN2_ReleaseRBUF(); //写1到RREL来清除ROV只读标志位
- }
- //<<AICUBE_USER_CAN2_ISR_CODE1_END>>
- }
-
-
- //<<AICUBE_USER_FUNCTION_IMPLEMENT_BEGIN>>
- // 在此添加用户函数实现代码
- //<<AICUBE_USER_FUNCTION_IMPLEMENT_END>>
-
-
复制代码 我的版本是最新的:6.96T
|