主题中讨论的其他器件: EK-TM4C1294XL、 TPS2052、 TPS2052B
大家好。 我对 CAN 总线协议和 TM4C 非常陌生。 我的任务是将 CAN 消息从1个 TM4C129EXL 传输到另一个 TM4C129EXL launchpad。 由于我不熟悉这一点,我需要从某个地方开始,因此我决定通过以下链接修改代码和硬件: http://ohm.ninja/tiva-c-series-can-bus-with-mcp2551/ ,并参考 C:\ti\TivaWare_C_Series-2.1.4.178\examples\peripheral\can 中的示例代码。
我已将 severel UARTprintf 添加到 void CANIntHandler (void)中、以帮助我进行调试。 我还使用了示波器来检查 CANH、CANL 和 TX、但没有输出(因此、在这篇文章中未连接示波器电容器)。 JP4和 JP5跳线采用默认配置、因为使用 CAN1代替 CAN0。 请提供帮助。
附件是我的主设备代码:
#include #include #include #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "inc/hw_ca.h" #include "inc/hw_ints.h" #include "driverlib/ca.h" #include "driverlib/interrupt.h" #define "driverlib/driverlib.idio #define "driverlib/voltex"#define "driveript.mdio.ide"#include "#define "#define "#define "driverlib/volatile.tex"#define "#define "driverlib/voltine.tine/volatile r.ip.mdio.mdio.ide"#define #include "#"#define "#"#"#define "#"# //以 Hz 空延迟为单位的时钟速度(无符号 int 毫秒){ SysCtlDelay ((sysClock / 3)*(毫秒/ 1000.0f)); } // CAN 中断处理程序 void CANIntHandler (void){ unsigned long status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);//读取中断状态 UARTF("CANIntHandler ( status_status= CANINTn )= CANIntStatus_CONTROLLE_INT_CANINTn);CANINTn = CANINTn (CANNOST_CONTROLLET = CANNOT_INT_CANNOT_CANINTn);// CANINTn = CANINT //读回错误位,对它们执行什么操作? errFlag = 1; UARTprintf ("triggered1\n"); }否则(status = 1){//消息对象1 CANIntClear (CAN1_base、1);//清除中断 errFlag = 0;//清除任何错误标志 UARTprintf ("tggered2\n"); }否则{"\n"uARTprintf (")(n"n)、不会发生意外的错误;} // CAN 报文对象 unsigned int msgData;//报文数据长度为四个字节,我们可以将其分配为 int32 unsigned char * msgDataPtr =(unsigned char *)&msgData;//创建指向 msgData 的指针,以便我们可以访问单个字节 //从 PLL 以120MHz 运行。 sysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); //设置调试 UART SysCtl_Periph_GPIOA;//配置 GPIO_PINT_0_0_GPIO0_GPIO_100;//配置 UART 外设 UARTStdioConfig (0、115200、sysClock);// 115200波特 //设置 CAN1 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 CAN1 GPIO 外设 GPIOPinConfigure (GPIO_PB0_CAN1RX); GPIOCtlConfigure (GPIO_PB1_CAN1TX);//启用 GPIOPIN_PIN_0; GPIO_PEPT1_GPIO_PIN_PIN_0 ;GPIO_PEPT1_GPIO_PIN_PIN_0 CANInit (CAN1_base); CANBitRateSet (CAN1_base、sysClock、500000); CANIntRegister (CAN1_base、 CANIntHandler);//使用动态矢量表分配 CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS); IntEnable (INT_CAN1); CANEnable (CAN1_base); //设置 msg 对象 msgData = 0; CAN.u32msg MsgID = 1;.u32msgmsg = 32u_i_msg = 0;i32u_msgmsg_msg = 32u_isg = 32u_msgmsg = 0;i_i_i_msg_msg = 32u_msg = 32u_it_msg = 32u_msg MSG.pui8MsgData = msgDataPtr; unsigned int t = 0;//循环计数 器浮点频率= 0.3;//频率缩放 器 while (1){ //设置下一个颜色(缩放 sinf (0-1)到0-255) msgDataPtr[0]=(0.5 + 0.5*ff (t pfr)+ 0xf (+0.5*f))*12*/f (+0.5*f)*/f (0xfr)=*/f (+0.5*/f)*/f (+0.5*f)*/f (+0.5*/f) // 120度相位差 msgDataPtr[2]=(0.5 + 0.5*sinf (t*freq +(4*PI/3)))* 0xFF;// 240度相位差 msgDataPtr[3]= 128;// 50%强度 UARTprintf ("发送颜色\tr:%d\TG:%d\Tb\gDataPtr:%1);msgDataSet[g1、CANMessage1 、CANq1、CANDataType &tbt (bt) //作为 msg 对象发送1 延迟(100);//如果 (errFlag)则等待100ms{//检查错误 UARTprintf ("CAN 总线错误\n"); } t++;//溢出正常 } 返回0; }
连接的是终端的输出: