This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TM4C129 CAN通信,LOOPBACK模式好用,怎么样改成普通传输模式?

用LOOPBACK模式调通了,可是转不成普通的CAN接受发送模式,请问该如何修改?谢谢,代码如下:

void CANIntHandler(void)
{
uint32_t ulStatus;
// ͨ¹ýCANIntStatusº¯Êý¶ÁÈ¡ÖжϵÄ״̬
ulStatus = CANIntStatus(CAN1_BASE, CAN_INT_STS_CAUSE);
sprintf(send,"ulStatus1=%d \r\n",ulStatus);
UARTSend(send,strlen(send));
// Èç¹ûÊÇ¿ØÖÆÆ÷״̬Öжϣ¬Ôò˵Ã÷³öÏÖÁËijÖÖ´íÎó
if(ulStatus == CAN_INT_INTID_STATUS){
//¶ÁÈ¡CANÄ£¿éËù´¦µÄ״̬£¬²¢×Ô¶¯Çå³ýÖжÏ
sprintf(send,"ulStatus2=%d \r\n",ulStatus);
UARTSend(send,strlen(send));
ulStatus = CANStatusGet(CAN1_BASE, CAN_STS_CONTROL);
sprintf(send,"ulStatus3=%d \r\n",ulStatus);
UARTSend(send,strlen(send));
// ½«g_bErrFlagÖÃ1£¬±íʾÓдíÎó·¢Éú
g_bErrFlag = 1;
}
else if(ulStatus == 1)
{
INT_CNT_ST++;
// Êý¾Ý°ü·¢ËÍÒѾ­Íê³É£¬Çå³ýÖжÏ
sprintf(send,"ulStatus4=%d ST=%d \r\n",ulStatus,INT_CNT_ST);
UARTSend(send,strlen(send));
CANIntClear(CAN1_BASE, 1);
//·¢ËÍÍêÒ»¸öÊý¾Ý°ü£¬¼ÆÊýÆ÷g_ulMsgCount_TXÔö¼Ó
g_ulMsgCount_TX++;
// ·¢ËÍÒѾ­Íê³É£¬Çå³ýËùÓеĴíÎóÐÅÏ¢
g_bErrFlag = 0;
}
else if(ulStatus==2){
INT_CNT_RE++;
// Êý¾Ý°ü½ÓÊÕÒѾ­Íê³É£¬Çå³ýÖжÏ
CANIntClear(CAN1_BASE, 2);
sprintf(send,"ulStatus5=%d \r\n",ulStatus);
UARTSend(send,strlen(send));
// ½ÓÊÕÍêÒ»¸öÊý¾Ý°ü£¬¼ÆÊýÆ÷g_ulMsgCount_RXÔö¼Ó
g_ulMsgCount_RX++;
// ÉèÖÃFlag˵Ã÷½ÓÊÕµ½µÄÊý¾Ý°üÕýÔڵȴý´¦Àí£¬±ê־λÖÃλ
g_bRXFlag = 1;

// ·¢ËÍÒѾ­Íê³É£¬Çå³ýËùÓеĴíÎóÐÅÏ¢
g_bErrFlag = 0;
}
}


//// ÅäÖÃCANÄ£¿é£¬Ñ­»··¢ËÍCAN¸ñʽÊý¾Ý°ü²¢Í¨¹ýLOOPBACKģʽ½ÓÊÕ
//// ÔËÐйý³ÌÖеÄÐÅϢͨ¹ýUARTÏò¼ÆËã»ú»ú´«Êä

int main(void){
FPUEnable(); //ʹÄÜFPU
FPULazyStackingEnable();

// ¶¨ÒåCANµÄ·¢ËͺͽÓÊÕ¶ÔÏó
tCANMsgObject sCANMessage;

// ¶¨Òå·¢ËÍÊý¾Ý´æ´¢ÇøºÍ½ÓÊÕÊý¾Ý´æ´¢Çø
// unsigned int uIdx; // Ñ­»·ÏÔʾ±äÁ¿

uint8_t ucMsgData[4];

// uint8_t Datareceive[8];

// IntMasterEnable(); // ʹÄÜÖжÏ
// ÉèÖÃϵͳʱÖÓ
ui32SysClock = SysCtlClockFreqSet ( ( SYSCTL_XTAL_25MHZ |SYSCTL_OSC_MAIN |SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480), 120000000);

// ------------------------ configuration LED -----------------------------------------------
PinoutSet(false, false);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_1);
ROM_GPIOPinTypeGPIOOutput(GPIO_PORTN_BASE, GPIO_PIN_0);

