#define __CONFIG_H__

#include <8051.h> // 包含80C51寄存器定义头文件

#include "SJA1000REG.h" // 包含SJA1000寄存器定义头文件

// 定义取字节运算

#define LOW_BYTE(x) (unsigned char)(x)

#define HIGH_BYTE(x) (unsigned char)((unsigned int)(x) >> 8)

// 定义振荡器时钟和处理器时钟频率(用户可以根据实际情况作出调整)

#define OSCCLK 11059200UL

// 宏定义MCU的时钟频率

#define CPUCLK (OSCCLK / 12)

#endif // __CONFIG_H__

(1)置位模式寄存器Bit0位进入复位模式;SJA1000上电后处于复位状态,必须初始化后才能工作。

(2)设置时钟分频寄存器选择时钟频率、CAN模式;

(3)设置验收滤波,设定验证码和屏蔽码;

(4)设置总线定时器寄存器0、1设定CAN波特率;

(5)设置输出模式;

(6)清零模式寄存器Bit0位退出复位模式;

模式寄存器

只检测模式:SJA1000发送CAN帧时不检查应答位;

只听模式:此模式下SJA1000不会发送错误帧,用于自动检测波特率;SJA1000以不同的波特率接收CAN帧,当收到CAN帧时,表明当前波特率与总线波特率相同。

波特率设置

CAN总线无时钟,使用异步串行传输;波特率是1秒发送的数据位;

CAN帧发送:

发送CAN帧的步骤:1.检测状态寄存器,等待发送缓冲区可用;

2.填充报文到发送缓冲区;

3.启动发送。

SJA1000具有一个12字节的缓冲区,要发送的报文可以通过寄存器16-28写入,也可通过寄存器96-108写入或读出

设置发送模式

char SetSJASendCmd(unsigned char cmd) {

unsigned char ret;

switch (cmd) {

default:

case 0:

ret = SetBitMask(REG_CAN_CMR, TR_BIT); //正常发送

break;

case 1:

ret = SetBitMask(REG_CAN_CMR, TR_BIT|AT_BIT); //单次发送

break;

case 2:

ret = SetBitMask(REG_CAN_CMR, TR_BIT|SRR_BIT);//自收自发

break;

case 0xff:

ret = SetBitMask(REG_CAN_CMR, AT_BIT);//终止发送

break;

}

return ret;

}

发送函数

unsigned char SJA_CAN_Filter[8] = { // 定义验收滤波器的参数,接收所有帧

0x00, 0x00, 0x00, 0x00,

// ACR0~ACR3

0xff, 0xff, 0xff, 0xff

// AMR0~AMR3

};

unsigned char STD_SEND_BUFFER[11] = { // CAN 发送报文缓冲区

0x08, // 帧信息,标准数据帧,数据长度 = 8

0xEA, 0x60, // 帧ID = 0x753

0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa // 帧数据

};

void main(void) // 主函数,程序入口

{

timerInit();// 初始化

D1 = 0;

SJA1000_RST = 1; // 硬件复位SJA1000

timerDelay(50); // 延时500ms

SJA1000_RST = 0;

SJA1000_Init(0x00, 0x14, SJA_CAN_Filter); // 初始化SJA1000,设置波特率为1Mbps

// 无限循环,main()函数不允许返回