2019-03-23 16:01发布
huo_hu 发表于 2017-12-14 11:07 这个只能自己设计了呀
huadao 发表于 2017-12-14 23:21 发送中的 CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记// 中断中的 CAN_ClearITPending ...
最多设置5个标签!
可否指点下 CAN 发送中断程序
/*---------------------------------------------------------------------------------------
//CAN1 发送数据//
----------------------------------------------------------------------------------------*/
int CAN_tx_msg(CanTxMsg TxMessage)
{
uint8_t TransmitMailbox = 0;
//OS_CPU_SR cpu_sr = 0;
TransmitMailbox = CAN_Transmit(CAN1, TxMessage);
if(CAN_NO_MB == TransmitMailbox)//没有提供空邮箱//
{
printf("tx can fail ");//打印邮箱错误//
return 0;
}
else
{
//OS_ENTER_CRITICAL();
CAN_msg_num[TransmitMailbox] = 1;//被使用的邮箱标记//
// OS_EXIT_CRITICAL();
}
CAN_ITConfig(CAN1, CAN_IT_TME, ENABLE);//被使用的邮箱标记//
return 1;
}
/*---------------------------------------------------------------------------------------
//CAN1 发送中断//
----------------------------------------------------------------------------------------*/
void USB_HP_CAN1_TX_IRQHandler(void)
{
if(CAN_msg_num[0])//发送邮箱0空中断//
{
if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP0))//发送邮箱空中断//
{
CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP0);//清除CANx的中断位//
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//发送邮箱空中断//
CAN_msg_num[0] = 0;
}
}
if(CAN_msg_num[1])//发送邮箱1空中断//
{
if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP1))//发送邮箱空中断//
{
CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP1);//清除CANx的中断位//
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//启用或禁用指定的CANx中断//
CAN_msg_num[1] = 0;
}
}
if(CAN_msg_num[2])//发送邮箱2空中断//
{
if(SET == CAN_GetITStatus(CAN1,CAN_IT_RQCP2))//发送邮箱空中断//
{
CAN_ClearITPendingBit(CAN1,CAN_IT_RQCP2);//清除CANx的中断位//
CAN_ITConfig(CAN1, CAN_IT_TME, DISABLE);//启用或禁用指定的CANx中断//
CAN_msg_num[2] = 0;
}
}
}
这段程序在网上看到的 怎么感觉3个邮箱和一个用法没区别,每个邮箱空的中断区分不开
#define CAN_IT_RQCP0 CAN_IT_TME
#define CAN_IT_RQCP1 CAN_IT_TME
#define CAN_IT_RQCP2 CAN_IT_TME
都是CAN_IT_TME
确实不是这么用的,之所以弄出三个缓冲区是因为不知道哪一段报文会先发送完成,所以每次发送前要检查三个缓冲的状态,找一个空的发送,所以关键是那个发送函数。没有看到。
接收端也不能假设先发送的就会先收到,特别是在can总线带宽拥挤的时候容易出问题。
一周热门 更多>