查看: 2128|回复: 2

[其他] can自发自收模式接收的数据不对,

[复制链接]

该用户从未签到

2

主题

3

帖子

0

新手上路

Rank: 1

积分
26
最后登录
2015-10-26
发表于 2015-9-7 13:47:27 | 显示全部楼层 |阅读模式


#include <mqx.h>
#include <bsp.h>
#include <lwevent.h>
#include "test.h"
#include "lwevent.h"
#ifndef PSP_MQX_CPU_IS_KINETIS
#include <flexcan.h>
#endif


LWEVENT_STRUCT                         event;

TASK_TEMPLATE_STRUCT MQX_template_list[] = {
   { MAIN_TASK, Main_Task, 1000L, 9, "Main task", MQX_AUTO_START_TASK},
   { TX_TASK,   Tx_Task,   1000L, 8, "TX task", 0, 0, 0},
   { RX_TASK,   Rx_Task,   1000L, 8, "RX task", 0, 0, 0},
   { 0L, 0L, 0L, 0L, 0L, 0L }
};

void MY_FLEXCAN_ISR
(
   /* [IN] FlexCAN base address */
   pointer can_ptr
)
{
   volatile CAN_MemMapPtr        can_reg_ptr;
   vuint_32                               tmp_reg;
   vuint_32                               temp;
        uint32_t error;
   can_reg_ptr = (CAN_MemMapPtr)can_ptr;

   /* get the interrupt flag */
   tmp_reg = (can_reg_ptr->IFLAG1 & CAN_IMASK1_BUFLM_MASK);
   // check Tx/Rx interrupt flag and clear the interrupt
   if(tmp_reg){
      /* clear the interrupt and unlock message buffer */
      /* Start CR# 1751 */
      error=_lwevent_set(&event, tmp_reg);
      can_reg_ptr->IFLAG1 |= tmp_reg;
      /* End CR# 1751 */
      temp = can_reg_ptr->TIMER;
   }/* Endif */

   // Clear all other interrupts in ERRSTAT register (Error, Busoff, Wakeup)
   tmp_reg = can_reg_ptr->ESR1;
   if(tmp_reg & FLEXCAN_ALL_INT){
      /* Start CR# 1751 */
      can_reg_ptr->ESR1 |= (tmp_reg & FLEXCAN_ALL_INT);
      /* End CR# 1751 */
   } /* Endif */

   return;
}


void Main_Task(uint_32 parameter)
{
   _int_install_unexpected_isr();
   _bsp_flexcan_io_init(CAN_DEVICE);

   frequency                         = 125;                                                        //selected frequency
   data_len_code         = 8;                                                                //Data length
   format                                 = FLEXCAN_STANDARD;        //Select message format

   /* Select mailbox number */
   RX_mailbox_num                                 = 1;
   TX_mailbox_num                                 = 1;

   RX_identifier                                 = 0x122;
   TX_identifier                                 = 0x122;

   bit_timing0         = bit_timing1 = 0;                        /* We use default settings */
         flexcan_mode = FLEXCAN_LOOPBK_MODE;        /* Select operation mode:FLEXCAN_LOOPBK_MODE | FLEXCAN_NORMAL_MODE*/
   interrupt                 = FLEXCAN_ENABLE;                         /* Enable interrupt */
   flexcan_error_interrupt = 1;                                        /* Enable error interrupt */

   FLEXCAN_Softreset ( CAN_DEVICE);                        /* Reset FLEXCAN device */
         FLEXCAN_Initialize ( CAN_DEVICE, bit_timing0, bit_timing1, frequency, FLEXCAN_IPBUS_CLK);/* Initialize FLEXCAN device */
         FLEXCAN_Select_mode( CAN_DEVICE, flexcan_mode);/* Select mode */
         FLEXCAN_Set_global_stdmask (CAN_DEVICE, 0x222 );
         
   if(flexcan_error_interrupt == 1)/* Enable error interrupts */
   {
      FLEXCAN_Install_isr_err_int(CAN_DEVICE, MY_FLEXCAN_ISR );
                        FLEXCAN_Install_isr_boff_int(CAN_DEVICE, MY_FLEXCAN_ISR  );
      FLEXCAN_Error_int_enable(CAN_DEVICE);
   }
         _lwevent_create(&event, LWEVENT_AUTO_CLEAR);  /* Set up an event group */
   _task_create(0, RX_TASK, 0);
   _task_create(0, TX_TASK, 0);
   FLEXCAN_Start(CAN_DEVICE);/* Start FLEXCAN */
         
         
   while(1){}
}

