📄 sja1000.c
字号:
{
IDTemp = pTxInfo->FrID<<3;
for(i=0; i<4; i++)
{
Write_SJA1000((INT8U)(IDTemp>>8*(3-i)),TXBUF+1+i);
}
for(i=0; i<pTxInfo->FrIf.Bits.DLC; i++)
{
Write_SJA1000(pTxInfo->DA[i],TXBUF+5+i);
}
}
else
{
IDTemp = pTxInfo->FrID<<21;
for(i=0; i<2; i++)
{
Write_SJA1000((INT8U)(IDTemp>>8*(3-i)),TXBUF+1+i);
}
for(i=0; i<pTxInfo->FrIf.Bits.DLC; i++)
{
Write_SJA1000(pTxInfo->DA[i],TXBUF+3+i);
}
}
}
/*
********************************************************************************************************************
**函数原型 : BOOL ReadRcvBuf(stcSJA1000_BufInfo *pRcvBuf)
**参数说明 : pRcvBuf -> 接收输出数据的结构体指针
**返回值 :
**说 明 : 调用该函数接收CAN数据
********************************************************************************************************************
*/
BOOL ReadRcvBuf(stcSJA1000_BufInfo *pRcvBuf)
{
INT8U i;
INT32U IDTemp = 0;
if(pRcvBuf == NULL) return FALSE;
pRcvBuf->FrIf.Byte = Read_SJA1000(RXBUF);
pRcvBuf->FrID = 0;
if(pRcvBuf->FrIf.Bits.FF == 1)
{
for(i=0; i<4; i++)
{
IDTemp = Read_SJA1000(RXBUF+1+i);
IDTemp = (IDTemp<<(24-(8*i)));
pRcvBuf->FrID |= IDTemp;
IDTemp = 0;
}
pRcvBuf->FrID >>= 3;
for(i=0; i<pRcvBuf->FrIf.Bits.DLC; i++)
{
pRcvBuf->DA[i] = Read_SJA1000(RXBUF+5+i);
}
}
else
{
for(i=0; i<2; i++)
{
IDTemp = Read_SJA1000(RXBUF+1+i);
IDTemp = (IDTemp<<(24-(8*i)));
pRcvBuf->FrID |= IDTemp;
IDTemp = 0;
}
pRcvBuf->FrID >>= 21;
for(i=0; i<pRcvBuf->FrIf.Bits.DLC; i++)
{
pRcvBuf->DA[i] = Read_SJA1000(RXBUF+3+i);
}
}
return TRUE;
}
/*
********************************************************************************************************************
**函数原型 : BOOL ACRCode(INT32U ACRCode)
**参数说明 : ACRCode -> 验收代码值 ACR0_ACR1_ACR2_ACR3
**返回值 :
**说 明 : 调用该函数设置验收代码
********************************************************************************************************************
*/
BOOL ACRCode(INT32U ACRCode)
{
int i;
for(i=0; i<4; i++)
{
Write_SJA1000((INT8U)(ACRCode>>(24-8*i)),ACR0+i);
}
for (i=0; i<4; i++)
{
if((INT8U)(ACRCode>>(24-8*i)) != Read_SJA1000(ACR0+i))
{
return FALSE;
}
}
return TRUE;
}
/*
********************************************************************************************************************
**函数原型 : BOOL AMRCode(INT32U AMRCode)
**参数说明 : AMRCode -> 验收屏蔽码 AMR0_AMR1_AMR2_AMR3
**返回值 :
**说 明 : 调用该函数设置验收屏蔽码
********************************************************************************************************************
*/
BOOL AMRCode(INT32U AMRCode)
{
int i;
for(i=0; i<4; i++)
{
Write_SJA1000((INT8U)(AMRCode>>(24-8*i)),AMR0+i);
}
for (i=0; i<4; i++)
{
if((INT8U)(AMRCode>>(24-8*i)) != Read_SJA1000(AMR0+i))
{
return FALSE;
}
}
return TRUE;
}
/*
********************************************************************************************************************
**函数原型 : BOOL SetFliter(INT32U ACRCode, INT32U AMRCode)
**参数说明 : ACRCode -> 验收代码值 ACR0_ACR1_ACR2_ACR3
** : AMRCode -> 验收屏蔽码 AMR0_AMR1_AMR2_AMR3
**返回值 :
**说 明 : 调用该函数写入欲发送的数据
********************************************************************************************************************
*/
BOOL SetFliter(INT32U ACRCode, INT32U AMRCode)
{
INT8U i;
for(i=0; i<4; i++)
{
Write_SJA1000((INT8U)(ACRCode>>(24-8*i)),ACR0+i);
}
for(i=0; i<4; i++)
{
Write_SJA1000((INT8U)(AMRCode>>(24-8*i)),AMR0+i);
}
for (i=0; i<4; i++)
{
if((INT8U)(ACRCode>>(24-8*i)) != Read_SJA1000(ACR0+i))
{
return FALSE;
}
}
for (i=0; i<4; i++)
{
if((INT8U)(AMRCode>>(24-8*i)) != Read_SJA1000(AMR0+i))
{
return FALSE;
}
}
return TRUE;
}
/*
********************************************************************************************************************
**宏 名 : Write_SJA1000(Val, OffSet)
**参数说明 : Val -> 欲写入的数据
** : OffSet -> SJA1000片内寄存器偏移地址
**说 明 : 该宏用于写SJA1000内部寄存器
********************************************************************************************************************
*/
void Write_SJA1000(INT8U Val, INT8U OffSet)
{
//SJA1000_ALE_ADDR = OffSet;
//SJA1000_DAT_ADDR = Val;
writeb(OffSet,sja1000_ale);
writeb(Val,sja1000_dat);
}
/*
********************************************************************************************************************
**宏 名 : Read_SJA1000(OffSet)
**参数说明 : OffSet -> SJA1000片内寄存器偏移地址
**说 明 : 该宏用于写SJA1000内部寄存器
********************************************************************************************************************
*/
INT8U Read_SJA1000(INT8U OffSet)
{
//SJA1000_ALE_ADDR = OffSet;
//return (INT8U)SJA1000_DAT_ADDR;
writeb(OffSet,sja1000_ale);
return readb(sja1000_dat);
}
/*
********************************************************************************************************************
**函数原型 : void IntEnty(void)
**参数说明 : NULL
**返回值 : NULL
**说 明 : 中断处理入口
********************************************************************************************************************
*/
void IntEnty(void)
{
INT8U IRTemp = Read_SJA1000(IR);
if(IR_RC&IRTemp)
{
ReadRcvBuf(&SJA1000_RxBuf);
SetCommand(CMR_CL_BUF);
}
if(IR_TR&IRTemp)
{
}
if(IR_ER&IRTemp)
{
}
if(IR_DO&IRTemp)
{
SetCommand(CMR_CL_DATA);
}
if(IR_WU&IRTemp)
{
}
if(IR_EP&IRTemp)
{
}
if(IR_AL&IRTemp)
{
}
if(IR_BE&IRTemp)
{
}
}
/*
********************************************************************************************************************
**函数原型 : BOOL SJA1000Init(INT8U CanMode, INT16U BaudRate,INT32U ACRCode, INT32U AMRCode)
**参数说明 : CanMode -> CAN模式值 BAIS_CAN
** : PELI_CAN
** : BaudRate -> 波特率值
** : ACRCode -> 验收代码
** : AMRCode -> 验收屏蔽码
**返回值 :
**说 明 : 该函数必须在软件复位模式下调用
********************************************************************************************************************
*/
BOOL SJA1000Init(INT8U CanMode, INT16U BaudRate,INT32U ACRCode, INT32U AMRCode)
{
if(TRUE != SJA_SoftRst(TRUE)) //进入复位模式
{
printk("SJA_SoftRst Err!.\n");
return FALSE;
}
if(TRUE != SetModeReg(MOD_AFM_SIG,TRUE)) //设置验收过滤方式
{
printk("SetModeReg Err!.\n");
return FALSE;
}
if(TRUE != SetInterrupt(IER_RC,TRUE)) //设置中断,只开放接收中断
{
printk("SetInterrupt Err!.\n");
return FALSE;
}
if(TRUE != SetClkDiv(CanMode,FALSE,TRUE,0)) //设置工作模式
{
printk("SetClkDiv Err!.\n");
return FALSE;
}
if(TRUE != SetFliter(ACRCode,AMRCode)) //设置验收过滤值
{
printk("SetFliter Err!.\n");
return FALSE;
}
if(TRUE != SetBaudRate(BaudRate)) //设置波特率
{
printk("SetBaudRate Err!.\n");
return FALSE;
}
if(TRUE != SetOutPutMod(0x1A)) //设置驱动输出模式
{
printk("SetOutPutMod Err!.\n");
return FALSE;
}
if(TRUE != SJA_SoftRst(FALSE)) //退出软件复位模式
{
printk("SJA_SoftRst Err!.\n");
return FALSE;
}
return TRUE;
}
/*
*********************************************************************************************************
** End Of File
*********************************************************************************************************
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -