#include "config.h"
OS_FLAG_GRP *ican_pevent;//系统消息指针
iCANSLV iCANdeviceList[ICAN_SLV_NUM];//轮训列表
/*******************************************/
#if ican_DRAM_Enalbe
INT8U dram[2048];//动态内存
#endif
/*******************************************/
INT8U ican_cet,ALL_OVER;//0未连接,1建立连接,2重复id
DEVICERCSR myDEVICERCSR; //从站数据逻辑地址表
INT8U deviceinf[32] =
{ /*类别********************************逻辑地址***********数组中的位置/长度*****/
0x00,0x01, //生产商ID 0xE0--0xE1 0/2
0x01,0x00, //产品类型 0xE2--0xE3 2/2
0x01,0x00, //产品型号 0xE4--0xE5 4/2
0xE8,0x03, //产品硬件版本 0xE6--0xE7 6/2
0xE8,0x03, //产品固件版本 0xE8--0xE9 8/2
0x80,0x40,0x32,0x03, //序列号 0xEA--0xED 10/4
0x02, //本机节点ID 0xEE
0xff, //CAN波特率 0xff为无效 0xEF
0x31,0x00,0x1C,0x00, //用户特殊波特率 0xF0--0xF3
0xff, //循环模式定时 0xF4
0xff, //主站通讯定时 0xF5
0xff, //状态改变触发使能 0xF6
0xff, //主站地址 0xF7
0xff, //输入输出通道选择 0xF8
0xff, //输入输出配置参数 0xF9
0xff,0xff,0xff,0xff,0xff,0xff //保留 0xFA--0xFF
};
/******************************iCAN申请动态内存**************************
作者:张森
日期:2008年4月6日
*************************************************************************/
#if ican_DRAM_Enalbe
void *ican_malloc(INT32U size)
{INT8U *p;
if(size>0)
{
p=reg_malloc (size);//申请
if(p==NULL)//内存满
{
return (NULL);
}
else
{
return p;
}
}
else
{
return (NULL);
}
}
#endif
/******************************iCAN I/O初始化***************************
作者:张森
日期:2008年4月6日
*************************************************************************/
void ican_io_init(INT8U DI_len,INT8U *p_DI_len,INT8U DO_len,INT8U *p_DO_len,INT8U AI_len,INT8U *p_AI_len,INT8U AO_len,INT8U *p_AO_len)
{
myDEVICERCSR.DILen=DI_len;
myDEVICERCSR.DOLen=DO_len;
myDEVICERCSR.AILen=AI_len;
myDEVICERCSR.AOLen=AO_len;
myDEVICERCSR.pDIData=p_DI_len;
myDEVICERCSR.pDOData=p_DO_len;
myDEVICERCSR.pAIData=p_AI_len;
myDEVICERCSR.pAOData=p_AO_len;
}
/************************iCAN主站初始化**********************************
作者:张森
日期:2008年4月2日
**************************************************************************/
void master_init()
{
INT8U i,err;
ican_pevent=OSFlagCreate(0,&err);
iCANdeviceList[deviceinf[0x0e]].sla_status=3;
/*******************************************/
#if ican_DRAM_Enalbe
ican_init_mempool (dram,2048);//初始化动态内存
for(i=0;i<ICAN_SLV_NUM;i++)
{
iCANdeviceList[i].P_DILen =NULL;
iCANdeviceList[i].P_DOLen =NULL;
iCANdeviceList[i].P_AILen =NULL;
iCANdeviceList[i].P_AOLen =NULL;
}
#else
for(i=1;i<=CANXS;i++)
{
iCANdeviceList[i].DILen=2;
iCANdeviceList[i].P_DILen=&Vbuf[10*(i-1)];
iCANdeviceList[i].DOLen=2;
iCANdeviceList[i].P_DOLen =&Vbuf[10*(i-1)+2];
iCANdeviceList[i].AILen=4;
iCANdeviceList[i].P_AILen =&Vbuf[10*(i-1)+4];
iCANdeviceList[i].AOLen=3;
iCANdeviceList[i].P_AOLen =&Vbuf[3*(i-1)+173];
}
for(i=CANXS+1;i<6;i++)
{
iCANdeviceList[i].sla_status=3;
}
iCANdeviceList[6].DILen=7;
iCANdeviceList[6].P_DILen=&Vbuf[50];
iCANdeviceList[6].DOLen=7;
iCANdeviceList[6].P_DOLen =&Vbuf[57];
iCANdeviceList[6].AILen=10;
iCANdeviceList[6].P_AILen =&Vbuf[198];
iCANdeviceList[6].AOLen=0;
iCANdeviceList[6].P_AOLen =NULL;
#endif
/*******************************************/
CAN_Init(CAN1,5);
}
/******************************连续读取从站数据命令**************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
SourceID 资源ID
SubSourceID 子资源ID(当SourceID<0xf9时,忽略子节点地址)
length 读取长度
*****************************************************************************/
void ican_read_sla(INT8U DestMACID,INT8U SourceID,INT8U SubSourceID,INT8U length)
{INT8U read_sla_buf[2];
if(SourceID<0xf9)
{
ican_send(DestMACID,0,0x02,SourceID,&length,1);
}
else
{
read_sla_buf[0]=SubSourceID;
read_sla_buf[1]=length;
ican_send(DestMACID,0,0x02,SourceID,read_sla_buf,2);
}
}
/******************************连续读取从站数据响应**************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
SourceID 资源ID (如有资源节点请放入*p的第一位)
*p的数据长度
*****************************************************************************/
void ican_read_sla_respond(INT8U DestMACID,INT8U SourceID,INT8U *p,INT8U D_long)
{
ican_send(DestMACID,1,0x02,SourceID,p,D_long);
}
/******************************连续写入从站数据命令**************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
SourceID 资源ID(如有资源节点请放入*p的第一位)
*p 写入的数据指针
D_long *p的数据长度
******************************************************************************/
void ican_write_sla(INT8U DestMACID,INT8U SourceID,INT8U *p,INT8U D_long)
{
ican_send(DestMACID,0,0x01,SourceID,p,D_long);
}
/******************************连续写入从站数据响应***************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
SourceID 资源ID
******************************************************************************/
void ican_write_sla_respond(INT8U DestMACID,INT8U SourceID)
{
ican_send(DestMACID,1,0x01,SourceID,&SourceID,0); //&SourceID只起到格式作用,并不传送
}
/******************************建立逻辑链接命令******************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
Cyclicmaster 主站通讯定时参数
******************************************************************************/
void ican_create_cnnet_sla (INT8U DestMACID)
{
INT8U create_cnnet_sla_buf[2];
create_cnnet_sla_buf[0]=deviceinf[0x0e];
create_cnnet_sla_buf[1]=deviceinf[0x15];
ican_send(DestMACID,0,0x04,0xf7,create_cnnet_sla_buf,2);
}
/******************************建立逻辑链接响应******************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
Cyclicmaster 主站通讯定时参数
******************************************************************************/
void ican_create_cnnet_sla_respond (INT8U DestMACID)
{
INT8U ican_create_cnnet_sla_respond[4];
ican_create_cnnet_sla_respond[0]=myDEVICERCSR.DILen;
ican_create_cnnet_sla_respond[1]=myDEVICERCSR.DOLen;
ican_create_cnnet_sla_respond[2]=myDEVICERCSR.AILen;
ican_create_cnnet_sla_respond[3]=myDEVICERCSR.AOLen;
ican_send(DestMACID,1,0x04,0xf7,ican_create_cnnet_sla_respond,4);
}
/******************************删除逻辑链接命令******************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
******************************************************************************/
void ican_del_cnnet_sla(INT8U DestMACID)
{
ican_send(DestMACID,0,0x05,0xf7,&deviceinf[0x0e],1);
}
/******************************删除逻辑链接响应******************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
******************************************************************************/
void ican_del_cnnet_sla_respond(INT8U DestMACID)
{
ican_send(DestMACID,1,0x05,0xf7,&DestMACID,0);//&DestMACID只起到格式作用,并不传送
}
/*********************************复位从站命令*********************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
*******************************************************************************/
void ican_reset_sla(INT8U DestMACID)
{
ican_send(DestMACID,0,0x06,0x00,&DestMACID,1);
}
/*********************************复位从站响应*********************************
作者:张森
日期:2008年4月6日
参数:DestMACID 目标ID
**************************************************
iCAN协议及源代码(C语言编写)
4星 · 超过85%的资源 需积分: 35 192 浏览量
2010-05-25
13:10:43
上传
评论 4
收藏 10KB RAR 举报
hustych
- 粉丝: 7
- 资源: 4
最新资源
- 杨辉三角(Pascal's Triangle)是一个在数学中非常著名的数列,它以一种特定的模式排列数字,内容以5种代码实例实现
- yolov5数据集:CT图像肾脏、结石检测(2类别,包含训练集、验证集)
- 电力102规约请求报文实录
- RTL8723 linux+安卓驱动 2020版本
- ISO 26262 道路车辆-功能安全-系统级产品开发
- 数据挖掘期末题 选择填空简答
- EKF在CTRV模型上的建模推导
- 用于:https://laoshifu.blog.csdn.net/article/details/138191428 多层创建
- 电力102规约(电能累计量的传输规约)培训
- 「常用」E9外部流程接口
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
- 3
- 4
前往页