1. 必备条件<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
C51芯片一片、SJA1000一片、PCA82C250一片、晶振两个、电阻电容若干
示波器、5v电源、万用表、51烧录器、程序编译平台
2. 知识背景
单片机基础
3. 硬件连接
原理图
请见附件。
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />测试硬件接口:往测试寄存器中写入0x55,读出该测试寄存器的数据,如为0x55,再往测试寄存器中写入0xAA,读出该测试寄存器中的数据,如为0xAA,则硬件接口正确,否则,请检测硬件接口
测试程序:
void BCAN_TEST()
{
BCANADR=TEST;
*BCANADR=0X55;
if(*BCANADR==0X55)
{
P10=~P10;
}
else
{
P11=~P11;
}
}
4. 软件问题
程序分为初始化和发送接收程序,其中的初始化程序是关键,要仔细阅读SJA1000的datasheet方能做到运用自如。其中的发送接收程序比较简单,理解头信息是关键,头信息包括ID和数据长度及数据帧和远程帧的选择。
已测试好的发送程序如下:
#include<reg51.h>
#define BTEST 0XFE09
#define CR 0xFD00
#define CMR 0xFD01
#define SR 0xFD02
#define IR 0xFD03
#define ACR 0xFD04
#define AMR 0xFD05
#define BTR0 0xFD06
#define BTR1 0xFD07
#define OCR 0xFD08
#define TXB0 0xFD0A
#define TXB1 0xFD0B
#define TXB2 0xFD0C
#define TXB3 0xFD0D
#define TXB4 0xFD0E
#define TXB5 0xFD0F
#define TXB6 0xFD10
#define TXB7 0xFD11
#define TXB8 0xFD12
#define TXB9 0xFD13
#define CDR 0xFE1F
unsigned char xdata *BCANADR;
bit InRST()
{
EA=0;
BCANADR=CR;
*BCANADR=0X21;
if(*BCANADR==0X21)
{
return 1; //成功进入复位模式
}
else
{
return 0;
}
}
bit OutRST()
{
EA=0;
BCANADR=CR;
*BCANADR=0X20;
if(*BCANADR==0X20)
{
return 1; //成功退出复位模式
}
else
{
return 0;
}
}
void InitSJA()
{
BCANADR=BTR0;
*BCANADR=0X00;
BCANADR=BTR1;
*BCANADR=0X1C; //BPS=500k,fosc=16MHz
BCANADR=CDR;
*BCANADR=0X48; //Basic模式,终止输入比较器,关闭时钟输出
BCANADR=ACR;
*BCANADR=0XAA;
BCANADR=AMR;
*BCANADR=0XFF; //验收代码
BCANADR=OCR;
*BCANADR=0X1A; //正常输出模式
}
void SendMsg()
{
BCANADR=CMR;
*BCANADR=0X04;
BCANADR=TXB0;
*BCANADR=0X40;
BCANADR=TXB1;
*BCANADR=0X48; //RTR=0 发送数据帧
BCANADR=TXB2;
*BCANADR=0X11;
BCANADR=TXB3;
*BCANADR=0X22;
BCANADR=TXB4;
*BCANADR=0X33;
BCANADR=TXB5;
*BCANADR=0X44;
BCANADR=TXB6;
*BCANADR=0X66;
BCANADR=TXB7;
*BCANADR=0X77;
BCANADR=CMR;
*BCANADR=0X01; //发送置位
}
void delay()
{
int x;
for(x=0;x<100;x++)
{;}
}
main()
{
while(1)
{
P17=0;
delay(); //延时
P17=1;
P2=0;
InRST(); //复位
InitSJA(); //初始化SJA
OutRST(); //退出复位
SendMsg(); //发送数据
delay(); //延时
}
}
5. 调试问题
1. BPS不一致,出现Errorframe
2. CBP(CDR.6)位设置问题,如果该位不置位时,且硬件接口中RX1,TX1均悬空的话,将出现Errorframe,解决方法有二(1 CBP置位;2 RX1端接入约2.5v电压)
6. 基址问题
1. C51是通过片选方式控制SJA1000的。
2. 基址和硬件连接是相联系的,如果CS端和地连接,高8位可以是任意的,当CS端和P2口的一脚连接时,则基址是所接脚所在位为0,其余7位取1,组成其高8位。
用户330599 2011-4-27 11:15