6075|2

259

帖子

5

TA的资源

一粒金砂(高级)

楼主
 

f103-关于RL_ARM中的RL_CAN无法使用的问题【已解决】 [复制链接]

本帖最后由 Tobey 于 2016-9-28 17:35 编辑

最近需要使用CAN,之前并没有接触过CAN方面的知识,由于项目中使用了RTX,所以打算直接使用RL_CAN实现,不过实现过程中出现些问题
由于是测试,所以直接建立了以下三个任务进行测试:
        sendCANTask:用于发送消息,由于之前运行时串口助手中显示的数据有误,因此,直接将发送消息固定为6~~
        receCANTask:用于接收消息
        dispTask:      用于打印发送消息及接收到的消息,验证CAN实现是否有误
       CAN的工作模式采用的是环回静默模式,所以并没有外接CAN驱动,,,      (弱弱的问一句:是不是必须要接CAN驱动?不接就无法开启CAN?)
问题描述:在串口助手中显示的发送数据及接收数据都是 -- 0  ,这是它们的初始值,,,
                 设置断点进行调试后,发现senCANTask任务卡在了CAN_start(1) ,因此造成了senCANTask无法进入
                 循环以及receCANTask没接收到数据,,所以显示的数据就是它们的初始值了~~
个人猜想:是否是因为我没接CAN驱动造成的?可是环回静默模式用不上它吧~~
使用过RL_CAN的大侠们给小弟点指导吧!

程序主要代码:
  1. U32 Tx_val = 0, Rx_val = 0;           /* Global variables used for display   */

  2. /**
  3.   * [url=home.php?mod=space&uid=159083]@brief[/url]  CAN发送消息任务.
  4.   * @param  None.
  5.   * @note   周期性的发送data[0]中的数据.
  6.   * @retval None
  7.   */
  8. __task void sendCANTask (void)  {
  9.   /* Initialize message  = { ID, {data[0] .. data[7]}, LEN, CHANNEL, FORMAT, TYPE } */
  10.   CAN_msg msg_send       = { 33, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},   
  11.                               1, 2, STANDARD_FORMAT, DATA_FRAME };

  12.   CAN_init (1, 500000);               /* CAN controller 1 init, 500 kbit/s   */

  13.   CAN_rx_object (1, 2,  33, DATA_TYPE | STANDARD_TYPE); /* Enable reception  */
  14.                                       /* of message on controller 1, channel */
  15.                                       /* is not used for STM32 (can be set to*/
  16.                                       /* whatever value), data frame with    */
  17.                                       /* standard id 33                      */

  18.   /* The activation of test mode in line below is used for enabling
  19.      self-testing mode when CAN controller receives the message it sends so
  20.      program functionality can be tested without another CAN device          */
  21.   /* COMMENT THE LINE BELOW TO ENABLE DEVICE TO PARTICIPATE IN CAN NETWORK   */
  22.   CAN_hw_testmode(1, CAN_BTR_SILM | CAN_BTR_LBKM); /* Loopback and           */
  23.                                                    /* Silent Mode (self-test)*/

  24.   CAN_start (1);                      /* Start controller 1                  */

  25.         int i = 0;
  26.   for (;;)  {
  27.     msg_send.data[0] = 6;     /* Data[0] field = analog value from   */
  28.                                       /* potentiometer                       */
  29.                 printf("before sendData\n");
  30.     CAN_send (1, &msg_send, 0x0F00);  /* Send msg_send on controller 1       */
  31.     Tx_val = msg_send.data[0];
  32.                 printf("after sendData\n");
  33.     os_dly_wait (100);                /* Wait 1 second                       */
  34.   }
  35. }

  36. /**
  37.   * @brief  CAN接收消息任务.
  38.   * @param  None.
  39.   * @note   None.
  40.   * @retval None
  41.   */
  42. __task void receCANTask (void)  {
  43.   CAN_msg msg_rece;

  44.   for (;;)  {
  45.     /* When message arrives store received value to global variable Rx_val   */
  46.     if (CAN_receive (1, &msg_rece, 0x00FF) == CAN_OK)  {
  47.       Rx_val = msg_rece.data[0];
  48.                         printf("receive success\n");
  49.     }
  50.   }
  51. }

  52. __task void dispTask (void) {

  53.   for (;;) {
  54.                

  55.                 printf("sendData: %d, receData: %d\n\n",Tx_val, Rx_val);
  56.                 os_dly_wait(1000);
  57.   }
  58. }

  59. /**
  60.   * @brief  初始化任务.
  61.   * @param  None.
  62.   * @note   用于创建任务,当任务都创建完成时,其使命达成自行销毁.
  63.   * @retval None
  64.   */
  65. __task void initTask (void) {
  66.         t_sendCAN = os_tsk_create(sendCANTask,1);
  67.         t_receCAN = os_tsk_create(receCANTask,1);
  68.         t_disp = os_tsk_create(dispTask,1);
  69.         os_tsk_delete_self();
  70. }
复制代码
串口助手显示数据:




此帖出自ARM技术论坛
点赞 关注
 

回复
举报

259

帖子

5

TA的资源

一粒金砂(高级)

沙发
 

仿真状态下运行正常~~  硬件下调试程序无法正常运行,,,这是什么问题啊


此帖出自ARM技术论坛
 
 
 

回复

259

帖子

5

TA的资源

一粒金砂(高级)

板凳
 


好吧  研究了大半天~~   又是修改时钟频率又是重新编译的、、
最后发现出错的原因还是有点郁闷,,,
keil既然提供了demo,需要修改的文件为什么不在文档中指出,图1中的文档为什么没指出
问题出处:keil提供的STM32F103的RL_CAN示例程序是基于STM32F103RB的,
                 而我当前板子上使用的是STM32F103C8,两者CAN使用的引脚不同,
                 一个是PB8、PB9,一个是PA11、PA12,因此需要修改驱动文件。
解决方法:进入CAN_STM32F103.c文件,找到CAN_hw_setup (U32 ctrl)函数,
                 将其中对PB8,9的配置部分注释掉,将其下边的PA11,12的配置指令
                 取消注释,然后重新编译后就好了,如图2所示:
顺带贴上最终串口助手显示信息,CAN显示的是通道1的设置温度--》80,如图3

图1:



图2:


图3:



此帖出自ARM技术论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表