Может кто-нибудь выложить простой код CAN TX и CAN RX для платы разработки PIC32MK1024GPE100? - PullRequest
0 голосов
/ 08 июля 2019

У меня есть плата разработки PIC32MK1024GPE100. Я хочу установить связь CAN с другим микроконтроллером PIC. Я написал код для CAN TX, но сигнал на CANH и CANL не был обнаружен (проверено с помощью осциллографа). На плате есть встроенный согласующий резистор 120 Ом и используемый в нем приемопередатчик банок MCP2561.

Вот код, который я написал

    #ifndef _CAN1_H    /* Guard against multiple inclusion */
#define _CAN1_H
struct txCMSGSID{
    unsigned sid:11;
    unsigned:21;
};
struct txCMSGEID{

   unsigned dlc:4;
   unsigned rb0:1;
   unsigned :3;
   unsigned rb1:1;
   unsigned rtr:1;
   unsigned eid:18;
   unsigned ide:1;
   unsigned srr:1;
   unsigned :2;
};
struct txCMSGDATA0{
    unsigned databyte0:8;
    unsigned databyte1:8;
    unsigned databyte2:8;
    unsigned databyte3:8;
};
struct txCMSGDATA1{
    unsigned databyte4:8;
    unsigned databyte5:8;
    unsigned databyte6:8;
    unsigned databyte7:8;
};
union uCANtxMessageBuffer{
    struct{
        struct txCMSGSID CMSGSID;
        struct txCMSGEID CMSGEID;
        struct txCMSGDATA0 CMSDATA0;
        struct txCMSGDATA1 CMSDATA1;
    };
    int MessageWord[4];
};
#endif

    #include <proc/p32mk0512mcf064.h>
#include <xc.h>
#include <sys/attribs.h>
#include "can1.h"
#include "kmem1.h"
//#include <kmem.h>

//int message;//tracks the message buffer
unsigned int CanFifo[16];
//unsigned int *currentMessageBuffer;//points to the message buffer to be written
//  setting t1=0.5us as PBCLK5=20MHz and BRP=4;
union uCANtxMessageBuffer *transmitMessage;
void can_init()
{
    PB5DIVbits.PBDIV=0;//Setting PBCLK5=SYSCLK i.e. at 20MHz
    PB5DIVbits.ON=1;
    C3CONbits.ON=1;
    C3CONbits.REQOP=4;//Set to Configuration Mode
    while(C3CONbits.OPMOD!=4);
    C3CFGbits.SEG2PH=1;
    C3CFGbits.SEG2PHTS=1;
    C3CFGbits.SEG1PH=1;
    C3CFGbits.PRSEG=2;
    C3CFGbits.SAM=0;
    C3CFGbits.SJW=0;
    C3CFGbits.BRP=4;
    C3FIFOCON0bits.FSIZE = 2;//2 MESSAGE BUFFER OF FIFO0
    C3FIFOCON0bits.TXEN=1;//setting it as a transmit buffer


 }

    void main(void)
{
 can_init();
  while(1){


      C3FIFOBA = KVA_TO_PA(CanFifo);


     C3CONbits.REQOP = 0;


     while(C3CONbits.OPMOD != 0);
        //transmission of 1st message
        //message to be transmitted is =0x12BC1245

        transmitMessage = (union uCANtxMessageBuffer*)(PA_TO_KVA1(C3FIFOUA0));
        transmitMessage->CMSGSID.sid = 0x100; //CMSGSID 
        transmitMessage->CMSGEID.ide = 0;
        transmitMessage->CMSGEID.dlc = 0x4;
        transmitMessage->CMSDATA0.databyte3=0x45;
        transmitMessage->CMSDATA0.databyte2=0x12;
        transmitMessage->CMSDATA0.databyte1=0xBC;
        transmitMessage->CMSDATA0.databyte0=0x12;
        transmitMessage->MessageWord[2] =0x12BC1245; //CMSGDAT0 
        C3FIFOCON0bits.UINC=1;//Set the UINC bit
       C3FIFOCON0bits.TXREQ=1; //Set the TXREQ bit
        }}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...