Can is sending more messages than I want to send KEA128

取消
显示结果 
显示  仅  | 搜索替代 
您的意思是: 

Can is sending more messages than I want to send KEA128

767 次查看
emilioaronmoyer
Contributor III

Hello,

I'm using Kea 128 an I'm want to send an standard id message, i can do that ( send the message with the correct id and data), but there are been sent also 2 more messages that I don't want to send, they have random ids and random data.

I don't know if my configuration it's ok. I put it down:

 

void MSCAN_init(void){

  SIM_PINSEL1 &= ~SIM_PINSEL1_MSCANPS_MASK; // SIM_PINSEL1: MSCANPS=0; PTC6 PTC7

  CONFIG_PIN_AS_GPIO(PORT_C,MSCANRX,INPUT); /* Configure (PTC6) as an intput RX*/

  CONFIG_PIN_AS_GPIO(PORT_C,MSCANTX,OUTPUT); /* Configure (PTC7) as an output TX*/

 

  SIM_SCGC |=  SIM_SCGC_MSCAN_MASK; // Enable bus clock iN MSCAN

 

  MSCAN_CANCTL1 |= MSCAN_CANCTL1_CANE_MASK;           // Enable CAN mode

  MSCAN_CANCTL0 |= MSCAN_CANCTL0_INITRQ_MASK;         // Enable INIT mode

  MSCAN_CANCTL1 |= MSCAN_CANCTL1_INITAK_MASK;         // Enable INIT mode

  while ((MSCAN_CANCTL1&0x01)!=1);                    // wait for initialization mode

 

  MSCAN_CANCTL1 |= MSCAN_CANCTL1_CLKSRC_MASK;      // Enable CLK source

  MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_LISTEN_MASK;      // 0 Normal operation.

  MSCAN_CANCTL1 |= MSCAN_CANCTL1_WUPM_MASK;      // 1 MSCAN wakes only in case of a dominant pulse on the CAN bus that has a length of Twup.

  MSCAN_CANBTR0 = 0x01;       //PRESCALADOR CLKBUS/2 10MHz  SI QUIERO 100KHz PREESCALADOR DEBE SER 0x09 CLKBUS/10 2MHZ

  MSCAN_CANBTR1 = 0xDC;//0xBE; //3E SG1= 15, SG2= 4 SG1+SG2+1=20   10MHz/20=500 KHz) SG2 20-25% TIME QUANTA

  //BE 1 Three samples per bit. In this case, PHASE_SEG1 must be at least 2 time quanta (Tq).

  MSCAN_CANIDAC = 0x10; // 16 bit acceptance filter

 

  MSCAN_CANIDAR0=0XFF;

  MSCAN_CANIDAR1=0XFF;

  MSCAN_CANIDAR2=0XFF;

  MSCAN_CANIDAR3=0XFF;

  MSCAN_CANIDAR4=0XFF;

  MSCAN_CANIDAR5=0XFF;

  MSCAN_CANIDAR6=0XFF;

  MSCAN_CANIDAR7=0XFF;

 

  MSCAN_CANIDMR0=0XFF;

  MSCAN_CANIDMR1=0XFF;

  MSCAN_CANIDMR2=0XFF;

  MSCAN_CANIDMR3=0XFF;

  MSCAN_CANIDMR4=0XFF;

  MSCAN_CANIDMR5=0XFF;

  MSCAN_CANIDMR6=0XFF;

  MSCAN_CANIDMR7=0XFF;

 

  MSCAN_CANCTL0 &= ~MSCAN_CANCTL0_INITRQ_MASK;         // Disable INIT mode

  MSCAN_CANCTL1 &= ~MSCAN_CANCTL1_INITAK_MASK;         // Disable INIT mode

  while ((MSCAN_CANCTL1&0x00) != 0); // wait for normal board

 

  MSCAN_CANCTL0 |= MSCAN_CANCTL0_TIME_MASK;           // time stamping

  MSCAN_CANRIER=0XFF;

 

  while ((MSCAN_CANCTL0 & MSCAN_CANCTL0_SYNCH_MASK) != MSCAN_CANCTL0_SYNCH_MASK);

 

  MSCAN_CANRIER |= MSCAN_CANRIER_RXFIE_MASK ;//0x01; //receive interrupt enabled

  MSCAN_CANRFLG |= MSCAN_CANRFLG_RXF_MASK;//0x01; //receive interrupt enabled

 

  CONFIG_PIN_AS_GPIO(PORT_G,CANTRANSEIVER,OUTPUT); //! MC33901 STB, Mapped from GPIOB16

  OUTPUT_CLEAR(PORT_G,CANTRANSEIVER); //PIN STB ACTIVA CON 0

}

 

 

