主题中讨论的其他器件:TM4C123GH6PM、 EK-TM4C123GXL
我有接口 Tiva c launchpad 通过 UART 接收 CAN 数据、我的控制器在传输数据时工作正常。
但是、当我接收数据时 、每当触发 rxFlag 时、终端上都会接收到空数据。 我正在使用 IXXAT CAN 转换器在另一端发送和接收数据、我还在 CAN 总线和 CAN 收发器上放置了120欧姆的上拉电阻器、我使用了 ISO 1050。 如果我在下面给出的代码中出现问题、请提出建议:
/*
* CAN 总线 LED 控制器从固件
*为 TI Tiva TM4C123GH6PM 编写
*
#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 "drivers/rgb.h"
volatile bool rxFlag = 0;//收到 msg 标志
易失性 bool 错误标志= 0;//错误标志
unsigned int sysClock;//时钟速度,单位为 Hz
// CAN 中断处理程序
void CANIntHandler (void){
无符号长整型状态= CANIntStatus (CAN0_BASE、CAN_INT_STS_CAUST);//读取中断状态
if (status =CAN_INT_INTID_STATUS){//控制器状态中断
STATUS = CANStatusGet (CAN0_BASE、CAN_STS_CONTROL);
错误标志= 1;
}否则,如果(status =1){// msg 对象1.
CANIntClear (CAN0_BASE、1);//清除中断
rxFlag = 1;//设置 Rx 标志
错误标志= 0;//清除任何错误标志
}否则{//永远不会发生
//UARTprintf ("意外的 CAN 总线中断\n");
}
}
int main (void){
tCANMsgObject msg;// CAN msg 对象
unsigned char msgData[8];//用于 Rx 消息数据的8字节缓冲区
//从晶振以50MHz 运行
SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
//设置调试 UART
SysCtlPeripheralEnable (SYSCTL_Periph_UART0);//启用 UART0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);//启用 GPIOA
GPIOPinConfigure (GPIO_PA0_U0RX);//将 A0配置为 RX 引脚
GPIOPinConfigure (GPIO_PA1_U0TX);//将 A1配置为 TX 引脚
GPIOPinTypeUART (GPIO_Porta_base、GPIO_PIN_0 | GPIO_PIN_1);//将 A0和 A1设置为 UART 引脚类型
UARTConfigSetExpClk (UART0_BASE、SysCtlClockGet ()、115200、
(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));//配置 UART
IntEnable (INT_UART0);//启用 UART 中断
UARTIntEnable (UART0_BASE、UART_INT_RX | UART_INT_RT);//仅启用 RX 和 TX 中断
//设置 CAN0
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
GPIOPinConfigure (GPIO_PE4_CAN0RX);
GPIOPinConfigure (GPIO_PE5_CAN0TX);
GPIOPinTypeCAN (GPIO_Porte _BASE、GPIO_PIN_4 | GPIO_PIN_5);
SysCtlPeripheralEnable (SYSCTL_Periph_CAN0);
CANInit (CAN0_BASE);
CANBitRateSet (CAN0_BASE、SysCtlClockGet ()、250000);
CANIntRegister (CAN0_BASE、CANIntHandler);//使用动态矢量表分配
CANIntEnable (CAN0_BASE、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);
IntEnable (INT_CAN0);
CANEnable (CAN0_BASE);
//设置 LED 驱动器
//RGBInit (1);
//使用 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 (CAN0_BASE、1、&msg、MSG_OBJ_TYPE_RX);
//unsigned int color[3];
//浮动强度;
while (1){
if (rxFlag){//发生 Rx 中断
MSG.pui8MsgData = msgData;//设置指向 Rx 缓冲区的指针
CANMessageGet (CAN0_BASE、1、&msg、0);//从 CAN 外设读取 CAN 消息对象1
// UARTCharPut (UART0_BASE、msgData[0]);
// UARTCharPut (UART0_BASE、msgData[1]);
// UARTCharPut (UART0_BASE、msgData[2]);
// UARTCharPut (UART0_BASE、msgData[3]);
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]);
UARTCharPut (UART0_BASE、msgData[0]);
UARTCharPut (UART0_BASE、msgData[1]);
UARTCharPut (UART0_BASE、msgData[2]);
UARTCharPut (UART0_BASE、msgData[3]);
//设置颜色和强度
// RGBSet (颜色、强度);
}
}
//返回0;
}
2017年2月5日18:08:42.796 [RX]- 00 00 00 00
2017年2月5日18:08:43.812 [RX]- 00 00 00 00
我不熟悉 CAN 外设、因此请指导我