主题中讨论的其他器件:TM4C123、 EK-TM4C1294XL
大家好!
我对 TM4C 和 CAN 协议以及实际嵌入式软件非常陌生。
在我的工作中、我需要在两个 TM4C1294之间作为主器件和从器件与 CAN 协议进行通信。 在网上冲浪时、我在这个网站上找到了一个代码。
( ohm.ninja/.../ )我按照现场所示设置电路。
但是、当涉及代码部分时、我会遇到一些问题。
这是我在主(发送器)端的代码:
#include
#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/CAN.h"
#include "driverlib/interrupt.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "utils/uartstdio.h"
#include "utils/uartstdio.c"
#define PI 3.14159265359f
易失性 bool 错误标志= 0;//传输错误标志
unsigned int sysClock;//时钟速度,单位为 Hz
void delay (unsigned int milliseconds){
SysCtlDelay ((sysClock / 3)*(毫秒/ 1000.0f));
}
// CAN 中断处理程序
void CANIntHandler (void){
无符号长整型状态= CANIntStatus (CAN1_base、CAN_INT_STS_CAUST);//读取中断状态
if (status =CAN_INT_INTID_STATUS){//控制器状态中断
状态= CANStatusGet (CAN1_base、CAN_STS_CONTROL);//读回错误位,对它们执行什么操作?
错误标志= 1;
}否则、如果(status ==1){//消息对象1
CANIntClear (CAN1_base、1);//清除中断
错误标志= 0;//清除任何错误标志
}否则{//永远不会发生
UARTprintf ("意外的 CAN 总线中断\n");
}
}
int main (void){
tCANMsgObject msg;// CAN 报文对象
unsigned int msgData;//消息数据长度为四个字节,我们可以将其分配为 int32
unsigned char * msgDataPtr =(unsigned char *)&msgData;//创建指向 msgData 的指针,以便我们可以访问各个字节
//从 PLL 以120MHz 运行。
SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
//设置调试 UART
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//启用 UART0 GPIO 外设
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);
GPIOPinConfigure (GPIO_PA0_U0RX);
GPIOPinConfigure (GPIO_PA1_U0TX);
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);
UARTStdioConfig (0、115200、sysClock);// 115200波特
//设置 CAN1
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);//启用 CAN1 GPIO 外设
GPIOPinConfigure (GPIO_PB0_CAN1RX);
GPIOPinConfigure (GPIO_PB1_CAN1TX);
GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);
CANInit (CAN1_base);
CANBitRateSet (CAN1_base、sysClock、50000);
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;
MSG.ui32MsgID = 1;
MSG.ui32MsgIDMask = 0;
MSG.ui32Flags = MSG_OBJ_TX_INT_ENABLE;
MSG.ui32MsgLen = sizeof (msgDataPtr);
MSG.pui8MsgData = msgDataPtr;
unsigned int t = 0;//循环计数器
float freq = 0.3;//频率分频器
while (1){
//设置下一个颜色(缩放正弦(0-1)到0-255)
msgDataPtr[0]=(0.5 + 0.5*sinf (t*freq))* 0xFF;
msgDataPtr[1]=(0.5 + 0.5*sinf (t*freq +(2*PI/3)))* 0xFF;// 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:%d\n"、msgDataPtR[0]、msgDataPtR[1]、msgDataPtR[2]);//将颜色写入 UART 以进行调试
CANMessageSet (CAN1_base、1、&msg、MSG_OBJ_TYPE_TX);//作为 msg 对象1发送
延迟(100);//等待100ms
if (errFlag){//检查错误
UARTprintf ("CAN 总线错误%d\n"、errFlag);
}
T++;//溢出正常
}
//返回0;
}
----------------------------------------------------------------------
首先 、在主器件侧、我的 CAN 消息未传输。 正如您看到的、有一个 CAN 总线错误标志为1。
在将我的头转到接收端之前、我的传输代码可能会有什么问题? 我需要更改什么?
我还没有机会使用示波器测量输出。
实际上、我以前看过一个类似主题的标题、但对我来说、这有点太复杂了。 我想知道是否有人可以更容易地在这方面帮助我?