void MSCAN_Tx(uint16_t ID,uint8_t DLC,uint32_t dataw1,uint32_t dataw0){

  uint16_t can_id=0;

  uint8_t txcanbuffer=0;

  txcanbuffer = MSCAN_CANTFLG; /* read transmit flag */

  txcanbuffer&=0x07;

  if(txcanbuffer!=0){

  led_off(LED3); //PRENDER UN LED

  /************* select one among 3 buffers *************/

  MSCAN_CANTBSEL = txcanbuffer; /* write the value back to Can select register */

  txcanbuffer = MSCAN_CANTBSEL;

 

 

  can_id=ID>>3;

  can_id &= 0xFF;

  MSCAN_TSIDR0  = (uint8_t)can_id;//0xFB;    frame id// standard frame has 2 registers involved

  can_id=ID <<5;

  can_id &= 0xFF;

  MSCAN_TEIDR1 = (uint8_t)can_id; //7DF OBD2READ OJO EREROR EN LOS REGISTROS MSCAN_TSIDR1=

  MSCAN_TSIDR1=0;

  MSCAN_TEIDR2 = 0;

  MSCAN_TEIDR3 = 0;

 

  MSCAN_TDLR = DLC;         //Data frame length

 

 

 

  MSCAN_TEDSR0 = (uint8_t) ((dataw1>>24)&0xFF);

  MSCAN_TEDSR1 = (uint8_t) ((dataw1>>16)&0xFF);

  MSCAN_TEDSR2 = (uint8_t) ((dataw1>>8)&0xFF);

  MSCAN_TEDSR3 = (uint8_t) dataw1&0xFF;

  MSCAN_TEDSR4 = (uint8_t) ((dataw0>>24)&0xFF);

  MSCAN_TEDSR5 = (uint8_t) ((dataw0>>16)&0xFF);

  MSCAN_TEDSR6 = (uint8_t) ((dataw0>>8)&0xFF);

  MSCAN_TEDSR7 = (uint8_t) dataw0&0xFF;

 

 

  MSCAN_TBPR = 1;              /* local priority */

  MSCAN_CANTFLG |= 1;

 

 

  }

  }

  else{

  led_on(LED3); //PRENDER UN LED

  }

}

 

The message I want have the correct Id and the correct data, but other messages are been sent with random id and data.

Can somebody check the code and help me.

 

I attached the complete project.

 

regards,

 

Emilio

Original Attachment has been moved to: prueba2.rar

标签 (1)
0 项奖励
1 回复

475 次查看
dastek
Contributor III

Try this.  It works for me on a 9sDG256.

void CAN_tx(void)

{

UINT8  Na_CAN;

CAN0TBSEL = CAN0TFLG;          // Sellect lowest available CAN buffer  AN3034.pdf

Na_CAN = CAN0TBSEL;               // Save buffer to send on

     Fill buffer and data length register with data to send

CAN0TFLG = Na_CAN;                    // Start transmit

}

I think you are sending CAN buffers that you have not filled with data yet when you select the transmit in your routine.

The CAN interface is very elegant once you figure out how it works.

Regards,

Wade

0 项奖励