主题中讨论的其他器件:SN65HVD233-HT、 SN74LVC4245A、 SN74LV244A、 TM4C123
我正在使用 CAN 总线。
我正在使用示例文件夹(外设 CAN)中提供的 simple_tx 和 simple_Rx 代码。
我已经修改了该代码、因为我不想使用 UART 并使代码变得简单。
但这对我不起作用。
不同的硬件连接和相应的输出波形、我已附加在以下文档中。 请看那个。
e2e.ti.com/.../Problem-TI-Post.pdf
和硬件连接:
所有跳线均处于默认位置。
/////////////////////////////////////////////////////////////////// simple_tx 代码 #include #include #include "inc/hw_ca.h" #include "void/hw_ints.h" #include "inc/hw_memmap.h" #include "driverlib/ca.h" #include "driverlib/gpio.h" #include "driverlib/interrupt.h" #include "driverlib/pin_map.h" ;include "volatile unsignature.idi20_intrl"#idu.idu.ide"#idu.ide"#include "u.idio nateg";"sys/intrack u.idu.idu.idu.idu.idu.idu.ide"#idu.idu.ide"#include "u.32 SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//启用 UART0 GPIO 外设 GPIOPinConfigure (GPIO_PD4_U2RX); GPIOPinConfigure (GPIO_PD5_U2TX); SysCtlPeripheralEnable (SYSCTL_Periph_UART2); UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC); GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_4 | GPIO_PIN_5); //UARTStdioConfig (0、115200、sysClock); } void SimpleDelay (void) { SysCtlDelay (40000000); } void CANIntHandler (void) { uint32_t ui32Status; ui32Status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST); if (ui32Status = CAN_INT_INTID_STATUS) { ui32Status = CANStatusGet (CAN1_base、CAN_STS_CONTROL); G_bErrFlag = 1; } 否则、如果(ui32Status = 1) { CANIntClear (CAN1_base、1); G_ui32MsgCount++; G_bErrFlag = 0; } 其他 { } } int main (void) { tCANMsgObject sCANMessage; uint32_t ui32MsgData=0; uint8_t * pui8MsgData; pui8MsgData =(uint8_t *) ui32MsgData; SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);SimpleDelay (); //InitConsole(); SysCtlPeripheralEnable (SYSCTL_Periph_GPION); GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);SimpleDelay (); 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);SimpleDelay (); CANBitRateSet (CAN1_base、SysCtlClockGet ()、50000);SimpleDelay (); CANIntRegister (CAN1_base、CANIntHandler);SimpleDelay (); CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);SimpleDelay (); IntEnable (INT_CAN1);SimpleDelay (); CANEnable (CAN1_base);SimpleDelay (); ui32MsgData = 0xAA; sCANMessage.ui32MsgID = 1; sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_TX_INT_ENABLE; sCANMessage.ui32MsgLen = sizeof (pui8MsgData); sCANMessage.pui8MsgData = pui8MsgData; while (1) { //UARTprintf ("发送 msg:0x%02x %02x %02x %02x"、pui8MsgData[0]、pui8MsgData[1]、pui8MsgData[2]、pui8MsgData[3]); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02); CANMessageSet (CAN1_base、1、&sCANMessage、MSG_OBJ_TYPE_TX);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08);SimpleDelay (); if (g_bErrFlag) { //UARTprintf ("错误-电缆已连接?\n"); } 其他 { //UARTprintf ("总数=%u\n"、g_ui32MsgCount); } /*ui32MsgData++; if (ui32MsgData>=0x65) { ui32MsgData = 0x55; }*/ while (1) { } } return (0); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// simple_tx 代码结束
////////////////////////////////////////////////////////////////////////////////////////////////////////// simple_RX 代码 #include #include #include "inc/hw_ca.h" #include "idvolatile/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/ca.h" #include "driverlib/gpio.h"#definvolatile "driverlib/gpio.h" #include "driverbt translation_rmdio.h" ;#include "driverbidio.idrg.ide"#def";"sysbidrg.idrg.unsign" = unsign.idr32_unsign.idrg.idrg.idrg.idrg.idrg.idrg.idrg.idrfb = volt.unt = volt.idrfu.idrfu.idrg.idrg.idrg.idrg. SysCtlDelay (20000000); } /********* void InitConsole (void) { SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);//启用 UART0 GPIO 外设 GPIOPinConfigure (GPIO_PD4_U2RX); GPIOPinConfigure (GPIO_PD5_U2TX); SysCtlPeripheralEnable (SYSCTL_Periph_UART2); UARTClockSourceSet (UART2_base、UART_CLOCK_PIOSC); GPIOPinTypeUART (GPIO_PORTD_base、GPIO_PIN_4 | GPIO_PIN_5); //UARTStdioConfig (0、115200、sysClock); } void CANIntHandler (void) { uint32_t ui32Status; ui32Status = CANIntStatus (CAN1_base、CAN_INT_STS_CAUST); if (ui32Status = CAN_INT_INTID_STATUS) { ui32Status = CANStatusGet (CAN1_base、CAN_STS_CONTROL); G_bErrFlag = 1; } 否则、如果(ui32Status = 1) { CANIntClear (CAN1_base、1); G_ui32MsgCount++; G_bRXFlag = 1; G_bErrFlag = 0; } 其他 { } } int main (void) { tCANMsgObject sCANMessage; uint8_t pui8MsgData[8]; SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000); //InitConsole(); SysCtlPeripheralEnable (SYSCTL_Periph_GPION); GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1); SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB); GPIOPinConfigure (GPIO_PB0_CAN1RX); GPIOPinConfigure (GPIO_PB1_CAN1TX); GPIOPinTypeCAN (GPIO_PORTB_BASE、GPIO_PIN_0 | GPIO_PIN_1); SysCtlPeripheralEnable (SYSCTL_Periph_CAN1);SimpleDelay (); CANInit (CAN1_base);SimpleDelay (); CANBitRateSet (CAN1_base、SysCtlClockGet ()、50000);SimpleDelay (); CANIntRegister (CAN1_base、CANIntHandler);SimpleDelay (); CANIntEnable (CAN1_base、CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);SimpleDelay (); IntEnable (INT_CAN1);SimpleDelay (); CANEnable (CAN1_base);SimpleDelay (); sCANMessage.ui32MsgIDMask = 0; sCANMessage.ui32Flags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER; sCANMessage.ui32MsgLen = 8; CANMessageSet (CAN1_base、1、&sCANMessage、MSG_OBJ_TYPE_RX); for (;;) { unsigned int uIdx; if (g_bRXFlag) { GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08); SimpleDelay(); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02); sCANMessage.pui8MsgData = pui8MsgData; CANMessageGet (CAN1_base、1、&sCANMessage、0); G_bRXFlag = 0; if (sCANMessage.ui32Flags & MSG_OBJ_DATA_LOST) { //UARTprintf ("检测到 CAN 消息丢失\n"); } //UARTprintf ("Msg ID=0x%08X len=%u data=0x"、sCANMessage.ui32MsgID、sCANMessage.ui32MsgLen); for (uIdx = 0;uIdx < sCANMessage.ui32MsgLen;uIdx++) { //UARTprintf ("%02x "、pui8MsgData[uIdx]); if (pui8MsgData[uIdx]=0xAA) { GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x02);SimpleDelay (); GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0|GPIO_PIN_1、0x08);SimpleDelay (); } } //UARTprintf ("total count=%u\n"、g_ui32MsgCount); } } return (0); } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// simple_RX 代码结束
我认为我在硬件或代码方面犯了一些错误。 我无法对其进行调试。
Amit 建议 使用的 SN65HVD233-HT 3.3V CAN 收发器。
MCP2551 CAN 收发器的问题是否是由于电压电平(TTL)造成的????
我已经尝试过 LVTTL 到 TTL 转换器和 TTL 到 LVTTL 转换器 ,SN74LV244A 和 SN74LVC4245A。 仍然会出现相同的误差。
此致、
Krishnat