|
以下是根據(jù),網(wǎng)上流傳的的CAN-bus現(xiàn)場總線基礎(chǔ)教程【第3章】提供的測試程序,抄錄下來
稍許改了下, 但是燈不會(huì)閃爍。 求指點(diǎn)
單片機(jī)源程序如下:
/************************************************************************************************
文件: 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
//定義一個(gè)指向外部存儲(chǔ)空間的指針變量,并將其指向SJA1000訪問的基地址
//(對(duì)SJA1000寄存器的讀/寫通過操作該指針來完成)
xdata unsigned char *SJA_CS_Point = (xdata unsigned char *)SJA_BASE_ADDR;
/******************************
**函數(shù)名稱:Write_SJA_Reg
**函數(shù)功能:寫SJA1000寄存器
**輸入?yún)?shù):RegAddr 寄存器起始地址
Value 寄存器的值
**輸出參數(shù):無
**返回值: 無
*********************************/
void Write_SJA_Reg(unsigned char RegAddr, unsigned char Value)
{
*(SJA_CS_Point+RegAddr) = Value; // 值付給基址+寄存器地址
return; // 返回繼續(xù)
}
/******************************
**函數(shù)名稱:Read_SJA_Reg
**函數(shù)功能:寫SJA1000寄存器
**輸入?yún)?shù):RegAddr 寄存器起始地址
**輸出參數(shù):無
**返回值: 指針變量指向外部(基址+寄存器)的地址
*********************************/
//讀SJA1000寄存器
//void Read_SJA_Reg(unsigned char RegAdr)
unsigned char Read_SJA_Reg(unsigned char RegAddr)
{
return(*(SJA_CS_Point+RegAddr)); // 返回指針指向的地址
}
/******************************
**函數(shù)名稱:SJA1000_TestReg
**函數(shù)功能:測試函數(shù),驗(yàn)證主控制器和SJA1000硬件連接
** REG_CAN_TEST 測試寄存器 ,地址0x09
**輸入?yún)?shù):無
**輸出參數(shù):無
**返回值: 1->硬件連接正常,可以通訊; 0->通訊故障
*********************************/
//測試SJA1000總線接口是否正常
char SJA1000_TestReg(void)
{//status 狀態(tài),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讀/寫測試
}
/*
******************************
精準(zhǔn)延時(shí)函數(shù)
******************************
*/
//先定時(shí)器0初始化函數(shù)
void timerInit(void)
{
TMOD &= ~T0_Mask; //置零,清除舊設(shè)置(#define T0_Mask 0x0F)
TMOD |= 0x01; //置1, 設(shè)置新模式,16位定時(shí)器
}
//延時(shí)(0.01*n)s
/******************************
**函數(shù)名稱:TimerDelay
**函數(shù)功能:通過使用定時(shí)器0實(shí)現(xiàn)精確延時(shí)
**輸入?yún)?shù):n -> 延時(shí)的10ms 的個(gè)數(shù)
**輸出參數(shù):無
**返回參數(shù):無
*********************************/
void timerDelay(unsigned int n)
{
do
{//timer 裝載,定時(shí)10ms
TL0 = Low_Byte(65536UL-CPUCLK/100);
TH0 = Hight_Byte(65536UL-CPUCLK/100);
//啟動(dòng)定時(shí)器timer
TR0 = 1;
//等待定時(shí)器timer溢出
while(!TF0);
//關(guān)閉定時(shí)器timer
TR0 = 0;
//清除溢出標(biāo)志位
TF0 = 0;
}
//循環(huán)n次
while(--n != 0);
}
//主函數(shù)
void main(void)
{
timerInit();
D2 = 1;
D5 = 1;
//無限循環(huán),main()函數(shù)不允許返回
for(;;)
{
if(SJA1000_TestReg()==1) //SJA1000測試正常
{
D2 = !D2;
timerDelay(100); //延時(shí)1000ms,既以1S閃爍
}
else //否則,SJA1000測試失敗
{
D5 = !D5;
timerDelay(100); //延時(shí)100ms,既以0.1S閃爍
}
}
}
|
|