求助关于LPC17xx系列单片机CAN总线问题

2019-03-25 20:05发布

关于can的自接收问题 查阅文档时看到一句话:
当产生自接收请求时,如果验收滤波器被设置成相应的标识符,则报文被发送,同时被接收,一个接收和发送中断将指示出正确的自接收。


不是很理解这句话


后面再LPC17XX的自接收例程中,发现代码中开启了两个中断:
        //Enable Interrupt
        CAN_IRQCmd(LPC_CAN1, CANINT_RIE, ENABLE);
        CAN_IRQCmd(LPC_CAN1, CANINT_TIE1, ENABLE);



不明白为什么要开发送中断,中断服务函数里也没有和发送中断有关的内容:
void CAN_IRQHandler()
{

        uint8_t IntStatus;
//        uint32_t data1;
        /* Get CAN status */
        IntStatus = CAN_GetCTRLStatus(LPC_CAN1, CANCTRL_STS);
        //check receive buffer status
        if((IntStatus>>0)&0x01)
        {
                CAN_ReceiveMsg(LPC_CAN1,&RXMsg);
                _DBG_("Received buffer:");
                PrintMessage(&RXMsg);
                //Validate received and transmited message
                if(Check_Message(&TXMsg, &RXMsg))
                        _DBG_("Self test is SUCCESSFUL!!!");
                else
                        _DBG_("Self test is FAIL!!!");
                                       
                FIO_ByteSetValue(1, 3, 1<<4);
                delay();
                FIO_ByteClearValue(1, 3, 1<<4);
                delay();       
               
        }
}

还有就是,不知道为什么不能给can发送函数加个while循环让它不停地发送数据:
int c_entry(void) { /* Main Program */

        /* Initialize debug via UART0
         * – 115200bps
         * – 8 data bit
         * – No parity
         * – 1 stop bit
         * – No flow control
         */
        debug_frmwrk_init();
        print_menu();

        //FIO_ByteSetDir(1, 3, 1<<4, 1);
                               
        /* Initialize CAN1 peripheral
         * Note: Self-test mode doesn't require pin selection
         */
        CAN_Init(LPC_CAN1, 125000);

        //Enable self-test mode
        CAN_ModeConfig(LPC_CAN1, CAN_SELFTEST_MODE, ENABLE);

        //Enable Interrupt
        CAN_IRQCmd(LPC_CAN1, CANINT_RIE, ENABLE);
        CAN_IRQCmd(LPC_CAN1, CANINT_TIE1, ENABLE);

        //Enable CAN Interrupt
        NVIC_EnableIRQ(CAN_IRQn);
        CAN_SetAFMode(LPC_CANAF,CAN_AccBP);
        CAN_InitMessage();
        _DBG_("Transmitted buffer:");
        PrintMessage(&TXMsg);

        /** To test Bypass Mode: we send infinite messages to CAN2 and check
         * receive process via COM1
         */         

        CAN_SendMsg(LPC_CAN1, &TXMsg);
        LPC_CAN1->CMR |=(1<<4); //Self Reception Request
       
        while (1);
}











此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。