是去年买的清风大侠的 Hanker TI M4 开发板
最近有需要,就调试一下CAN通信,发现使用大侠给的源码,CAN是回环测试,
如果把回环测试那两句话去掉,CAN不能工作了,使用逻辑分析仪挂在相应port上,好像连port口都没反应
再研究手册、研究网文,没发现有谁遇到这样情况……
拜求哪位童鞋有这款或这系列芯片的CAN通信的经验,能帮忙提供点意见……
详细代码,见板凳。
本帖最后由 sjtitr 于 2014-6-30 19:12 编辑
回环测试,应该是没通过 收发器的,是不是 CAN 芯片坏掉了呢?
我起初也是这样怀疑,可是把逻辑分析仪挂在MCU侧,这边也没有信号,说明可能是相关引脚没有驱动起来。
我当时测量好像如果是回环模式,这两个引脚是有信号的……
以下是代码,可以看见我注释掉了两行,就是这样
- FPUEnable(); //FPU使能
- FPULazyStackingEnable(); //使能FPU堆栈
- SysCtlClockSet(SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHZ |
- SYSCTL_OSC_MAIN); //系统时钟设置
- lcd_ili932x_init(); //初始化LCD驱动
- GrContextInit(&sContext, &g_sLcdDisplay);//初始化图形库
- lcd_backlight_on();
- lcd_ili932x_flush(&sContext);
- sRect.sXMin = 0;
- sRect.sYMin = 0;
- sRect.sXMax = GrContextDpyWidthGet(&sContext) - 1;
- sRect.sYMax = 23;
- GrContextForegroundSet(&sContext, ClrDarkBlue);
- GrRectFill(&sContext, &sRect); // 填充蓝色方块
- GrContextForegroundSet(&sContext, ClrWhite);
- GrRectDraw(&sContext, &sRect); // 加白色框框
- GrContextFontSet(&sContext, &g_sFontCm20);
- GrStringDrawCentered(&sContext, "CAN-Loopback", -1,
- GrContextDpyWidthGet(&sContext) / 2, 10, 0); // 显示串口实验标志
- SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // 使能CAN所使用的外设IO端口
- SysCtlPeripheralEnable(SYSCTL_PERIPH_CAN0); // 把外设端口设为CAN功能
- GPIOPinConfigure(GPIO_PF0_CAN0RX);//配置GPIO端口为接收和发送端
- GPIOPinConfigure(GPIO_PF3_CAN0TX);
- GPIOPinTypeCAN(GPIO_PORTF_BASE, GPIO_PIN_0 | GPIO_PIN_3); //使能GPIO端口
- CANInit(CAN0_BASE); // 初始化CAN0控制器
- CANBitRateSet(CAN0_BASE, SysCtlClockGet(), 250000); //设置CAN总线波特率
- // HWREG(CAN0_BASE + CAN_O_CTL) = HWREG(CAN0_BASE + CAN_O_CTL) | CAN_CTL_TEST;//开CAN控制为检测模式,测试为回环模式
- // HWREG(CAN0_BASE + CAN_O_TST) = HWREG(CAN0_BASE + CAN_O_TST) | CAN_TST_LBACK;
- CANEnable(CAN0_BASE);// 使能CAN0模块
- IntEnable(INT_CAN0); //使能CAN嵌套中断
- CANIntEnable(CAN0_BASE, CAN_INT_MASTER | CAN_INT_ERROR | CAN_INT_STATUS);// CAN中断使能
- *(unsigned long *)ucMsgData = 0; // 初始化用于CAN发送的消息结构体对象
- sCANMessage.ulMsgID = 0x12345678;
- sCANMessage.ulMsgIDMask = 0;
- sCANMessage.ulFlags = MSG_OBJ_TX_INT_ENABLE;
- sCANMessage.ulMsgLen = sizeof(ucMsgData);
- sCANMessage.pucMsgData = ucMsgData;
- InitConsole(); // 初始化串口
- IntMasterEnable(); // 使能处理器总中断
- srCANMessage.ulMsgID = 0; // 初始化用于CAN接收的消息结构体对象
- srCANMessage.ulMsgIDMask = 0;
- srCANMessage.ulFlags = MSG_OBJ_RX_INT_ENABLE | MSG_OBJ_USE_ID_FILTER;
- srCANMessage.ulMsgLen = 8;
- CANMessageSet(CAN0_BASE, 2, &srCANMessage, MSG_OBJ_TYPE_RX); // CAN信息发送
本帖最后由 sjtitr 于 2014-6-30 19:11 编辑
遇到同样的问题,请问楼主解决没?怎么在主食掉那两句后正常收发数据?万分感谢。
解决这个问题了。
看你的代码,CAN选用的管脚是GPIO_PORTF,这个端口默认的功能是NMI(不可屏蔽中断)。想要用作GPIO或者其复用功能需要先解锁NMI功能。
在使能GPIO_PORTF后加入以下代码:
HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY;//解锁
HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0xFF;//确认
加入后应该注释那两条语句也是没有问题的。或者可以换端口。
本帖最后由 gonnamakeit 于 2015-4-2 02:26 编辑