//-------------------------------------------------------uart--------------------------------------------

ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);

GPIOPinConfigure(GPIO_PA0_U0RX);
GPIOPinConfigure(GPIO_PA1_U0TX);
ROM_GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);

//
// Configure the UART for 115,200, 8-N-1 operation.
//
ROM_UARTConfigSetExpClk(UART0_BASE, ui32SysClock, 115200,
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE |
UART_CONFIG_PAR_NONE));
//
// Enable the UART interrupt.
//
ROM_IntEnable(INT_UART0);
ROM_UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT);
sprintf(send,"init uart succes \r\n");
UARTSend(send,strlen(send));
//-------------------------------------------------------fin de uart--------------------------------------------

// ½ûÓÃÖжϣ¬ÔÚ½øÐÐÖжÏÅäÖÃʱҪ±£Ö¤ÖжÏû±»Ê¹ÓÃ
IntMasterDisable();
// CAN1ʹÓÃPBÒý½Å£¬Ê¹ÄÜGPION¶ÔÓ¦µÄʱÖÓ
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
// ʹÄÜCAN1Ä£¿éµÄʱÖÓÐźÅ
SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN1);
//½«PA0ºÍPA1Á½¸öÒý½ÅµÄ¹¦ÄÜÑ¡ÔñΪִÐÐCAN1Ä£¿éµÄ¹¦ÄÜ

GPIOPinConfigure(GPIO_PB0_CAN1RX);
GPIOPinConfigure(GPIO_PB1_CAN1TX);
// ¶ÔPA0ºÍPA1Á½¸öÒý½Å×öÓйØCAN¹¦ÄܵÄÅäÖÃ
GPIOPinTypeCAN(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1);
// CAN¿ØÖÆÆ÷µÄ³õʼ»¯
CANInit(CAN1_BASE);
// ÀûÓÃCANBitRateSetº¯Êý½«CANµÄ´«ÊäËÙÂÊÉèÖÃΪ1MHz
CANBitRateSet(CAN1_BASE, ui32SysClock, 1000000);

// ¼Ä´æÆ÷²Ù×÷£¬½«CAN1Ä£¿éÅäÖÃΪÔËÐÐÓÚLOOPBACKģʽ£¬Ö±½Ó²Ù×÷¼Ä´æÆ÷
HWREG(CAN1_BASE + CAN_O_CTL) = HWREG(CAN1_BASE + CAN_O_CTL) | CAN_CTL_TEST;
//HWREG(CAN1_BASE + CAN_O_TST) = HWREG(CAN1_BASE + CAN_O_TST) | CAN_TST_LBACK | CAN_TST_SILENT;
HWREG(CAN1_BASE + CAN_O_TST) = HWREG(CAN1_BASE + CAN_O_TST) | CAN_TST_LBACK;

//CAN_O_IF1CRQ = CAN_IF1CRQ_BUSY;
//ÉèÖÿÉÒÔÒýÆðCANÖжϵÄÖжÏÔ´
CANIntEnable(CAN1_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
// ʹÄÜCAN1Ä£¿é
CANEnable(CAN1_BASE);

// ʹÄÜCAN1Ä£¿éµÄÖжÏ
IntEnable(INT_CAN1);

//³õʼ»¯ÅäÖÃmessage object£¬¼´´ý·¢Ë͵ı¨ÎÄ
//ÅäÖúñ¨ÎĶÔÏóºóµ÷ÓÃCANMessageSetº¯Êý½øÐÐÉèÖ㬱¨ÎľͿÉÒÔ×Ô¶¯±»·¢ËͳöÈ¥

*(uint32_t *)ucMsgData = 3; // ÅäÖ÷¢Ë͵ÄÊý¾ÝΪ0
sCANMessage.ui32MsgID = 1; // ʹÓÃ1×÷Ϊ·¢ËÍID
sCANMessage.ui32MsgIDMask = 0; // ²»ÉèÖÃMASKÆÁ±Î
sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE; //ʹÄÜ·¢ËÍÖжÏ
sCANMessage.ui32MsgLen = sizeof(ucMsgData); //·¢ËÍÊý¾Ý°ü´óСΪ4¸ö×Ö½Ú
sCANMessage.pui8MsgData = ucMsgData; // Ö¸Ïò·¢ËÍÊý¾ÝµÄÖ¸Õë

// ³õʼ»¯½ÓÊÕ±¨ÎÄ£¬¿ÉÒÔ½ÓÊÕÈκÎIDµÄ±¨ÎĶÔÏó
srCANMessage.ui32MsgID = 1; // ½ÓÊÕIDλΪ0
srCANMessage.ui32MsgIDMask = 0; // ²»ÉèÆÁ±Î£¬½ÓÊÕËùÓж«Î÷
srCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; // ʹÄܽÓÊÕÖжϺÍID¹ýÂË
srCANMessage.ui32MsgLen = 8; // ÔÊÐí×î¶à8¸ö×Ö½ÚµÄÊý¾Ý
ROM_CANMessageSet(CAN1_BASE, 2 , &srCANMessage, MSG_OBJ_TYPE_RX); // ½«message object 2ÉèÖÃΪ½ÓÊÕ±¨ÎĶÔÏó

IntMasterEnable(); // ʹÄÜÖжÏ

// ·¢Ëͱ¨ÎÄÑ­»·£¬ÉèÖÃÿÃë·¢ËÍÒ»¸öÊý¾Ý°ü
while(1){
sprintf(send,"loop \r\n");
UARTSend(send,strlen(send));
//HWREG(CAN1_BASE + CAN_O_IF1CRQ) = HWREG(CAN1_BASE + CAN_O_IF1CRQ) | CAN_IF1CRQ_BUSY;
CANMessageSet_test(CAN1_BASE, 1, &sCANMessage, MSG_OBJ_TYPE_TX); //½«´ý·¢Ë͵ı¨ÎÄÅäÖõ½message object 1ÖнøÐз¢ËÍÖжÏ

LEDWrite(CLP_D1, 1);
SysCtlDelay(ui32SysClock / 10);
LEDWrite(CLP_D1, 0);
SysCtlDelay(ui32SysClock / 10);
sprintf(send,"send msg=%x \r\n",sCANMessage.pui8MsgData[0]);
UARTSend(send,strlen(send));
if(g_bErrFlag) // ͨ¹ýg_bErrFlag±äÁ¿²é¿´ÊÇ·ñ³ö´í
{
sprintf(send,"ErrFlag=%d \r\n",g_bErrFlag);
UARTSend(send,strlen(send));
g_bErrFlag = 1; // ÔÙ´ÎÖøö1°É
}
else{
// Èç¹ûûÓгö´í£¬Ôò¼Ç¼ÒѾ­·¢Ë͵ı¨ÎÄÊýÄ¿
g_ulMsgCount_TX = g_ulMsgCount_TX; // ×öÒ»´ÎÖظ´¼ÇÔØ
}

(*(uint32_t *)ucMsgData)++; // ÿ´Î·¢ËÍÍê±Ï£¬¶¼½«±¨ÎÄÖеÄÊý¾Ý¼Ó1

// ½ÓÊÕ±¨ÎijÌÐò£¬Í¨¹ýg_bRXFlagÅжÏÊÇ·ñÓÐÒѾ­½ÓÊÕµ½ÊÇÊý¾Ý°ü
sprintf(send,"g_bRXFlag=%d \r\n",g_bRXFlag);
UARTSend(send,strlen(send));
if (g_bRXFlag){
// ½¨Á¢Ö¸Ïò±¨ÎÄÊý¾ÝµÄ»º´æÇø
GPIOPinWrite(CLP_D2_PORT, CLP_D2_PIN, CLP_D2_PIN);
srCANMessage.pui8MsgData = ucrMsgData;
CANMessageGet(CAN1_BASE, 2 , &srCANMessage,0); // ½«message object2 ÖеÄÐÅÏ¢¶ÁÈ¡µ½srCANMessage½ÓÊÕ¶ÔÏóÖÐ
sprintf(send,"get msg=%x \r\n",srCANMessage.pui8MsgData[0]);
UARTSend(send,strlen(send));
g_bRXFlag=0; // ·½±ãÏÂÒ»´Î½ÓÊÕÖжϺóµÄ´¦Àí

if(srCANMessage.ui32Flags & MSG_OBJ_DATA_LOST){ // Èç¹û³öÏÖÊý¾Ý¶ªÊ§µÈ´íÎ󣬱ê־λÌá
DATA_LOST = 1;
}
}
}
}