专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
[LM4F232]CAN通信不好用
2019-03-24 10:22
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
20753
7
1469
本帖最后由 sjtitr 于 2014-6-30 19:12 编辑
是去年买的清风大侠的 Hanker TI M4 开发板
最近有需要,就调试一下CAN通信,发现使用大侠给的源码,CAN是回环测试,
如果把回环测试那两句话去掉,CAN不能工作了,使用逻辑分析仪挂在相应port上,好像连port口都没反应
再研究手册、研究网文,没发现有谁遇到这样情况……
拜求哪位童鞋有这款或这系列芯片的CAN通信的经验,能帮忙提供点意见……
详细代码,见板凳。
此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
7条回答
sjtitr
2019-03-24 21:32
< :TI_MSP430_内容页_SA7 -->
本帖最后由 sjtitr 于 2014-6-30 19:11 编辑
Study_Stellaris 发表于 2014-6-30 18:07
回环测试,应该是没通过 收发器的,是不是 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); // 填充蓝 {MOD}方块
GrContextForegroundSet(&sContext, ClrWhite);
GrRectDraw(&sContext, &sRect); // 加白 {MOD}框框
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信息发送
复制代码
加载中...
查看其它7个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
我起初也是这样怀疑,可是把逻辑分析仪挂在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); // 填充蓝 {MOD}方块
- GrContextForegroundSet(&sContext, ClrWhite);
- GrRectDraw(&sContext, &sRect); // 加白 {MOD}框框
- 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信息发送
复制代码一周热门 更多>