📄 stm32f10x_can.c
字号:
return MessagePending;
}
/*******************************************************************************
* 函数名称: CAN_Receive
* 功能描述: 接收一个报文.
* 输入参数: FIFO number: 接收FIFO的编号,CANFIFO0或CANFIFO1.
* 输出参数: RxMessage: 指向一个包括CAN ID,CAN DLC和CAN数据的结构体。
* 返回参数: 无.
*******************************************************************************/
void CAN_Receive(u8 FIFONumber, CanRxMsg* RxMessage)
{
/* Check the parameters [检查参数]*/
assert_param(IS_CAN_FIFO(FIFONumber));
/* Get the Id [取得Id]*/
RxMessage->IDE = (u8)0x04 & CAN->sFIFOMailBox[FIFONumber].RIR;
if (RxMessage->IDE == CAN_ID_STD)
{
RxMessage->StdId = (u32)0x000007FF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 21);
}
else
{
RxMessage->ExtId = (u32)0x1FFFFFFF & (CAN->sFIFOMailBox[FIFONumber].RIR >> 3);
}
RxMessage->RTR = (u8)0x02 & CAN->sFIFOMailBox[FIFONumber].RIR;
/* Get the DLC [取得DLC]*/
RxMessage->DLC = (u8)0x0F & CAN->sFIFOMailBox[FIFONumber].RDTR;
/* Get the FMI [取得FMI]*/
RxMessage->FMI = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDTR >> 8);
/* Get the data field [取得数据字段]*/
RxMessage->Data[0] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDLR;
RxMessage->Data[1] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 8);
RxMessage->Data[2] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 16);
RxMessage->Data[3] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDLR >> 24);
RxMessage->Data[4] = (u8)0xFF & CAN->sFIFOMailBox[FIFONumber].RDHR;
RxMessage->Data[5] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 8);
RxMessage->Data[6] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 16);
RxMessage->Data[7] = (u8)0xFF & (CAN->sFIFOMailBox[FIFONumber].RDHR >> 24);
/* Release the FIFO [释放FIFO]*/
CAN_FIFORelease(FIFONumber);
}
/*******************************************************************************
* 函数名称: CAN_Sleep
* 功能描述: 将CAN置于低功耗模式.
* 输入参数: 无.
* 输出参数: 无.
* 返回参数: CANSLEEPOK(如果进入睡眠)CANSLEEPFAILED(其他情况).
*******************************************************************************/
u8 CAN_Sleep(void)
{
u8 SleepStatus = 0;
/* Sleep mode entering request [进入睡眠模式请求]*/
CAN->MCR |= CAN_MCR_SLEEP;
SleepStatus = CANSLEEPOK;
/* Sleep mode status [睡眠模式状态]*/
if ((CAN->MCR&CAN_MCR_SLEEP) == 0)
{
/* Sleep mode not entered [进不去睡眠模式]*/
SleepStatus = CANSLEEPFAILED;
}
/* At this step, sleep mode status [在这步,睡眠模式状态]*/
return SleepStatus;
}
/*******************************************************************************
* 函数名称: CAN_WakeUp
* 功能描述: 唤醒CAN.
* 输入参数: 无.
* 输出参数: 无.
* 返回参数: CANWAKEUPOK(如果退出了睡眠模式)CANWAKEUPFAILED(其他情况).
*******************************************************************************/
u8 CAN_WakeUp(void)
{
u8 WakeUpStatus = 0;
/* Wake up request [唤醒请求]*/
CAN->MCR &= ~CAN_MCR_SLEEP;
WakeUpStatus = CANWAKEUPFAILED;
/* Sleep mode status [睡眠模式状态]*/
if ((CAN->MCR&CAN_MCR_SLEEP) == 0)
{
/* Sleep mode exited [退出睡眠模式]*/
WakeUpStatus = CANWAKEUPOK;
}
/* At this step, sleep mode status [在这步,睡眠模式状态]*/
return WakeUpStatus;
}
/*******************************************************************************
* 函数名称: CAN_GetFlagStatus
* 功能描述: 检查指定的CAN标志是否置位.
* 输入参数: CAN_FLAG: 指定要检查的标志.
* 这个参数可以是: CAN_FLAG_EWG, CAN_FLAG_EPV或CAN_FLAG_BOF.
* 输出参数: 无.
* 返回参数: CAN_FLAG的新状态(SET或RESET).
*******************************************************************************/
FlagStatus CAN_GetFlagStatus(u32 CAN_FLAG)
{
FlagStatus bitstatus = RESET;
/* Check the parameters [检查参数]*/
assert_param(IS_CAN_FLAG(CAN_FLAG));
/* Check the status of the specified CAN flag [检查指定的CAN标志状态]*/
if ((CAN->ESR & CAN_FLAG) != (u32)RESET)
{
/* CAN_FLAG is set [置位CAN_FLAG]*/
bitstatus = SET;
}
else
{
/* CAN_FLAG is reset [复位CAN_FLAG]*/
bitstatus = RESET;
}
/* Return the CAN_FLAG status [返回CAN_FLAG状态]*/
return bitstatus;
}
/*******************************************************************************
* 函数名称: CAN_ClearFlag
* 功能描述: 清除CAN挂起标志.
* 输入参数: CAN_FLAG: 指定需要清除的标志。
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_ClearFlag(u32 CAN_FLAG)
{
/* Check the parameters [检查参数]*/
assert_param(IS_CAN_FLAG(CAN_FLAG));
/* Clear the selected CAN flags [清除选择的CAN标志]*/
CAN->ESR &= ~CAN_FLAG;
}
/*******************************************************************************
* 函数名称: CAN_GetITStatus
* 功能描述: 检查指定的CAN中断是否发生.
* 输入参数: CAN_IT: CAN需要检查的中断源。
* 这个参数可以是: CAN_IT_RQCP0, CAN_IT_RQCP1, CAN_IT_RQCP2,
* CAN_IT_FF0, CAN_IT_FOV0, CAN_IT_FF1,
* CAN_IT_FOV1, CAN_IT_EWG, CAN_IT_EPV,
* CAN_IT_BOF, CAN_IT_WKU or CAN_IT_SLK.
* 输出参数: 无.
* 返回参数: CAN_IT的新状态(SET或RESET).
*******************************************************************************/
ITStatus CAN_GetITStatus(u32 CAN_IT)
{
ITStatus pendingbitstatus = RESET;
/* Check the parameters [检查参数]*/
assert_param(IS_CAN_ITStatus(CAN_IT));
switch (CAN_IT)
{
case CAN_IT_RQCP0:
pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP0);
break;
case CAN_IT_RQCP1:
pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP1);
break;
case CAN_IT_RQCP2:
pendingbitstatus = CheckITStatus(CAN->TSR, CAN_TSR_RQCP2);
break;
case CAN_IT_FF0:
pendingbitstatus = CheckITStatus(CAN->RF0R, CAN_RF0R_FULL0);
break;
case CAN_IT_FOV0:
pendingbitstatus = CheckITStatus(CAN->RF0R, CAN_RF0R_FOVR0);
break;
case CAN_IT_FF1:
pendingbitstatus = CheckITStatus(CAN->RF1R, CAN_RF1R_FULL1);
break;
case CAN_IT_FOV1:
pendingbitstatus = CheckITStatus(CAN->RF1R, CAN_RF1R_FOVR1);
break;
case CAN_IT_EWG:
pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_EWGF);
break;
case CAN_IT_EPV:
pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_EPVF);
break;
case CAN_IT_BOF:
pendingbitstatus = CheckITStatus(CAN->ESR, CAN_ESR_BOFF);
break;
case CAN_IT_SLK:
pendingbitstatus = CheckITStatus(CAN->MSR, CAN_MSR_SLAKI);
break;
case CAN_IT_WKU:
pendingbitstatus = CheckITStatus(CAN->MSR, CAN_MSR_WKUI);
break;
default :
pendingbitstatus = RESET;
break;
}
/* Return the CAN_IT status [返回CAN_IT状态]*/
return pendingbitstatus;
}
/*******************************************************************************
* 函数名称: CAN_ClearITPendingBit
* 功能描述: 清除CAN中断挂起位.
* 输入参数: CAN_IT: 指定需要清除的中断挂起位。
* 输出参数: 无.
* 返回参数: 无.
*******************************************************************************/
void CAN_ClearITPendingBit(u32 CAN_IT)
{
/* Check the parameters [检查参数]*/
assert_param(IS_CAN_ITStatus(CAN_IT));
switch (CAN_IT)
{
case CAN_IT_RQCP0:
CAN->TSR = CAN_TSR_RQCP0; /* rc_w1*/
break;
case CAN_IT_RQCP1:
CAN->TSR = CAN_TSR_RQCP1; /* rc_w1*/
break;
case CAN_IT_RQCP2:
CAN->TSR = CAN_TSR_RQCP2; /* rc_w1*/
break;
case CAN_IT_FF0:
CAN->RF0R = CAN_RF0R_FULL0; /* rc_w1*/
break;
case CAN_IT_FOV0:
CAN->RF0R = CAN_RF0R_FOVR0; /* rc_w1*/
break;
case CAN_IT_FF1:
CAN->RF1R = CAN_RF1R_FULL1; /* rc_w1*/
break;
case CAN_IT_FOV1:
CAN->RF1R = CAN_RF1R_FOVR1; /* rc_w1*/
break;
case CAN_IT_EWG:
CAN->ESR &= ~ CAN_ESR_EWGF; /* rw */
break;
case CAN_IT_EPV:
CAN->ESR &= ~ CAN_ESR_EPVF; /* rw */
break;
case CAN_IT_BOF:
CAN->ESR &= ~ CAN_ESR_BOFF; /* rw */
break;
case CAN_IT_WKU:
CAN->MSR = CAN_MSR_WKUI; /* rc_w1*/
break;
case CAN_IT_SLK:
CAN->MSR = CAN_MSR_SLAKI; /* rc_w1*/
break;
default :
break;
}
}
/*******************************************************************************
* 函数名称: CheckITStatus
* 功能描述: 检查CAN中断是否发生.
* 输入参数: (1)CAN_Reg: 要检查的指定的CAN中断寄存器.
* (2)It_Bit: 要检查的指定的中断源位.
* 输出参数: 无.
* 返回参数: CAN中断的新状态 (SET or RESET).
*******************************************************************************/
static ITStatus CheckITStatus(u32 CAN_Reg, u32 It_Bit)
{
ITStatus pendingbitstatus = RESET;
if ((CAN_Reg & It_Bit) != (u32)RESET)
{
/* CAN_IT is set [置位CAN_IT]*/
pendingbitstatus = SET;
}
else
{
/* CAN_IT is reset [复位CAN_IT]*/
pendingbitstatus = RESET;
}
return pendingbitstatus;
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -