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.

[参考译文] TM4C1294NCPDT:TM4C1294NCPDT

Guru**** 2535750 points
Other Parts Discussed in Thread: TM4C1294NCPDT, TM4C123GH6PM

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/796623/tm4c1294ncpdt-tm4c1294ncpdt

器件型号:TM4C1294NCPDT
主题中讨论的其他器件: TM4C123GH6PMTM4C123

TM4C1294NCPDT CAN 总线错误

我不熟悉 CAN 接口编程。 我尝试使用 MCP2551收发器在2个 TIVAC 板之间建立 CAN 通信。 我从 ohmninja 网站获得了一些基本 CAN 编程的帮助。 我的基本想法是通过一个 TIVAC 中的 ADC 读取传感器值、并通过 CAN 接口将该值发送给另一个 TIVAC。 传输和接收程序已成功编译、我可以编译项目。 但是、一旦我检查 UART 的输出、我就会得到 CAN 总线错误。 我发布程序并输出屏幕截图 PLZ DO 帮助

发送代码

#include 
#include 
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "driverlib_memmap.h"






#include "drivers/unsigned intrunsigned s/intrl.ide"#include "driverzh/unsigned s/intrunsigned s/inuarts/intrl"#include "drivers.idio.ide"#def"#include "hw_sym.ide"#include "intrl.intrl.ide"#def"#include "intrl.ins/intrl"#include "intrl.ins/intrl.idu.ide"#def"





//以 Hz 为单位的时钟速度

// 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 毫秒){
SysCtlDelay ((sysClock / 3)*(毫秒/ 1000.0f));
}
int main (void)
{
uint32_t ui32ACCValues[4];
volatile uint32_t ui32AccX;
volatile uint32_t ui32AccY;
volatile uint32_t ui32AccZ;
tCANMsgObject msg;// CAN 报文对象
unsigned int msgData;//消息数据长度为四个字节,我们可以将其分配为 int32
unsigned char * msgDataPtr =(unsigned char *)&msgData;//创建指向 msgData 的指针,以便我们可以访问各个字节

SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

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波特

SysCtlPeripheralEnable (SYSCTL_Periph_ADC0);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);

GPIOPinTypeADC (GPIO_Porte _BASE、GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2);

ADCSequenceConfigure (ADC0_BASE、1、ADC_TRIGGER_PROCESSOR、0);
ADCSequenceStepConfigure (ADC0_BASE、1、0、ADC_CTL_CH3);
ADCSequenceStepConfigure (ADC0_BASE、1、1、ADC_CTL_CH2);
ADCSequenceStepConfigure (ADC0_BASE、1、2、ADC_CTL_CH1|ADC_CTL_IE|ADC_CTL_END);

ADCSequenceEnable (ADC0_BASE、1);

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;


while (1)
{
ADCIntClear (ADC0_BASE、1);
ADCProcessorTrigger (ADC0_BASE、1);
while (!ADCIntStatus (ADC0_BASE、1、false))
{
}
ADCSequenceDataGet (ADC0_BASE、1、ui32ACCValues);
ui32AccX = ui32ACCValues[0];
ui32AccY = ui32ACCValues[1];
ui32AccZ = ui32ACCValues[2];
UARTprintf ("模拟电压\TR:%d\Ty:%d\TB:%d\n"、ui32AccX、ui32AccY、ui32AccZ);//将颜色写入 UART 以进行调试

CANMessageSet (CAN1_base、1、&msg、MSG_OBJ_TYPE_TX);//作为 msg 对象1发送

延迟(100);//等待100ms

if (errFlag){//检查错误
UARTprintf ("CAN 总线错误"n);
}

延迟(1000);//等待100ms

}
返回0;
}

接收代码

/*
 * CAN 总线 LED 控制器从固件
 *为 TI Tiva TM4C123GH6PM 编写
 *
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/adc.h"
#include "inc/hw_memmap.h"
#include "driverlib/uart.h"
#include "driverlib/pin_map.h"
#include "utils/uartstdio.h"
#include "inc/hw_ca.h"
#include "inc/hw_ints.h"
#include "driverlib/CAN.h"
#include "driverlib/interrupt.h"
#include "utils/uartstdio.h"
volatile bool rxFlag = 0;//收到 msg 标志
易失性 bool 错误标志= 0;//错误标志
// CAN 中断处理程序
void CANIntHandler (void){
   无符号长整型状态= CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);//读取中断状态
   if (status =CAN_INT_INTID_STATUS){//控制器状态中断
       STATUS = CANStatusGet (CAN1_BASE、CAN_STS_CONTROL);
       错误标志= 1;
   }否则,如果(status =1){// msg 对象1.
       CANIntClear (CAN1_base、1);//清除中断
       rxFlag = 1;//设置 Rx 标志
       错误标志= 0;//清除任何错误标志
   }否则{//永远不会发生
       UARTprintf ("意外的 CAN 总线中断\n");
   }
int main (void){
   tCANMsgObject msg;// CAN msg 对象
   unsigned char msgData[8];//用于 Rx 消息数据的8字节缓冲区
   //从晶振以50MHz 运行
   SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
   //设置调试 UART
   SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
   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、SysCtlClockGet ());
   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、SysCtlClockGet ()、50000);
   CANIntRegister (CAN1_base、CANIntHandler);//使用动态矢量表分配
   CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
   CANIntClear (CAN1_base、CAN_INT_STATUS);
   IntEnable (INT_CAN1);
   CANEnable (CAN1_base);

     //使用 ID 和掩码0接收包含任何 CAN ID 的消息
   MSG.ui32MsgID = 0;
   MSG.ui32MsgIDMask = 0;
   MSG.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
   MSG.ui32MsgLen = 8;//最多允许8个字节
   //将 msg 加载到 CAN 外设报文对象1中,以便它可以触发任何匹配的 Rx 报文上的中断
   CANMessageSet (CAN1_base、1、&msg、MSG_OBJ_TYPE_RX);
   unsigned int color[3];
   浮动强度;
   while (1){
       if (rxFlag){//发生 Rx 中断
           MSG.pui8MsgData = msgData;//设置指向 Rx 缓冲区的指针
           CANMessageGet (CAN1_base、1、&msg、0);//从 CAN 外设读取 CAN 消息对象1
           rxFlag = 0;//清除 Rx 标志
           if (msg.ui32Flags & MSG_obj_data_lost){//检查消息是否丢失
               UARTprintf ("检测到 CAN 消息丢失\n");
           }
           //从 Rx 缓冲器中读取彩色数据(对于 LED 驱动器、从0-255到0-0xFFFF 缩放)
           color[0]= msgData[0]* 0xFF;
           color[1]= msgData[1]* 0xFF;
           color[2]= msgData[2]* 0xFF;
           强度= msgData[3]/255.0f;//从0-255缩放至 float 0-1
           //写入 UART 进行调试
           UARTprintf ("接收到的颜色\tr:%d\TG:%d\TB:%d\ti:%d\n"、msgData[0]、msgData[1]、msgData[2]、msgData[3]);
           //设置颜色和强度
           //RGBSet (颜色、强度);
       }
   }
   返回0;
发送器侧产生错误
 

 
发送寄存器  

接收错误

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您为 TM4C1294修改的接收代码看起来像是作为 TM4C123器件的示例而开始的。 CAN 波特率设置不正确、因为原始代码在对 CANBitRateSet()的调用中使用函数 SysCtlClockGet ()。 TM4C129器件不支持该功能。 如果您不更改频率、则可以将该函数调用替换为常量值120000000。