找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 748|回复: 0
收起左侧

单片机+SJA1000硬件连接测试程序没有达到书上说的闪烁

[复制链接]
ID:53813 发表于 2022-11-23 14:22 | 显示全部楼层 |阅读模式
以下是根据,网上流传的的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闪烁
                }
        }
}

project-SJA1000 51.rar

37.49 KB, 下载次数: 6

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表