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
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