📄 low_can_bus.c
字号:
/*
*********************************************************************************************************
* HQE
* The Dual area climate-control system
*
*
* (c) Copyright 2008- , LongFine Automotive Electrical Co.Ltd
* All Rights Reserved
*
*
* File : canbus_sja1k.c
* By : zhanghouyuan
* Date : 2008/5/20
*
* CPU TYPE : M30290
* Description : nop()
* Version : Ver.0.0
*********************************************************************************************************
*/
#ifndef CANBUS_SJA1K_GLOBALS
#define CANBUS_SJA1K_GLOBALS
#include "sfr_M16C29config.h"
#include "Os_cpu.h" //type define
#include "canbus_sja1k.h"
#include "int_func.h"
#endif
/*
*********************************************************************************************************
* void sja1000_init(void)
*
* Description: low can ecu sja1000 initial.
*
* Arguments : none
*
* Returns :
* Note(s) : call target_init();sja1000_reset_on();sja1000_config();sja1000_reset_off();
*
*********************************************************************************************************
*/
void sja1000_init(void)
{
int1ic=0x0; /*disable mcu interrupt int1*/
target_init();
sja1000_reset_on();
sja1000_config();
sja1000_reset_off();
pd8_3 = 0;
int1ic=0x13; /*enable mcu interrupt int1*/
}
/*
*********************************************************************************************************
* void Low_CAN_Task(void)
*
* Description: low can mcu task
*
* Arguments : none
*
* Returns :
* Note(s) : call Write_SJA_SendBuf();write_sja1000(CMR_Addr,0x09);
*
*********************************************************************************************************
*/
void Low_CAN_Task(void)
{
INT8U flag = 0;
flag = Write_SJA_SendBuf();
if(flag)
{
write_sja1000(CMR_Addr,0x09); /*wake up ,clear overflow flag and start send data*/
}
while(!(read_sja1000(SR_Addr)&0x08))/*waiting sending over*/
{ ; }
}
/*
*********************************************************************************************************
* INT8U Write_SJA_SendBuf()
*
* Description: mcu write sja1000 send buff
*
* Arguments : none
*
* Returns :
* Note(s) : setting_working_mode();call read_sja1000();write_sja1000();
*
*********************************************************************************************************
*/
INT8U Write_SJA_SendBuf()
{
INT8U i,state0 = 0;
INT8U value[10] = {0};
INT8U ERR_CHK_Ctr0 = 20; /*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr0>0))
{
STA = setting_working_mode();
if(STA)
{ ; }
else
{
ERR_CHK_Ctr0--;
}
}
if((read_sja1000(SR_Addr)&0x08) != 0)/* check last times send end or less*/
{
if((read_sja1000(SR_Addr)&0x04) != 0)/*check send buf locked or less*/
{
// send_BUF.FrameID_H = 0x33;
// send_BUF.FrameLENTH = 8;
// send_BUF.FrameKIND = 0;//location frame
// send_BUF.FrameID_L3 = 0;
// for(i=0;i<send_BUF.FrameLENTH;i++)
// send_BUF.Frame_Data[i] = i*2
write_sja1000(0x10,0x33);
write_sja1000(0x11,0x08);
for(i=0;i<8;i++)
{
write_sja1000(0x12+i,i*2);
}
state0 = 1; /* write send buf is ok */
for(i=0;i<10;i++) /* read trans buff, used by test */
{
value[i] = read_sja1000(0x10+i);
}
}
else
state0 = 0;
}
else
state0 = 0;
return state0;
}
/*
*********************************************************************************************************
* INT8U Read_SJA_RecBuf()
*
* Description: read sja1000. receive buff,
*
* Arguments : none
*
* Returns : none
* CALL : setting_working_mode();
* read_sja1000();setting_ocr();setting_cdr();
*
*
*********************************************************************************************************
*/
INT8U Read_SJA_RecBuf()
{
INT8U ERR_CHK_Ctr1 = 20,i,state1 = 0;
INT8U Rec[10] = {0};
STA = 0;
while(!STA)
{
STA = setting_working_mode();
if(STA)
{ ; }
else
{
ERR_CHK_Ctr1--;
}
}
if(read_sja1000(SR_Addr)&0x01 != 0)/*read receive buf state,1--able read buf,0--null*/
{
if((read_sja1000(SR_Addr)&0x10 == 0))/*receive is end,now could receive data*/
{
for(i=0;i<10;i++)
{
Rec[i]=read_sja1000(0x20+i);
p9_0 = 1;
}
}
}
}
/*
*********************************************************************************************************
* void sja1000_config(void)
*
* Description: config sja1000.,
*
* Arguments : none
*
* Returns : none
* CALL : check_hard_connect();setting_reset_mode();setting_sja_rate();
* setting_data_select();setting_ocr();setting_cdr();
*
*
*********************************************************************************************************
*/
void sja1000_config(void)
{
INT8U ERR_CHK_Ctr = 20; /*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0))
{
STA = check_hard_connect(); /*test hard connect*/
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
ERR_CHK_Ctr = 20;/*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0))
{
STA = setting_reset_mode(); /*software reset ,disable sja1000 all interrupt*/
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
ERR_CHK_Ctr = 20;/*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0))
{
STA = setting_sja_rate(); /*setting sja1000 rate 125kbps */
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
ERR_CHK_Ctr = 20;/*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0)) /*setting sja1000 data acr,amr*/
{
STA = setting_data_select();
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
ERR_CHK_Ctr = 20;/*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0)) /*输出控制寄存器的值:正常输出模式*/
{
STA = setting_ocr();
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
ERR_CHK_Ctr = 20;/*error count */
STA = 0;
while((!STA)&&(ERR_CHK_Ctr>0)) /*basic can mode ;disable cbp;off clkout*/
{
STA = setting_cdr();
if(STA)
{ ; }
else
{
ERR_CHK_Ctr--;
}
}
STA = 0;
}
/*
*********************************************************************************************************
* INT8U setting_cdr()
*
* Description: setting sja1000 clock and cloclout mode disable
*
* Arguments : none
*
* Returns : 1--setting ok, 0--setting failure
* called : write_sja1000();read_sja1000();
*
*********************************************************************************************************
*/
INT8U setting_cdr()
{
write_sja1000(CDR_Addr,SJA_CDR);
if(read_sja1000(CDR_Addr) == SJA_CDR)
return 1;
else
return 0;
}
/*
*********************************************************************************************************
* INT8U setting_ocr()
*
* Description: setting sja1000 data output mode.normal output mode
*
* Arguments : none
*
* Returns : 1--setting ok, 0--setting failure
* called : write_sja1000();read_sja1000();
*
*********************************************************************************************************
*/
INT8U setting_ocr()
{
write_sja1000(OCR_Addr,SJA_OCR);
if(read_sja1000(OCR_Addr) == SJA_OCR)
return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -