#include "F28x_Project.h" #include "F2837xS_device.h" #include "F2837xS_Examples.h" #include "hw_can.h" bool LedFlag0 = 0; typedef struct { uint32_t ui32MsgID; unsigned char uc8MsgData[8]; }CanMsgObject; CanMsgObject CanTXTest; extern void InitCANMessage(CanMsgObject *msg); void CanMsgSend(uint32_t ID, unsigned char Data[8]) { /* * Transfer direction: IF1/IF2 Register -> Message object * Arbitration & Control & DATA_A & DATA_B Bits could be changed * Use message RAM 01 */ while(CanaRegs.CAN_IF1CMD.bit.Busy); CanaRegs.CAN_IF1CMD.bit.DIR = 1; CanaRegs.CAN_IF1CMD.bit.Arb = 1; CanaRegs.CAN_IF1CMD.bit.Control = 1; CanaRegs.CAN_IF1CMD.bit.DATA_A = 1; CanaRegs.CAN_IF1CMD.bit.DATA_B = 1; CanaRegs.CAN_IF1CMD.bit.MSG_NUM = 1; //Disable Mask CanaRegs.CAN_IF1MSK.all = 0; /* * Enable mailbox & Transmit direction * ID[28:18] */ CanaRegs.CAN_IF1ARB.bit.Dir = 1; CanaRegs.CAN_IF1ARB.bit.MsgVal = 1; CanaRegs.CAN_IF1ARB.bit.ID = ((ID << 18) & 0x1FFC0000); /* * Need to be sent * Set this message as the last one * Data length is 8 */ CanaRegs.CAN_IF1MCTL.bit.TxRqst = 1; CanaRegs.CAN_IF1MCTL.bit.EoB = 1; CanaRegs.CAN_IF1MCTL.bit.DLC = 8; CanaRegs.CAN_IF1DATA.bit.Data_0 = Data[0]; CanaRegs.CAN_IF1DATA.bit.Data_1 = Data[1]; CanaRegs.CAN_IF1DATA.bit.Data_2 = Data[2]; CanaRegs.CAN_IF1DATA.bit.Data_3 = Data[3]; CanaRegs.CAN_IF1DATB.bit.Data_4 = Data[4]; CanaRegs.CAN_IF1DATB.bit.Data_5 = Data[5]; CanaRegs.CAN_IF1DATB.bit.Data_6 = Data[6]; CanaRegs.CAN_IF1DATB.bit.Data_7 = Data[7]; } void main(void) { InitCANMessage(&CanTXTest); InitSysCtrl(); InitGpio(); //GPIO GPIO_SetupPinMux(12, GPIO_MUX_CPU1, 0); GPIO_SetupPinOptions(12, GPIO_OUTPUT, GPIO_PUSHPULL); GPIO_SetupPinMux(30, GPIO_MUX_CPU1, 1); GPIO_SetupPinOptions(30, GPIO_INPUT, GPIO_ASYNC); GPIO_SetupPinMux(31, GPIO_MUX_CPU1, 1); GPIO_SetupPinOptions(31, GPIO_OUTPUT, GPIO_PUSHPULL); InitCAN(); /* * Bit rate set (Protected by CCE bit) * Choose XTAL (CANABCLKSEL = 01) Tq = (BRP+1)*Toscclk * Tbit = [(SJW+1)+(TSEG1+1)+(TSEG2+1)]*Tq * Band Rate = 1/Tbit = CANCLK/(BRP+1)*(TSEG2+TESG1+SJW+3) * CAN_O_BTR = 0b0[15] TESG2[14:12] TSEG1[11:8] SJW[7:6] BRP[5:0] * 0x00000141 -> CANCLK/(2*10) = 10/20 Mbps */ ClkCfgRegs.CLKSRCCTL2.bit.CANABCLKSEL = 1; CanaRegs.CAN_CTL.bit.CCE = 1; CanaRegs.CAN_BTR.all = 0x00002501; CanaRegs.CAN_CTL.bit.CCE = 0; CanaRegs.CAN_CTL.bit.Init = 0; for(;;) { CanMsgSend(CanTXTest.ui32MsgID,CanTXTest.uc8MsgData); LedFlag0=LedFlag0==0?1:0; GPIO_WritePin(12,LedFlag0); DELAY_US(1000*1000); } } void InitCANMessage(CanMsgObject *msg) { msg->ui32MsgID = 0x0020; msg->uc8MsgData[0] = 0; msg->uc8MsgData[1] = 1; msg->uc8MsgData[2] = 2; msg->uc8MsgData[3] = 3; msg->uc8MsgData[4] = 4; msg->uc8MsgData[5] = 5; msg->uc8MsgData[6] = 6; msg->uc8MsgData[7] = 7; }