/*******************************************************************************
* Function Name  : CAN1_RX1_IRQHandler
* Description    : This function handles CAN1 RX1 request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void CAN1_RX1_IRQHandler(void)
{ if(CAN_GetITStatus(CAN1,CAN_IT_FMP1)== SET)
  {
   // if(Bridge.CAN_State!= CAN_PROC_MSGINQUEUE && Bridge.CAN_State!= CAN_PROCESSING )
   //{
      CAN_Receive(CAN1, CAN_FIFO1, &Bridge.RxMessage1);
      CANpacket_receive=1; 
      Bridge.CAN_State=ChangeState_level_Busier(Bridge.CAN_State);
      //CAN_ClearITPendingBit(CAN1, CAN_IT_FMP1) //Don't need this line the intterruption is cleared automatically when read
   /* }
    else 
    {
      Bridge.CAN_Err.ErrorId=CAN_FULLQUEUE;
      Bridge.CAN_Err.ErrorData= 0;
    }*/
  }
   else
   {    /*This case has to be treated as an important problem of using the multiport communication: The priority of the CAN communication have to be modified after tests or make an automated algorithm that (numerically ) */
        if(CAN_GetITStatus(CAN1,CAN_FLAG_FF1)== SET)
        {
          //CAN_ClearITPendingBit( CAN1,CAN_FLAG_FF1);
          Bridge.CAN_Err.ErrorId=CAN_OVERFLOW;
          Bridge.CAN_Err.ErrorData=CAN_MessagePending( CAN1,CAN_FIFO1);
        }
        /*Interrupt when error iss reported by the CAN BUS controller*/
        else if(CAN_GetITStatus(CAN1,CAN_IT_ERR)== SET)
            {
              Bridge.CAN_Err.ErrorId=CAN_RCVERR;
              Bridge.CAN_Err.ErrorData=CAN_GetLastErrorCode(CAN1);            
            }
    }
}
Example #2
0
/**
 * Hardware error ISR for CAN
 *
 * @param unit CAN controller number( from 0 )
 */