void Tx_Task(uint_32 parameter)
{
   uchar   data[]= {0X41,0x42,0x43,0x44,0x45,0x46,0x47,0x48};
   uint_32 result;
   uchar   string[] = {0xa, 0xb, 0xe, 0xc, 0xe, 0xd, 0xa, 0x0};
         FLEXCAN_Initialize_mailbox( CAN_DEVICE, TX_mailbox_num, TX_identifier,data_len_code, FLEXCAN_TX, format,interrupt);/* Initialize mailbox */
         FLEXCAN_Activate_mailbox(CAN_DEVICE, TX_mailbox_num, FLEXCAN_TX_MSG_BUFFER_NOT_ACTIVE);
         
   if(interrupt == FLEXCAN_ENABLE)
   {
      FLEXCAN_Install_isr( CAN_DEVICE, TX_mailbox_num, MY_FLEXCAN_ISR  );
   }
         _time_delay(1000);
   while(1)
   {   
                 result = FLEXCAN_Tx_message(CAN_DEVICE, TX_mailbox_num, TX_identifier, format, data_len_code, &data[0]);
//     result = FLEXCAN_Tx_mailbox(CAN_DEVICE, TX_mailbox_num, &data[0]);
     if(result != FLEXCAN_OK)
         printf("\nTransmit error. Error Code: 0x%lx", result);
     else
                         printf("\nTX Data: ");
                         for (result = 0; result <8; result++) printf ("0x%X ", data[result]);        
                 _time_delay(1000);
   }
}

void Rx_Task(uint_32 parameter)
{
        uchar   dptr[8];
        uint_32 result;
        uint_32 DLC = 0;
        uint_32 ID = 0;

        FLEXCAN_Initialize_mailbox( CAN_DEVICE, RX_mailbox_num, RX_identifier,data_len_code, FLEXCAN_RX, format,interrupt);
        FLEXCAN_Activate_mailbox(CAN_DEVICE, RX_mailbox_num, FLEXCAN_RX_MSG_BUFFER_EMPTY);
        if(interrupt == FLEXCAN_ENABLE)
        {
                FLEXCAN_Install_isr( CAN_DEVICE, RX_mailbox_num, MY_FLEXCAN_ISR );
        }
        while(1)
        {            
                if (_lwevent_wait_ticks(&event, 1 << RX_mailbox_num, FALSE, 0) != MQX_OK) {
                         printf("\nEvent Wait failed");
                }
                result = FLEXCAN_Unlock_mailbox (CAN_DEVICE);
                if(result != FLEXCAN_OK)
                {
                  printf("\nUnlock mailbox failed. Error Code: 0x%lx", result);
                }
                result = FLEXCAN_Rx_message(CAN_DEVICE, RX_mailbox_num, &ID, format,&DLC, &dptr, interrupt);
                if(result != FLEXCAN_OK)
                         printf("\nReceived error. Error Code: 0x%lx", result);
                else
                {
                         printf("\nRX data: ");
                         for (result = 0; result < DLC; result++) printf ("0x%X ", dptr[result]);
                         printf("\nID  is: 0x%X", ID);
                         printf("\nDLC is: 0x%X\n", DLC);
                }
                result = FLEXCAN_Unlock_mailbox (CAN_DEVICE);
                if(result != FLEXCAN_OK)
                {
                                        printf("\nUnlock mailbox failed. Error Code: 0x%lx", result);
                }
                //FLEXCAN_Request_message (CAN_DEVICE, RX_mailbox_num, format);
        }
}



我知道答案 目前已有2人回答

串口打印信息

串口打印信息
回复

使用道具 举报

该用户从未签到

19

主题

401

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1114
最后登录
2017-8-16
发表于 2015-9-7 15:44:56 | 显示全部楼层
120欧的电阻加了吧?
freescale.png
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16701
    最后登录
    1970-1-1
    发表于 2015-9-7 19:45:08 | 显示全部楼层
    关注一下,也准备学学这个
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-20 23:34 , Processed in 0.097460 second(s), 24 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表