У меня есть плата разработки 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
}}