static void Can_ErrIsr( int unit ) {
  CAN_HW_t *canHw = GetController(unit);
  Can_UnitType *canUnit = CAN_GET_PRIVATE_DATA(unit);
  Can_Arc_ErrorType err;
  err.R = 0;

  // Check wake up
  if(SET == CAN_GetITStatus(canHw, CAN_IT_WKU)){
	  Can_WakeIsr(unit);
	  CAN_ClearITPendingBit(canHw, CAN_IT_WKU);
  }

  if(SET == CAN_GetITStatus(canHw, CAN_IT_BOF)){
	canUnit->stats.boffCnt++;
	CanIf_ControllerBusOff(unit);
	Can_SetControllerMode(unit, CAN_T_STOP); // CANIF272

	Can_AbortTx( canHw, canUnit ); // CANIF273

	// Clear int
	CAN_ClearITPendingBit(canHw, CAN_IT_BOF);
  }

  if (err.R != 0)
  {
	  CanIf_Arc_Error( unit, err );
  }
}
Example #3
0
void CAN1_RX0_IRQHandler(void) {
	// Check the cause of the interrupt
	if(CAN_GetITStatus(CAN1, CAN_IT_FMP0) == SET) { // Pending message in Fifo 0
		CAN_Receive(CAN1, CAN_FIFO0, &CAN_RxStruct);
		xSemaphoreGive(CANReceiveSemaphore);
	}
	else if(CAN_GetITStatus(CAN1, CAN_IT_FF0) == SET) { // Fifo 0 is full
	}
	else if(CAN_GetITStatus(CAN1, CAN_IT_FOV0) == SET) { // Fifo 0 overrun
	}
}
Example #4
0
void USB_HP_CAN1_TX_IRQHandler(void) //CAN TX
{//发送成功进入中断
    if (CAN_GetITStatus(CAN1,CAN_IT_TME)!= RESET) 
    {
	   CAN_ClearITPendingBit(CAN1,CAN_IT_TME);     
    }
}
Example #5
0
void CAN1_RX0_IRQHandler(void)
{
	if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)){//新しいメッセージを受信したら呼び出される
		CAN_Receive(CAN1, CAN_FIFO0, &can_rx_flame);//受信
		GPIOD->BSRRL = GPIO_Pin_15;
		CAN_Node_Check(&can_rx_flame);
	}
}
Example #6
0
//↑今までの割込み関数
//↓今回変更した割込み関数
void CAN1_TX_IRQHandler(void)
{
	if (CAN_GetITStatus(CAN1,CAN_IT_TME)){//メールボックスが空になったら呼び出される 何も送ってない状態では呼び出されない
		GPIOD->BSRRL = GPIO_Pin_14;
		//CAN_Transmit_List_Stack(1,&can_tx_flame);//can_tx_flameに次に送るデータを格納する
		CAN_Transmit(CAN1, &can_tx_flame);//送信
		CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
	}
}
Example #7
0
void CAN1_RX0_IRQHandler(void)
{
    CanRxMsg RxMessage;
    //CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
    //myRxMessage1 =RxMessage;
		if(SET == CAN_GetITStatus(CAN1, CAN_IT_FF0))
		{
			 CAN_ClearITPendingBit(CAN1, CAN_IT_FF0);
		}
		else if(SET == CAN_GetITStatus(CAN1, CAN_IT_FOV0))
		{
			 CAN_ClearITPendingBit(CAN1, CAN_IT_FOV0);
		}
		else
		{
			 CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
			 CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
			 FIFO_PUT_ONE(CAN1_RxFifo, RxMessage); 
		}
}
Example #8
0
/*******************************************************************************
* Function Name  : CAN_RX0_CALLBACK
* Description    : CAN0接收的回调函数
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void CAN_RX0_CALLBACK(void)
{
    if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET) 
	{
        CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
        g_CAN_Rx_Provider++;
        if(g_CAN_Rx_Provider >= CAN_RX_BUFFER_SIZE)
            g_CAN_Rx_Provider = 0;
        CAN_Receive(CAN1, CAN_FIFO0, &g_CAN_Rx_message[g_CAN_Rx_Provider]);
    }
}
Example #9
0
void CAN1_RX0_IRQHandler(void)
{
    CanRxMsg rx_message;

    if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)
    {
        CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
        CAN_Receive(CAN1, CAN_FIFO0, &rx_message);
        if(can1_rh)
            can1_rh(&rx_message);
    }
}
Example #10
0
void CAN1_RX0_IRQHandler(void)
{
	CanRxMsg RxMessage;
	static portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
	if (CAN_GetITStatus (CAN1, CAN_IT_FMP0))
	{
		CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
		if ((RxMessage.StdId == CAN_SLAVE_STD_ID) && (RxMessage.IDE == CAN_ID_STD) && (RxMessage.DLC == CAN_DATA_LENGTH))
		xQueueSendToBackFromISR(CanRxQueue, &RxMessage, &xHigherPriorityTaskWoken);
	}
	portEND_SWITCHING_ISR(xHigherPriorityTaskWoken);
}
Example #11
0
// CAN Receive
void CAN1_RX0_IRQHandler (void)
{
	__disable_irq();
	if (CAN_GetITStatus(CAN1,CAN_IT_FMP0) != RESET)
	{
		CANparseMessage(CAN_FIFO0);
		RxCAN.FIFO0 = SET;
		GPIOA->ODR ^= GPIO_Pin_5;
		
	}
	__enable_irq();
}
Example #12
0
//CAN1接收中断调用函数
void DST_CAN_1::CAN1_RX0_IRQHandler_Fun(void)
{
	if(CAN_GetITStatus(CAN1,CAN_IT_FMP0)!= RESET)
	{
		CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
		CAN_Receive(CAN1, CAN_FIFO0, &can1_rx_msg);
		/********HG900 6025数据接收********/
		_data_pro.HG900_6025_DataPro(&can1_rx_msg);//CAN1云台数据处理
		//test fun
		ws(&can1_rx_msg);
	}
}
Example #13
0
void USB_LP_CAN1_RX0_IRQHandler(void)
#endif
{
  if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) != RESET)
  {
    STM_EVAL_LEDOn(LED7);
    CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);

    SendCanMsg(RxMessage);
    STM_EVAL_LEDOff(LED7);
  }
  else USB_Istr();
}
Example #14
0
File: main.c Project: kitaev/can
void USB_LP_CAN1_RX0_IRQHandler(void) {
    if (CAN_GetITStatus(CAN1, CAN_IT_FMP0) == RESET) {
        return;
    }
    CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
    //GPIO_ResetBits(GPIOA, GPIO_Pin_8);

    CanRxMsg message;
    while(CAN_MessagePending(CAN1, 0)) {
        CAN_Receive(CAN1, 0, &message);
    }

    if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_8) == Bit_SET) {
        GPIO_ResetBits(GPIOA, GPIO_Pin_8);
    } else {
        GPIO_SetBits(GPIOA, GPIO_Pin_8);
    }
}
Example #15
0
void USB_LP_CAN1_RX0_IRQHandler(void)
{
	if(CAN_GetITStatus(CAN1, CAN_IT_FMP0))
	{
		CAN_ClearITPendingBit(CAN1, CAN_IT_FMP0);
		
		CAN_Receive(CAN1, 0, &CanRxMsgStructure);
		
		for(countCAN = 0; countCAN < 8; countCAN++)
		{
			USART_SendData(USART2, CanRxMsgStructure.Data[countCAN]);
			while(!USART_GetFlagStatus(USART2, USART_FLAG_TC));
			USART_ClearFlag(USART2, USART_FLAG_TC);
		}
		
		autoSendFlag++;
		startFlag = 1;
	}
}
Example #16
0
void Can0_Interrupt(){
	if (CAN_GetITStatus(CAN1,CAN_IT_FMP0)){
		CAN_Receive(CAN1, CAN_FIFO0, &can_rx_flame);
		Can0::read((int)can_rx_flame.StdId,(int)can_rx_flame.DLC,can_rx_flame.Data);
	}
}
Example #17
0
void CAN1_TX_IRQHandler(void)
{
    int16_t id;
    int8_t code;
    uint32_t tsr;
    if (CAN_GetITStatus(CAN1, CAN_IT_TME) != RESET)
    {
        tsr = CAN1->TSR;
        if(can1_sh)
        {
            if((tsr & CAN_TSR_TME0) && (tsr & CAN_TSR_RQCP0))
            {
                CAN1->TSR = CAN_TSR_RQCP0;
                id = can1_mailbox0_id;
                if (tsr & CAN_TSR_TXOK0)
                    code = 0;
                else if (tsr & CAN_TSR_TERR0)
                    code = 1;
                else if (tsr & CAN_TSR_ALST0)
                    code = 3;
                else
                    code = 4;
            }
            else if((tsr & CAN_TSR_TME1) && (tsr & CAN_TSR_RQCP1))
            {
                CAN1->TSR = CAN_TSR_RQCP1;
                id = can1_mailbox1_id;
                if (tsr & CAN_TSR_TXOK1)
                    code = 0;
                else if (tsr & CAN_TSR_TERR1)
                    code = 1;
                else if (tsr & CAN_TSR_ALST1)
                    code = 3;
                else
                    code = 4;
            }
            else if((tsr & CAN_TSR_TME2) && (tsr & CAN_TSR_RQCP2))
            {
                CAN1->TSR = CAN_TSR_RQCP2;
                id = can1_mailbox2_id;
                if (tsr & CAN_TSR_TXOK2)
                    code = 0;
                else if (tsr & CAN_TSR_TERR2)
                    code = 1;
                else if (tsr & CAN_TSR_ALST2)
                    code = 3;
                else
                    code = 4;
            }
            else
            {
                id = -1;
            }

            if(id >= 0)
                can1_sh(id, code);
        }


        if(can1_mutex_transmit == 0 && can1_mutex_queue == 0 && (can1_pq_full == 1 || can1_pq_end != can1_pq_start))
        {
            can1_mutex_queue = 1;
            CAN1_Transmit(can1_pq[can1_pq_start].id, can1_pq[can1_pq_start].addr, can1_pq[can1_pq_start].data, can1_pq[can1_pq_start].size);
            can1_pq_full = 0;
            can1_pq_start = (can1_pq_start + 1) % CAN1_PACKET_QUEUE_SIZE;
            can1_mutex_queue = 0;
        }
    }
}
/*************************************************************************
                          CAN2_RX0_IRQHandler
���������������ǡ���������CAN���ݽ����ж�
*************************************************************************/
void CAN2_RX0_IRQHandler(void)
{
    CanRxMsg rx_message;
    if (CAN_GetITStatus(CAN2,CAN_IT_FMP0)!= RESET) 
    {
       CAN_ClearITPendingBit(CAN2, CAN_IT_FMP0);
       CAN_Receive(CAN2, CAN_FIFO0, &rx_message);
       
       //��������������
       if(rx_message.StdId == 0x401)
        { 
            gyro_ok_flag = 1;
            temp_yaw_angle = (int32_t)(rx_message.Data[0]<<24)|(int32_t)(rx_message.Data[1]<<16) 
            | (int32_t)(rx_message.Data[2]<<8) | (int32_t)(rx_message.Data[3]);
            
            last_yaw_angle = this_yaw_angle;
            this_yaw_angle = -((float)temp_yaw_angle*0.01);            
        }
        
        //ң���� ���  ��̨ͨ��
        if(rx_message.StdId == 0x402)
        { 
            temp_yaw = (uint16_t)(rx_message.Data[0]<<8)|(uint16_t)(rx_message.Data[1]);
            temp_pitch = (uint16_t)(rx_message.Data[2]<<8)|(uint16_t)(rx_message.Data[3]);
            shooting_flag = (uint8_t)rx_message.Data[4];   
			      mode_flag = (uint8_t)rx_message.Data[6];//S2 ����
            
            //for mouse            
            if(shooting_flag == 1)				//cyq:��ǹ
            {	
							  if(ShootFlag == 1)
								{						
										Motor_PWM_Set(MOTOR_NUM1,-1000);	
									  ShootFlag=0;
								}                  
            }
            else 
            {	      
								if(ShootFlag == 0)
								{   
										ShootFlag=1;
								}              					 
            }
            if (mode_flag == 1)
            {
                target_pitch_angle += (temp_pitch - 1024)/66.0;//ң��
                target_yaw_angle += (temp_yaw - 1024)/600.0 ;//cyq                                
            }
            else
            {
                target_pitch_angle -= (temp_pitch - 1024)/10.0;//cyq �������
                target_yaw_angle += (temp_yaw - 1024)/10.0 ;//cyq:����µij���
            }
            if(target_pitch_angle > pitch_max)
            {
                target_pitch_angle = pitch_max;
            }
            else if(target_pitch_angle < -pitch_max)
            {
                target_pitch_angle = -pitch_max;
            }
        }  
    }
}