mc9s12xs128的can模块

2019-07-15 17:30发布

哪位高手帮我分析一下这个程序不能同时收发can报文的问题啊,程序如下
/*
* File: ert_main.c
*
* Code generated for Simulink model 'p60010'.
*
* Model version                  : 1.107
* Simulink Coder version         : 8.2 (R2012a) 29-Dec-2011
* TLC version                    : 8.2 (Dec 29 2011)
* C/C++ source code generated on : Wed Jan 13 12:01:14 2016
*
* Target selection: ert.tlc
* Embedded hardware selection: Freescale->S12x
* Code generation objectives: Unspecified
* Validation result: Not run
*/


#include "p60010.h"                    /* Model's header file */
#include "rtwtypes.h"                  /* MathWorks types */
#include <hidef.h>
#include "derivative.h"
#include "CAN.h"
#include "p60010_types.h"
#include "p60010_private.h"
#include <MC9S12XS128.h>     /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12xs128"


#define  BUS_CLOCK           32000000       //总线频率
#define  OSC_CLOCK           16000000       //晶振频率

#define ID1                  0x702       //发送标识符
#define data_len_TX          8           //发送数据长度


long i=0;
long j=0;
unsigned char k;
struct can_msg msg_send, msg_get;


void INIT_PLL(void)
{
    CLKSEL &= 0x7f;       //set OSCCLK as sysclk
    PLLCTL &= 0x8F;       //Disable PLL circuit
    CRGINT &= 0xDF;
   
    #if(BUS_CLOCK == 40000000)
      SYNR = 0x44;
    #elif(BUS_CLOCK == 32000000)
      SYNR = 0x43;     
    #elif(BUS_CLOCK == 24000000)
      SYNR = 0x42;
    #endif

    REFDV = 0x81;         //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M
    PLLCTL =PLLCTL|0x70;  //Enable PLL circuit
    asm NOP;
    asm NOP;
    while(!(CRGFLG&0x08)); //PLLCLK is Locked already
    CLKSEL |= 0x80;        //set PLLCLK as sysclk
}


void delay()
{for(i=0;i<1000;i++)
for(j=0;j<640;j++);}




void rt_OneStep(void);
void rt_OneStep(void)
{
  static boolean_T OverrunFlag = 0;

  /* Disable interrupts here */

  /* Check for overrun */
  if (OverrunFlag) {
    rtmSetErrorStatus(p60010_M, "Overrun");
    return;
  }

  OverrunFlag = TRUE;


  /* Set model inputs here */

  /* Step the model */
  p60010_step();

  /* Get model outputs here */
  DDRA=0xff;
  relay=PORTA_PA0;
  /* Indicate task complete */
  OverrunFlag = FALSE;

}


void main(void)
{
  /* Initialize model */
  p60010_initialize();
  DDRA=0xff;
  INIT_PLL();
  INIT_CAN0();


  while (1) {
    /*  Perform other application tasks here */
  rt_OneStep();
  
  for(k=0;k<8;k++)
  {
  msg_send.id = 0x702;            //message1
  msg_send.data[0] = p702_byte0;
  msg_send.data[1] = 0;
  msg_send.data[2] = 0;
  msg_send.data[3] = 0;
  msg_send.data[4] = 0;
  msg_send.data[5] = 0;
  msg_send.data[6] = 0;
  msg_send.data[7] = 0;}
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty = 0;
  if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
  for(;;);
  
  {msg_send.id = 0x704;            //message2
  msg_send.data[0] = p704_byte0;
  msg_send.data[1] = p704_byte1;
  msg_send.data[2] = p704_byte2;
  msg_send.data[3] = 0;
  msg_send.data[4] = 0;
  msg_send.data[5] = 0;
  msg_send.data[6] = 0;
  msg_send.data[7] = 0;}
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty = 0;
  if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
  for(;;);
  
  {msg_send.id = 0x666;            //message3
  msg_send.data[0] = p666_byte0;
  msg_send.data[1] = p666_byte1;
  msg_send.data[2] = 0;
  msg_send.data[3] = 0;
  msg_send.data[4] = 0;
  msg_send.data[5] = 0;
  msg_send.data[6] = 0;
  msg_send.data[7] = 0;}
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty = 0;
  if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
  for(;;);
  
if(MSCAN0GetMsg(&msg_get)) //接收报文
{ if(msg_get.id==0x705&&(!msg_get.RTR))
CAN0RXDSR1=p705_byte0;}
if(msg_get.id==0x701&&(!msg_get.RTR))
{CAN0RXDSR4=p701_byte4;CAN0RXDSR5=p701_byte5;}
else {for(;;);
}
  /* Disable rt_OneStep() here */

  /* Terminate model */
  p60010_terminate();
  }
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
wangliang333
1楼-- · 2019-07-15 18:24
以前只玩过单独接收或者单独发送,这次遇到同时接收和发送不会了
wangyuan0203
2楼-- · 2019-07-15 21:02
学习一下,谢谢!
飞奔的小鹿
3楼-- · 2019-07-16 01:13
wangliang333 发表于 2016-1-18 12:17
以前只玩过单独接收或者单独发送,这次遇到同时接收和发送不会了

大哥,能报你单独发送的程序发一个到我邮箱么,562371938@qq.com,我现在在写一个单独发送的测试代码,数据老是发不出去,能把你的代码借我参考下么
shorway
4楼-- · 2019-07-16 05:47
can是单工收发,不可能同时收发,两根线是canH和canL不是收发!
woriaty
5楼-- · 2019-07-16 09:07
 精彩回答 2  元偷偷看……
fanning范宁
6楼-- · 2019-07-16 13:42

飞思卡尔 S9S12 和 MC9S12 系列 需要资料,样品或是烧录问题的,联系Q2716106851

一周热门 更多>