📄 hardware.c
字号:
sjaMOD &= 0xF7;
writeCANreg(SJA_MOD, sjaMOD);
if(shield_flag == 0) //所有数据全部接收信号板和继电器板
{
writeCANreg(SJA_DLC, 0x00); //验收代码双个验收滤波器
writeCANreg(SJA_ID1, 0x00);
writeCANreg(SJA_ID2, 0x00);
writeCANreg(SJA_ID3, 0x00);
writeCANreg(SJA_ID4, 0xFF); // 验收屏蔽
writeCANreg(SJA_DAT1, 0xFF);
writeCANreg(SJA_DAT2, 0xFF);
writeCANreg(SJA_DAT3, 0xFF);
}
else
{
shield_ID = soID+0xC0; //只接收与本地址soID相符的数据
writeCANreg(SJA_DLC, 0x00); //验收代码 验收滤波器1
writeCANreg(SJA_ID1, shield_ID); //取同或逻辑
writeCANreg(SJA_ID2, 0x00); //验收代码 验收滤波器2 //接收广播地址
writeCANreg(SJA_ID3, 0xFF);
writeCANreg(SJA_ID4, 0xFF); // 验收屏蔽
writeCANreg(SJA_DAT1, 0xC1);
writeCANreg(SJA_DAT2, 0xFF); // 验收屏蔽
writeCANreg(SJA_DAT3, 0xC0);
}
writeCANreg(SJA_EWLR, 0x6E); //设置错误报警限制寄存器 = 110
writeCANreg(SJA_RXERR, 0x00); //设置接收和发送错误计数寄存器的值都为0
writeCANreg(SJA_TXERR,0x00);
writeCANreg(SJA_BTR0, 0x43); // 波特率: 100Kbit/s @ 16 MHz
writeCANreg(SJA_BTR1, 0xAF); // //writeCANreg(SJA_BTR1, 0x2F); 高于125KB/S低于125KB/S
writeCANreg(SJA_OCR, 0x1A); // 输出控制寄存器SJA_OCR = 0x1A; 悬空TX1, 推挽TX0,正常输出模式
sjaMOD = readCANreg(SJA_MOD); //进入工作模式
uiCount = 0;
while ((sjaMOD & 0x01) != 0) //判断是否复位 modify?????
{
uiCount++;
writeCANreg(SJA_MOD, 0x00);
sjaMOD = readCANreg(SJA_MOD);
if(uiCount>1000)
{
break;
}
}
writeCANreg(SJA_IER, 0x01); // SJA_IER |= 0x01; 使能接收中断
EX0 = 1;
}
/////////////////////////////////////////////////////////////////////////////////////////
//void writeCANdata(unsigned char* uchCanData)
//入口参数:要写入SJA1000的数据
//函数返回:无
//全局变量:无
//功能描述:把数据写入SJA1000,并发送
//函数说明:
//编写人: 郑福
/////////////////////////////////////////////////////////////////////////////////////////
void writeCANdata(unsigned char *uchCanData)
{
unsigned char idata sjaSR;
unsigned int idata uiCount = 0;
unsigned char uchFlage = 1;
unsigned char uchFlageCount = 0;
while (uchFlage == 1 && uchFlageCount < 4)
{
uchFlage = 0;
uchFlageCount++;
FeedDog();
/* do
{
uiCount++;
sjaSR = readCANreg(SJA_SR);
if (uch_Count>6000)
{
uchFlage = 1;
CAN_Init(uchHWCPUAdress,1); //CAN初始化放在何处?????
uiCount = 0;
writeCANreg(SJA_CMR, 0x02);
break;
}
}
while ((sjaSR&0x08) == 0); //判断上次发送是否完成,未完成等待发送完成 SR.3 == 0 未完成等待发送完成
*/
uiCount = 0;
do
{
uiCount++;
FeedDog();
sjaSR = readCANreg(SJA_SR);
if (uiCount>10000)
{
uchFlage = 1;
CAN_Init(uchHWCPUAdress,1); //CAN初始化放在何处?????
uiCount = 0;
break;
}
}
while ((sjaSR&0x04)==0); //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
uiCount = 0;
/* do
{
uiCount++;
sjaSR = readCANreg(SJA_SR);
if (uiCount>10000)
{
uchFlage = 1;
CAN_Init(uchHWCPUAdress,1); //CAN初始化放在何处?????
uiCount = 0;
break;
}
}
while ((sjaSR&0x40)==0x40); //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
*/
while(1)
{
uiCount++;
FeedDog();
StopCan();
sjaSR = readCANreg(SJA_SR);
if((sjaSR&0x40) == 0x40)
{
StartCan();
}
else
{
break;
}
if (uiCount>10000)
{
uchFlage = 1;
CAN_Init(uchHWCPUAdress,1);
break;
}
}
}
if (uchFlageCount < 3)
{
writeCANreg(SJA_DLC, uchCanData[0]); // Bit7=1:EFF; Bit6=0:data
writeCANreg(SJA_ID1, uchCanData[1]); //29位识别码
writeCANreg(SJA_ID2, uchCanData[2]);
writeCANreg(SJA_ID3, uchCanData[3]);
writeCANreg(SJA_ID4, uchCanData[4]);
writeCANreg(SJA_DAT1, uchCanData[5]); //数据
writeCANreg(SJA_DAT2, uchCanData[6]);
writeCANreg(SJA_DAT3, uchCanData[7]);
writeCANreg(SJA_DAT4, uchCanData[8]);
writeCANreg(SJA_DAT5, uchCanData[9]);
writeCANreg(SJA_DAT6, uchCanData[10]);
writeCANreg(SJA_DAT7, uchCanData[11]);
writeCANreg(SJA_DAT8, uchCanData[12]);
writeCANreg(SJA_CMR, 0x01);
}
StartCan();
}
void writeCANdataRemateFrame(unsigned char xdata *data uchCanData)
{
unsigned char idata sjaSR;
// unsigned char idata i = 0;
unsigned char j ;
unsigned char uchJumpFlag = 0;
unsigned int xdata uiCount;
for(j=0; j<2; j++)
{
uiCount = 0;
do
{
uiCount++;
FeedDog();
sjaSR = readCANregRemote(SJA_SR);
if(uiCount>10000)
{
break;
}
}
while ((sjaSR&0x04)==0) ; // 判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
uiCount = 0;
do
{
uiCount++;
FeedDog();
sjaSR = readCANregRemote(SJA_SR);
if (uiCount>10000)
{
break;
}
}
while ((sjaSR&0x40) == 0x40); //判断发送缓存区是否锁定,锁定等待 SR.2 == 0 锁定等待
writeCANregRemote(SJA_DLC, uchCanData[0]); // Bit7=1:EFF; Bit6=0:data
writeCANregRemote(SJA_ID1, uchCanData[1]); //29位识别码
writeCANregRemote(SJA_ID2, uchCanData[2]);
writeCANregRemote(SJA_ID3, uchCanData[3]);
writeCANregRemote(SJA_ID4, uchCanData[4]);
writeCANregRemote(SJA_DAT1, uchCanData[5]); //数据
writeCANregRemote(SJA_DAT2, uchCanData[6]);
writeCANregRemote(SJA_DAT3, uchCanData[7]);
writeCANregRemote(SJA_DAT4, uchCanData[8]);
writeCANregRemote(SJA_DAT5, uchCanData[9]);
writeCANregRemote(SJA_DAT6, uchCanData[10]);
writeCANregRemote(SJA_DAT7, uchCanData[11]);
writeCANregRemote(SJA_DAT8, uchCanData[12]);
writeCANregRemote(SJA_CMR, 0x01);
break;
}
}
/////////////////////////////////////////////////////////////////////////////////////////
//void readuchCanData(void) interrupt 2 using 2
//入口参数:无
//函数返回:无
//全局变量:dlc[RecBufIndex];ID28_21[RecBufIndex];ID20_13[RecBufIndex];ID12_5[RecBufIndex];ID4_0[RecBufIndex];
// dat[RecBufIndex][8];RecBufIndex;uchCanIntterSta;
//功能描述:CAN 接收中断
//函数说明:在读缓存区时,先读全局变量uchCanIntterSta,其值为0:报文正常,其值为1:报文溢出,
// 其值为2:错误导致中断(需要在CAN初始化时,打开错误报警中断使能,writeCANreg(SJA_IER, 0x05); )
// 该函数运行时,关闭总中断,停止运行时,关闭总中断
//编写人: 郑福
/////////////////////////////////////////////////////////////////////////////////////////
void readCANdata(void) interrupt 2 //using 2
{
unsigned char idata sjaSR,sjaIR;
unsigned char idata uchReceiDataIndex=0;
sjaSR = readCANregRemote(SJA_SR); //是否有报文溢出
if ((sjaSR&0x02) != 0 ) //报文溢出
{
writeCANregRemote(SJA_CMR, 0x0c); //CMR.3=1 数据溢出位被清除 CMR.2=1 释放接收缓冲区中当前呈现的报文
}
sjaIR = readCANregRemote(SJA_IR);
if ((sjaIR&0x01)==1 )
{
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DLC); //数据长度
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID1); //29位识别码
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID2);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID3);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_ID4);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT1); //接收数据
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT2);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT3);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT4);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT5);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT6);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT7);
uchReceiDataIndex++;
uchReceiData[uchReceiDataIndex] = readCANregRemote(SJA_DAT8);
uchReceiDataIndex=0;
writeCANregRemote(SJA_CMR, 0x04);
CanFrameInterrupt(uchReceiData);
}
else
{
// uchCanIntterSta = 2;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//void StartCan();
//入口参数: 无
//函数返回: 无
//功能描述: 启动CAN
//编写人: 王东尧
//编写完成时间: 2007-04-16
/////////////////////////////////////////////////////////////////////////////////////////////////
void StartCan()
{
writeCANreg(SJA_IER, 0x01);//使能接收中断
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//void StopCan();
//入口参数: 无
//函数返回: 无
//功能描述: 停止CAN
//编写人: 王东尧
//编写完成时间: 2007-04-16
/////////////////////////////////////////////////////////////////////////////////////////////////
void StopCan()
{
writeCANreg(SJA_IER, 0x00);//屏蔽接收中断
}
//--------------------------------------------------------
//函数名称:void InitHardWareModule(void)
//功 能:初始化单片机硬件模块
//输入参数:无
//返 回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitHardWareModule(void)
{
SysCLKInit();
InitCPU();
FeedDog();
StopHeartBeat();
SetHeartInterval(10);
InitDA();
InitADC1();
InitRef();
SetExternalRAM();
ADC0_Init ();
}
//--------------------------------------------------------
//函数名称:void InitHardWareParaVariable(void)
//功 能:初始化单片机硬件模块中的参数
//输入参数:无
//返 回:无
//完成日期:4/13/2007
//----------------------------------------------------------
void InitHardWareParaVariable(void)
{
unsigned int xdata i;
SamplePTR0 = 0;
SamplePTR1 = 0;
SamplePTR2 = 0;
SamplePTR3 = 0;
uchConfigStatus = 1;
uchBypassStatus = 1;
uchTripleStatus = 1;
StopHeartBeat();
uiHeartbeatValue = 0;
StartHeartBeat();
uchSampleCompleteStatus = 0;
uchSampleType = 13;
uiGroupLength = 256;
FeedDog();
for(i=0;i<2048;i++)
{
SampBuffer0[i] = 0x7FF;
SampBuffer1[i] = 0x7FF;
SampBuffer2[i] = 0x7FF;
SampBuffer3[i] = 0x7FF;
}
FeedDog();
SetSampleBuffer0(SampBuffer0);
SetSampleBuffer1(SampBuffer1);
SetSampleBuffer2(SampBuffer2);
SetSampleBuffer3(SampBuffer3);
uchCANReSendFlag=0x00;
uchHWCPUAdress = ReadCANAddress();
b_NotIntegralChannelType = 0;
b_IntegralChannelType = 0;
b_LVDTChannelType = 0;
uchSampleLocationCounter = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -