主题中讨论的其他器件: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

