主题中讨论的其他器件: 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;
}
连接的是终端的输出:















