我原理图是这样
#include <STC12C.h>
#include <intrins.h>
#include "sjapelican.h"
#include "config.h"
#define uint unsigned int
#define uchar unsigned char
void mDelay(uint16 mtime)
{
for(; mtime > 0; mtime--)
{
uint8 j = 244;
while(--j);
}
}
void INT0_Data(void) interrupt 2
{//INT0дݼΪ݆˽дݼ
EA = 0;
Txd_data++; //զԢ݆˽ޡڻìҢΪսע̍ք˽ߝ
Peli_TXD();
P20 = 1;
P20 = 0;
EA = 1;
}
void Peli_RXD(void) interrupt 0
{//ޓ˕˽ߝگ˽ì՚אؾϱԌѲאַԃ
uint8 data Status;
EA = 0;//ژCPUא
Status = SJA_IR;
if(Status & RI_BIT)
{//IR.0 = 1 ޓ˕א
RX_buffer[0] = SJA_RBSR0;
RX_buffer[1] = SJA_RBSR1;
RX_buffer[2] = SJA_RBSR2;
RX_buffer[3] = SJA_RBSR3;
RX_buffer[4] = SJA_RBSR4;
RX_buffer[5] = SJA_RBSR5;
RX_buffer[6] = SJA_RBSR6;
RX_buffer[7] = SJA_RBSR7;
RX_buffer[8] = SJA_RBSR8;
RX_buffer[9] = SJA_RBSR9;
RX_buffer[10] = SJA_RBSR10;
RX_buffer[11] = SJA_RBSR11;
RX_buffer[12] = SJA_RBSR12;
SJA_CMR = RRB_BIT;
Status = SJA_ALC;//ˍיӃ̦ʱҶ݄զǷ
Status = SJA_ECC;//ˍխϳպëҶ݄զǷ
}
SJA_IER = RIE_BIT;// .0=1--ޓ˕אʹŜû
Rxd_data = RX_buffer[5];
EA = 1;//ղߪCPUא
}
void MCU_Init(void)
{
//CPUԵʼۯ
SJA_RST = 0;//SJA1000شλԐЧ
mDelay(10); //ғʱ
SJA_RST = 1;//CANПشλڜޅ,شλϞЧnnn
SJA_CS = 0;//CANПƬѡԐЧ
EX1 = 1;//ҿא1ʹŜûCANПޓ˕א
IT1 = 1;//ҿא0غҟҘԥע
IT0 = 0;//CANПޓ˕אì֍֧ƽԥע
EX0 = 1;//ղߪҿא0
EA = 1; //ղߪא
}
void main(void)
{
MCU_Init();
Peli_Init();
P20 = 1;
//mDelay(1);
while(1)
{
}
}
void Peli_Init(void)
{//SJA1000 քԵʼۯ
uint8 bdata Status;
do
{//.0=1---reset MODRe,ɫشλģʽìӔңʨ׃РӦք݄զǷ
//ֹδɫشλģʽìטشдɫ
SJA_MOD = RM_BIT |AFM_BIT;
Status = SJA_MOD ;
}
while(!(Status & RM_BIT));
SJA_CDR = CANMode_BIT|CLKOff_BIT;// CDR.3=1--ʱדژҕ, .7=0---basic CAN, .7=1---Peli CAN
SJA_BTR0 = 0x02;
SJA_BTR1 = 0x2f;//16MާֱìҨ͘Ê250Kbps
SJA_IER = RIE_BIT;// .0=1--ޓ˕אʹŜû .1=0--ژҕע̍אʹŜ
SJA_OCR = 0x1a;// Ƥ׃ˤԶ࠘׆݄զǷ
SJA_CMR = RRB_BIT;//ˍޓ˕ۺԥǷ
SJA_ACR0 = 0x01;
SJA_ACR1 = 0x02;
SJA_ACR2 = 0x03;
SJA_ACR3 = 0x04;//ԵʼۯҪʾë
SJA_AMR0 = 0xff;
SJA_AMR1 = 0xff;
SJA_AMR2 = 0xff;
SJA_AMR3 = 0xff;//ԵʼۯҚë
do
{//ȷѣɫؔޓ˕ģʽ
SJA_MOD = STM_BIT;
Status = SJA_MOD;
}
while( !(Status & STM_BIT) );
}//SJA1000 քԵʼۯ
void Peli_TXD( void )
{
uint8 data Status;
//ԵʼۯҪʾëͷхϢ
TX_buffer[0] = 0x88;//.7=0)չ֡û.6=0˽ߝ֡; .3=1˽ߝӤ
TX_buffer[1] = 0x01;//Ѿޚַ֣֘
TX_buffer[2] = 0x02;//
TX_buffer[3] = 0x03;//
TX_buffer[4] = 0x04;//
//Եʼۯע̍˽ߝեԪ
TX_buffer[5] = Txd_data;
TX_buffer[6] = 0x22;
TX_buffer[7] = 0x33;
TX_buffer[8] = 0x44;//
TX_buffer[9] = 0x55;//
TX_buffer[10] = 0x66;//
TX_buffer[11] = 0x77;//
TX_buffer[12] = 0x88;//
do
{
Status = SJA_SR;
}
while( Status & RS_BIT); //SR.4=1 ֽ՚ޓ˕ìֈս
do
{
Status = SJA_SR;
}
while(!(Status & TCS_BIT)); //SR.3=0,ע̍ȫȳδԦmΪìֈս
do
{
Status = SJA_SR;
}
while(!(Status & TBS_BIT)); //SR.2=0,ע̍ۺԥǷѻ̸cֈս
SJA_TBSR0 = TX_buffer[0];
SJA_TBSR1 = TX_buffer[1];
SJA_TBSR2 = TX_buffer[2];
SJA_TBSR3 = TX_buffer[3];
SJA_TBSR4 = TX_buffer[4];
SJA_TBSR5 = TX_buffer[5];
SJA_TBSR6 = TX_buffer[6];
SJA_TBSR7 = TX_buffer[7];
SJA_TBSR8 = TX_buffer[8];
SJA_TBSR9 = TX_buffer[9];
SJA_TBSR10 = TX_buffer[10];
SJA_TBSR11 = TX_buffer[11];
SJA_TBSR12 = TX_buffer[12];
SJA_CMR = SRR_BIT;//׃λؔע̍ޓ˕ȫȳ
while(SJA_SR != TCS_BIT);
}
为啥注释是乱码
基于51单片机SJA1000 CAN通讯实现(代码+原理图)
https://blog.csdn.net/chen1658137632/article/details/116381159