📄 复件 can_code.c
字号:
#define PSS_GLOBALS
#include "GloVar.h"
#include "LUT.H"
extern void Dly_Ns(uint16 Dly);
// ========================函数定义===================================================
// 函数名称:Can_Init()
// 函数功能: CAN 通信模块的初始化
// 输入参数:无
// 输出参数:无
// 全局变量:无
// 调用模块:无
// -------------------------------------------------------------------------------------
// 修 改 人:
// 日 期:
// 描 述:
// ====================================================================================
void CANInit(void)
{
CAN1MOD = 0x00000001; // enter the reset status
CAN1BTR = 0x007F400B; // the baud of the can is 40k(注意:波特率的设置与TEG1/TEG2有关)
CAN1EWL = 0x60; // CAN error warning limit, the 0x60 is the default value when reset
CAN1IER = 0x00000001; // 0x07 = 0 0101
// - ----
// | ||||___ enable the recieve interrupt
// | |||____ enable the transmit interrupt
// | ||_____ enable the EI: the error warning interrupt
// | |______ disable the overrun interrupt
// |________ all of the other interrupts are disabled
CAN1MOD = 0x00000000; // cancle the reset status
}
// ========================函数定义===================================================
// 函数名称:Can_Send()
// 函数功能:CAN 总线的数据发送
// 输入参数:*iTranData: 指向被传送数据的指针,其中包括CAN总线帧数据信息
// 输出参数:无
// 全局变量:无
// 调用模块:无
// -------------------------------------------------------------------------------------
// 修 改 人:
// 日 期:
// 描 述:
// ====================================================================================
void CAN1TxPrg(void)//uint8 *iTranData) // iTranData[0]: the length of the data to be sent
// iTranData[1]: the higher three bits of the Identifier
// iTranData[2]: the lower eight bits of the Identifier
// iTranData[3]-iTranData[10]: the data to be sent
{
uint8 i;
uint8 iLength;
iLength = iTranData[0] & 0x0F;
if(iLength > 0x08)
{
iLength = 0x08;
}
CAN1TFI1 = iLength << 16; // load the length of data to be sent to the register of CANTFI1
CAN1TID1 = iTranData[1] << 8 | iTranData[2]; // load the ID
CAN1TDA1 = 0x00000000;
CAN1TDB1 = 0x00000000;
for(i = 0; i < iLength; i++) // load the data
{
if(i <=3)
{
CAN1TDA1 = (iTranData[3 + i] << (i * 8)) | CAN1TDA1;
}
else
{
CAN1TDB1 = (iTranData[3 + i] << ((i - 4) * 8)) | CAN1TDB1;
}
}
CAN1CMR = 0x00000021; // select Tx Buffer1 for transmission,request to send
/*
for(i = 0; i < 50; i++)
{
Dly_Ns(10000);
}
IO1CLR = LEDCON124;
for(i = 0; i < 50; i++)
{
Dly_Ns(10000);
}
IO1SET = LEDCON124;
*/
// VICVectAddr = 0x00;
}
// ========================函数定义===================================================
// 函数名称:CAN1RxPrg()
// 函数功能:CAN总线的接收数据中断处理程序
// 输入参数:*iRcvData: 接收数据缓存
// 输出参数:无
// 全局变量:无
// 调用模块:无
// -------------------------------------------------------------------------------------
// 修 改 人:
// 日 期:
// 描 述:
// ====================================================================================
void CAN1RxPrg(void)//uint8 *iRcvData)
{
uint8 i;
uint8 iLength;
float fPrePos;
uint32 iTmp;
T0TCR = 0x00;
iTmp = CAN1RFS;
iTmp = CAN1ICR;
// here, we should jugde if the frame is a remote request frame
// then if it is not a remote request frame, we do the reception
if((CAN1RFS & 0x40000000) == 0x40000000) // if the frame is remote frame, then send the data
{
// ????????????????????????????????
// 若为远程帧,应该如何处理? 应如何组织数据把数据发送出去
// ????????????????????????????????
while((CAN1GSR & 0x00000004) == 0x00000004); // 判断是否可以发送,若可以发送则发送数据
CAN1TxPrg();
}
else
{
iLength = ((CAN1RFS >> 16) & 0x0000000F); // get the length of the data recieved
if(iLength > 0x08)
{
iLength = 0x08;
}
for( i = 0; i < iLength; i++)
{
if(i <= 3)
{
iRcvData[i] = (CAN1RDA >> (i * 8)) & 0x000000FF;
}
else
{
iRcvData[i] = (CAN1RDB >> ((i - 4) * 8)) & 0x000000FF;
}
}
// -------------------------------
// added by BaiHuanXu, 2004/10/30
if(iRcvData[0] == 0x20) // 上位机发来的测试命令
{
iCANCmdTst = 1;
iTmp = Ad_Get();
if(iTmp < 616)
{
PWMMR0 = 25000;
PWMMR3 = 0;
PWMMR4 = 25001;
PWMMR5 = 25001;
PWMMR6 = 0;
PWMLER = 0x79;
}
else
{
PWMMR0 = 25000;
PWMMR3 = 25001;
PWMMR4 = 0;
PWMMR5 = 0;
PWMMR6 = 25001;
PWMLER = 0x79;
}
for(i = 0; i < 255; i++)
{
Dly_Ns(20000);
}
PWMMR0 = 25001;
iTmp = PWMMR3;
PWMMR3 = PWMMR5;
PWMMR5 = iTmp;
iTmp = PWMMR4;
PWMMR4 = PWMMR6;
PWMMR6 = iTmp;
PWMLER = 0x79;
for(i = 0; i < 255; i++)
{
Dly_Ns(20000);
}
PWMMR3 = 25001;
PWMMR4 = 0;
PWMMR5 = 25001;
PWMMR6 = 0;
PWMLER = 0x79;
}
if(iRcvData[0] == 0x80) // 上位机发来的开阀命令
{
iCANCmdAct = 1;
iTranData[0] = 0x01;
iTranData[1] = 0x00;
iTranData[2] = 0x01;
iTranData[3] = 0x00; // 向上位机发送一个确认阀门开始动作标识
CAN1TxPrg();
iCtrlStpFlg = 0;
iNum = 0;
fPrePos = (float)(iRcvData[1] + iRcvData[2] * 0.01);
iPrePos = (uint16)(fPrePos * 6.92) + 270;
// iLstPos = Ad_Get();
/*
iLstSign = (iLstPos > iPrePos) ? 1:0;
if(iLstSign)
{
PWMMR6 = 25001;
}
else
{
PWMMR4 = 25001;
}
PWMLER = 0x79;
for(i = 0; i < 200; i++)
{
Dly_Ns(20000);
Dly_Ns(20000);
Dly_Ns(20000);
Dly_Ns(20000);
}
if(fabs(iPrePos - iLstPos) < 60)
{
iLstSign = (iLstPos > iPrePos) ? 1:0;
if(iLstSign)
{
PWMMR0 = 25000;
PWMMR3 = 25001;
PWMMR4 = 0;
PWMMR5 = 0;
PWMMR6 = 25001;
PWMLER = 0x79;
}
else
{
PWMMR0 = 25000;
PWMMR3 = 0;
PWMMR4 = 25001;
PWMMR5 = 25001;
PWMMR6 = 0;
PWMLER = 0x79;
}
Dly_Ns(20000);
}
*/
}
// ---------------------------------
}
CAN1CMR = 0x04;
T0TCR = 0x01;
VICVectAddr = 0x00;
}
// ========================函数定义===================================================
// 函数名称:AFBuildLUT()
// 函数功能:创建 LUT 表格,指定每个表格 Cell 的个数,每个 Cell 为32bits
// 输入参数:***_nCell 对应表格的预留空间的大小,Cell 的个数
// 输出参数:参考enum LUT_BUILD_ERR
// 全局变量:无
// 调用模块:无
// 作 者:Bai Huan-Xu
// 日 期:2004/7/19
// -------------------------------------------------------------------------------------
// 修 改 人:
// 日 期:
// 描 述:
// ====================================================================================
uint32 AFBuildLUT(uint32 FCAN_nCell,
uint32 SFF_INIV_nCell,
uint32 SFF_GRP_nCell,
uint32 EFF_INIV_nCell,
uint32 EFF_GRP_nCell)
{
uint16 i;
uint32 *pU32;
_CANAFMR afmr;
uint32 tmpREGSFF_sa, tmpREGSFF_GRP_sa, tmpREGEFF_sa;
uint32 tmpREGEFF_GRP_sa, tmpREGENDofTable;
if(4 * (FCAN_nCell + SFF_INIV_nCell + SFF_GRP_nCell + EFF_INIV_nCell + EFF_GRP_nCell ) > 0x800)
{
return TOTAL_SIZE_TOO_LARGE;
}
if((EFF_GRP_nCell % 2) != 0)
{
return EFF_GRP_SIZE_INVALID;
}
tmpREGSFF_sa = FCAN_nCell * 4;
tmpREGSFF_GRP_sa = tmpREGSFF_sa + (SFF_INIV_nCell * 4);
tmpREGEFF_sa = tmpREGSFF_GRP_sa + (SFF_GRP_nCell * 4);
tmpREGEFF_GRP_sa = tmpREGEFF_sa + (EFF_INIV_nCell * 4);
tmpREGENDofTable = tmpREGEFF_sa + (EFF_GRP_nCell * 4);
if((0x800 - tmpREGSFF_sa * 6) < tmpREGENDofTable)
{
return FCAN_STORE_SIZE_INVALID;
}
afmr.dwValue = 0;
afmr.Bits.AccBp = 1;
REGAFMR = afmr.dwValue; // it must set AccBP bit before modify LUT setting
// memset((void *)®AFMR, 0xFF, 0x800); // to include <string.h> when memset function used
pU32 = (uint32 *)(®AFRAM);
for(i = 0; i < (tmpREGENDofTable / 4); i++)
{
*(pU32 + i) = -1; // disable all AF cell
}
for(i = (tmpREGENDofTable / 4); i < 0x800; i++)
{
*(pU32 + i) = 0; // clear FullCAN auto store RAM
}
REGSFF_sa = tmpREGSFF_sa;
REGSFF_GRP_sa = tmpREGSFF_GRP_sa;
REGEFF_sa = tmpREGEFF_sa;
REGEFF_GRP_sa = tmpREGEFF_GRP_sa;
REGENDofTable = tmpREGENDofTable;
return LUT_SETTING_OK;
}
// ========================函数定义===================================================
// 函数名称:AFSetMode()
// 函数功能:指定模式启动或关闭全局接收过滤器
// 输入参数:1,Bypass mode, all message will be recieved
// 2, normal filter
// 3, FullCAN mode filter
// 0 or other, all message on CAN buses are ignored
// 输出参数:none
// 全局变量:无
// 调用模块:无
// 作 者:Bai Huan-Xu
// 日 期:2004/7/19
// -------------------------------------------------------------------------------------
// 修 改 人:
// 日 期:
// 描 述:
// ====================================================================================
void AFSetMode(uint32 mode)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -