请教一个问题,包是我写的基于TMS570ls12x的launchpad的一个简单的can1发送,在资料查明can1的RX和TX分别是J10的38和39孔,我用杜邦线与CANalyst-Ⅱ相连,如何用USB_CAN TOOL查看接收的数据,发现并没有预想的数据发送过来,请教各位大神帮我分析一下原因,谢谢~
自己尝试测试,分析仪没有问题,分析仪与USB_CAN TOOL连接也没有问题,请各位大神赐教test_can.rar
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.
请教一个问题,包是我写的基于TMS570ls12x的launchpad的一个简单的can1发送,在资料查明can1的RX和TX分别是J10的38和39孔,我用杜邦线与CANalyst-Ⅱ相连,如何用USB_CAN TOOL查看接收的数据,发现并没有预想的数据发送过来,请教各位大神帮我分析一下原因,谢谢~
自己尝试测试,分析仪没有问题,分析仪与USB_CAN TOOL连接也没有问题,请各位大神赐教test_can.rar
TMS570ls12x是有相关的CAN通信例程的,您可以参考下
/** @example example_canCommunication.c * This is an example which describes the steps to create an example application which * configures two can nodes 1 and 2 and starts a communication with a sample data chunk. * CAN 1 and CAN2 must be part of CAN network * * * @b Step @b 1: * * Create a new project. * * Navigate: -> File -> New -> Project * * @image html example_createProject.jpg "Figure: Create a new Project" * * @b Step @b 2: * * Configure driver code generation: * - Enable can driver * - Disable others * * Navigate: -> TMS570LSxx /RM4 -> Enable Drivers * * @image html can_enabledriver.JPG "Figure: Enable CAN Driver" * * @b Step @b 3: * * Configure CAN Baudrate: * * Navigate: -> TMS570LSxx /RM4 -> CAN * * @image html can1baud.JPG "Figure: CAN1 BaudRate Configuration" * @image html can2baud.JPG "Figure: CAN2 BaudRate Configuration" * * @b Step @b 4: * * Configure CAN MessageBox: * * - Configure CAN1 , MessageBox 1 -- Activate and Enable TX * - Configure CAN2 , MessageBox 1 -- Activate and Enable RX * * Navigate: -> TMS570LSxx /RM4 -> CAN * * @image html canCommunication1.JPG "Figure: CAN1 MBox Configuration" * @image html canCommunication2.JPG "Figure: CAN2 MBox Configuration" * * @b Step @b 5: * * Copy the source code below into your sys_main.c or replace sys_main.c with this file. * * The example file can also be found in the examples folder: ../HALCoGen/examples * * @note HALCoGen generates an empty main function in sys_main.c, * */ /* * Copyright (C) 2009-2015 Texas Instruments Incorporated - www.ti.com * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* USER CODE BEGIN (0) */ /* USER CODE END */ /* Include Files */ #include "sys_common.h" #include "system.h" /* USER CODE BEGIN (1) */ #include "can.h" /* Include ESM header file - types, definitions and function declarations for system driver */ #include "esm.h" #define D_SIZE 9 uint8 tx_data[D_SIZE] = {'H','E','R','C','U','L','E','S','\0'}; uint8 rx_data[D_SIZE] = {0}; uint32 error = 0; uint32 checkPackets(uint8 *src_packet,uint8 *dst_packet,uint32 psize); /* USER CODE END */ /** @fn void main(void) * @brief Application main function * */ /* USER CODE BEGIN (2) */ /* USER CODE END */ void main(void) { /* USER CODE BEGIN (3) */ /* initialize can 1 and 2 */ canInit(); /* can1 -> can2 */ /* transmit on can1 */ canTransmit(canREG1, canMESSAGE_BOX1, tx_data); /*... wait until message receive on can2 */ while(!canIsRxMessageArrived(canREG2, canMESSAGE_BOX1)); canGetData(canREG2, canMESSAGE_BOX1, rx_data); /* receive on can2 */ /* check received data patterns */ error = checkPackets(&tx_data[0],&rx_data[0],D_SIZE); /* ... run forever */ while(1); /* USER CODE END */ } /* USER CODE BEGIN (4) */ /** @fn checkPackets(uint8 *src_packet,uint8 *dst_packet,uint32 psize) * @brief check two buffers and report error * */ uint32 checkPackets(uint8 *src_packet,uint8 *dst_packet,uint32 psize) { uint32 err=0; uint32 cnt=psize; while(cnt--) { if((*src_packet++) != (*dst_packet++)) { err++; /* data error */ } } return (err); } /* USER CODE END */
/** @example example_canIntCommunication.c * This example code configures two CAN nodes and emulates a data transfer * from CAN1 to CAN2. * * node1: CAN1 [MSG BOX 1 (ID1)]-> TX * node2: CAN2 [MSG BOX 1 (ID1)]<- RX * * @b Step @b 1: * * Create a new project. * * Navigate: -> File -> New -> Project * * @image html example_createProject.jpg "Figure: Create a new Project" * * @b Step @b 2: * * Configure driver code generation: * - Enable CAN driver * - Disable others * * Navigate: -> TMS570LSxx /RM4 -> Enable Drivers * * @image html can_enabledriver.jpg "Figure: CAN 1,2 Driver Enable" * * @b Step @b 3: * * Configure CAN Message Box: * - Configure CAN1 Message box 1 as transmit * Navigate: -> TMS570LSxx /RM4 -> CAN * * @image html can1box.jpg "Figure: CAN1 MBox Configuration" * * - Configure CAN2 Message box 1 as receive * * @image html can2box.jpg "Figure: CAN2 MBox Configuration" * * - Enable CAN1 High level interrupt and CAN2 High level interrupt * * @b Step @b 4: * * Enable CAN interrupts in VIM: * * Navigate: -> TMS570LSxx /RM4 -> VIM * * @image html can1_Int.jpg "Figure: VIM Configuration" * @image html can2_Int.jpg "Figure: VIM Configuration" * * @b Step @b 5: * * Copy the source code below into your sys_main.c (or) replace sys_main.c with this file. * Copy dma.c and dma.h into your application. * * Execution: * The CAN1 and CAN2 communication line needs to be connected on to the live CAN bus. * * The example file can also be found in the examples folder: ../HALCoGen/examples * * @note HALCoGen generates an enpty main function in sys_main.c. * */ /* * Copyright (C) 2009-2015 Texas Instruments Incorporated - www.ti.com * * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution. * * Neither the name of Texas Instruments Incorporated nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ /* USER CODE BEGIN (0) */ /* USER CODE END */ /* Include Files */ #include "sys_common.h" #include "system.h" /* USER CODE BEGIN (1) */ #include "can.h" #include "esm.h" #include "sys_core.h" #define D_COUNT 8 uint32 cnt=0, error =0, tx_done =0; uint8 tx_data[D_COUNT][8] = {0}; uint8 rx_data[D_COUNT][8] = {0}; uint8 *tx_ptr = &tx_data[0][0]; uint8 *rx_ptr = &rx_data[0][0]; uint8 *dptr=0; void dumpSomeData(); /* USER CODE END */ /** @fn void main(void) * @brief Application main function * */ /* USER CODE BEGIN (2) */ /* USER CODE END */ void main(void) { /* USER CODE BEGIN (3) */ /* enable irq interrupt in Cortex R4 */ _enable_interrupt_(); /** - writing a random data in RAM - to transmit */ dumpSomeData(); /** - configuring CAN1 MB1,Msg ID-1 to transmit and CAN2 MB1 to receive */ canInit(); /** - enabling error interrupts */ canEnableErrorNotification(canREG1); canEnableErrorNotification(canREG2); /** - starting transmission */ for(cnt=0;cnt<D_COUNT;cnt++) { canTransmit(canREG1, canMESSAGE_BOX1, tx_ptr); /* transmitting 8 different chunks 1 by 1 */ while(tx_done == 0){}; /* ... wait until transmit request is through */ tx_done=0; tx_ptr +=8; /* next chunk ...*/ } /** - check the received data with the one that was transmitted */ tx_ptr = &tx_data[0][0]; rx_ptr = &rx_data[0][0]; for(cnt=0;cnt<63;cnt++) { if(*tx_ptr++ != *rx_ptr++) { error++; /* data error */ } } while(1){}; /* wait forever after tx-rx complete. */ /* USER CODE END */ } /* USER CODE BEGIN (4) */ /* writing some data to ram */ void dumpSomeData() { uint32 tmp = 0x11; cnt = (D_COUNT*8)-1; dptr = &tx_data[0][0]; *dptr = tmp; while(cnt--) { tmp = *dptr++; *dptr = tmp + 0x11; } } /* can interrupt notification */ /* Note-You need to remove canMessageNotification from notification.c to avoid redefinition */ void canMessageNotification(canBASE_t *node, uint32 messageBox) { /* node 1 - transfer request */ if(node==canREG1) { tx_done=1; /* confirm transfer request */ } /* node 2 - receive complete */ if(node==canREG2) { while(!canIsRxMessageArrived(canREG2, canMESSAGE_BOX1)); canGetData(canREG2, canMESSAGE_BOX1, rx_ptr); /* copy to RAM */ rx_ptr +=8; } /* Note: since only message box 1 is used on both nodes we dont check it here.*/ } /* USER CODE END */
/** @example example_canIntCommunication.c* This example code configures two CAN nodes and emulates a data transfer* from CAN1 to CAN2.* * node1: CAN1 [MSG BOX 1 (ID1)]-> TX* node2: CAN2 [MSG BOX 1 (ID1)]<- RX* * @b Step @b 1:** Create a new project.** Navigate: -> File -> New -> Project** @image html example_createProject.jpg "Figure: Create a new Project"** @b Step @b 2:** Configure driver code generation: * - Enable CAN driver* - Disable others** Navigate: -> TMS570LSxx /RM4 -> Enable Drivers** @image html can_enabledriver.jpg "Figure: CAN 1,2 Driver Enable"** @b Step @b 3:** Configure CAN Message Box: * - Configure CAN1 Message box 1 as transmit* Navigate: -> TMS570LSxx /RM4 -> CAN** @image html can1box.jpg "Figure: CAN1 MBox Configuration"** - Configure CAN2 Message box 1 as receive** @image html can2box.jpg "Figure: CAN2 MBox Configuration"** - Enable CAN1 High level interrupt and CAN2 High level interrupt ** @b Step @b 4:** Enable CAN interrupts in VIM: ** Navigate: -> TMS570LSxx /RM4 -> VIM** @image html can1_Int.jpg "Figure: VIM Configuration"* @image html can2_Int.jpg "Figure: VIM Configuration"** @b Step @b 5:** Copy the source code below into your sys_main.c (or) replace sys_main.c with this file.* Copy dma.c and dma.h into your application.** Execution:* The CAN1 and CAN2 communication line needs to be connected on to the live CAN bus.* * The example file can also be found in the examples folder: ../HALCoGen/examples** @note HALCoGen generates an enpty main function in sys_main.c. **/
/* * Copyright (C) 2009-2015 Texas Instruments Incorporated - www.ti.com* * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met:** Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer.** Redistributions in binary form must reproduce the above copyright* notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the * distribution.** Neither the name of Texas Instruments Incorporated nor the names of* its contributors may be used to endorse or promote products derived* from this software without specific prior written permission.** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,* DATA, OR PROFITS; OR BUSINESS INTERRUPTION HOWEVER CAUSED AND ON ANY* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * INCLUDING NEGLIGENCE OR OTHERWISE ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.**/
/* USER CODE BEGIN (0) *//* USER CODE END */
/* Include Files */
#include "sys_common.h"#include "system.h"
/* USER CODE BEGIN (1) */#include "can.h"#include "esm.h"#include "sys_core.h"
#define D_COUNT 8
uint32 cnt=0, error =0, tx_done =0;uint8 tx_data[D_COUNT][8] = {0};uint8 rx_data[D_COUNT][8] = {0};uint8 *tx_ptr = &tx_data[0][0];uint8 *rx_ptr = &rx_data[0][0];uint8 *dptr=0;
void dumpSomeData();/* USER CODE END */
/** @fn void main(void)* @brief Application main function**/
/* USER CODE BEGIN (2) *//* USER CODE END */
void main(void){/* USER CODE BEGIN (3) */
/* enable irq interrupt in Cortex R4 */ _enable_interrupt_();
/** - writing a random data in RAM - to transmit */ dumpSomeData(); /** - configuring CAN1 MB1,Msg ID-1 to transmit and CAN2 MB1 to receive */ canInit();
/** - enabling error interrupts */ canEnableErrorNotification(canREG1); canEnableErrorNotification(canREG2); /** - starting transmission */ for(cnt=0;cnt<D_COUNT;cnt++) { canTransmit(canREG1, canMESSAGE_BOX1, tx_ptr); /* transmitting 8 different chunks 1 by 1 */ while(tx_done == 0){}; /* ... wait until transmit request is through */ tx_done=0; tx_ptr +=8; /* next chunk ...*/ } /** - check the received data with the one that was transmitted */ tx_ptr = &tx_data[0][0]; rx_ptr = &rx_data[0][0]; for(cnt=0;cnt<63;cnt++) { if(*tx_ptr++ != *rx_ptr++) { error++; /* data error */ } }
while(1){}; /* wait forever after tx-rx complete. */ /* USER CODE END */ }
/* USER CODE BEGIN (4) *//* writing some data to ram */void dumpSomeData(){ uint32 tmp = 0x11; cnt = (D_COUNT*8)-1; dptr = &tx_data[0][0]; *dptr = tmp;
while(cnt--) { tmp = *dptr++; *dptr = tmp + 0x11; }}
/* can interrupt notification *//* Note-You need to remove canMessageNotification from notification.c to avoid redefinition */void canMessageNotification(canBASE_t *node, uint32 messageBox){ /* node 1 - transfer request */ if(node==canREG1) { tx_done=1; /* confirm transfer request */ }
/* node 2 - receive complete */ if(node==canREG2) { while(!canIsRxMessageArrived(canREG2, canMESSAGE_BOX1)); canGetData(canREG2, canMESSAGE_BOX1, rx_ptr); /* copy to RAM */ rx_ptr +=8; }
/* Note: since only message box 1 is used on both nodes we dont check it here.*/}/* USER CODE END */