你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

f103-关于RL_ARM中的RL_CAN无法使用的问题【已解决】

[复制链接]
Tobey_YF 提问时间:2016-9-28 13:45 /
最近需要使用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.   * @brief  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. }
复制代码
串口助手显示数据:
123.png









收藏 1 评论3 发布时间:2016-9-28 13:45

举报

3个回答
Tobey_YF 回答时间:2016-9-28 16:15:02


仿真模式下程序运行正常,,硬件下调试则失败~~

22.png
Tobey_YF 回答时间:2016-9-28 17:31:21

好吧  研究了大半天~~   又是修改时钟频率又是重新编译的、、
最后发现出错的原因还是有点郁闷,,,
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:
31.png

图2:
32.png

图3:
34.png


评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

埃斯提爱慕 回答时间:2016-9-28 20:39:52
提示: 作者被禁止或删除 内容自动屏蔽

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版