|
以下是根据,网上流传的的CAN-bus现场总线基础教程【第3章】提供的测试程序,抄录下来
稍许改了下, 但是灯不会闪烁。 求指点
单片机源程序如下:
/************************************************************************************************
文件: main.c
功能: 测试SJA1000硬件连接,如果正常,D1以1S的周期闪烁,否则以0.1S的周期闪烁
************************************************************************************************/
#include "config.h" //包含头文件
#define T0_Mask 0x0F
//定义SJA1000 访问基地址
#define SJA_BASE_ADDR 0xA000
sbit D2 = P3^3; //定义LED
sbit D5 = P2^6; //定义LED
//定义一个指向外部存储空间的指针变量,并将其指向SJA1000访问的基地址
//(对SJA1000寄存器的读/写通过操作该指针来完成)
xdata unsigned char *SJA_CS_Point = (xdata unsigned char *)SJA_BASE_ADDR;
/******************************
**函数名称:Write_SJA_Reg
**函数功能:写SJA1000寄存器
**输入参数:RegAddr 寄存器起始地址
Value 寄存器的值
**输出参数:无
**返回值: 无
*********************************/
void Write_SJA_Reg(unsigned char RegAddr, unsigned char Value)
{
*(SJA_CS_Point+RegAddr) = Value; // 值付给基址+寄存器地址
return; // 返回继续
}
/******************************
**函数名称:Read_SJA_Reg
**函数功能:写SJA1000寄存器
**输入参数:RegAddr 寄存器起始地址
**输出参数:无
**返回值: 指针变量指向外部(基址+寄存器)的地址
*********************************/
//读SJA1000寄存器
//void Read_SJA_Reg(unsigned char RegAdr)
unsigned char Read_SJA_Reg(unsigned char RegAddr)
{
return(*(SJA_CS_Point+RegAddr)); // 返回指针指向的地址
}
/******************************
**函数名称:SJA1000_TestReg
**函数功能:测试函数,验证主控制器和SJA1000硬件连接
** REG_CAN_TEST 测试寄存器 ,地址0x09
**输入参数:无
**输出参数:无
**返回值: 1->硬件连接正常,可以通讯; 0->通讯故障
*********************************/
//测试SJA1000总线接口是否正常
char SJA1000_TestReg(void)
{//status 状态,1 = 正常;0 = 故障;
//temp 测试值
unsigned char temp,status,RegAddr;
status =1;
temp =0x55;
Write_SJA_Reg(REG_CAN_TEST, temp); //写入SJA1000测试寄存器
if(Read_SJA_Reg(RegAddr) != temp) //若读出值与写入值不同
{
status = 0; //则读/写SJA1000芯片出差
}
temp = 0xAA;
Write_SJA_Reg(REG_CAN_TEST, temp); //写入SJA1000测试寄存器
if(Read_SJA_Reg(RegAddr) != temp) //若读出值与写入值不同
{
status = 0; //则读/写SJA1000芯片出差
}
return(status); //通过SJA1000读/写测试
}
/*
******************************
精准延时函数
******************************
*/
//先定时器0初始化函数
void timerInit(void)
{
TMOD &= ~T0_Mask; //置零,清除旧设置(#define T0_Mask 0x0F)
TMOD |= 0x01; //置1, 设置新模式,16位定时器
}
//延时(0.01*n)s
/******************************
**函数名称:TimerDelay
**函数功能:通过使用定时器0实现精确延时
**输入参数:n -> 延时的10ms 的个数
**输出参数:无
**返回参数:无
*********************************/
void timerDelay(unsigned int n)
{
do
{//timer 装载,定时10ms
TL0 = Low_Byte(65536UL-CPUCLK/100);
TH0 = Hight_Byte(65536UL-CPUCLK/100);
//启动定时器timer
TR0 = 1;
//等待定时器timer溢出
while(!TF0);
//关闭定时器timer
TR0 = 0;
//清除溢出标志位
TF0 = 0;
}
//循环n次
while(--n != 0);
}
//主函数
void main(void)
{
timerInit();
D2 = 1;
D5 = 1;
//无限循环,main()函数不允许返回
for(;;)
{
if(SJA1000_TestReg()==1) //SJA1000测试正常
{
D2 = !D2;
timerDelay(100); //延时1000ms,既以1S闪烁
}
else //否则,SJA1000测试失败
{
D5 = !D5;
timerDelay(100); //延时100ms,既以0.1S闪烁
}
}
}
|
|