#ifndef __CONTROLBUS_H__ #define __CONTROLBUS_H__ #include "canctrl.h" /* 基于总线的控制系统,支持CAN,485,等物理层连接 总线中可以挂载多个节点,每个节点有唯一的ID。 节点ID可以通过总线遍历设置,设置后固化到节点中。需要保证网络中节点ID的唯一性。 根据以上规则,节点和网络的关系可以分为 “向网络输出”和“接收网络数据”。 每个节点可以接收 */ //------------------------------------------------------------------------------------------------------------- //-------------------------------------- CAN 通讯的协议定义 ----------------------------------------------- //------------------------------------------------------------------------------------------------------------- //---------------------------------------------------------------- // CAN 数据包 // |-------------------------------------------------------------------- // | exId | data // |-------------------------------------------------------------------- // | // |-------------------------------------------------------------------- // | // |-------------------------------------------------------------------- // CAN 远程包 //------------------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------------- // exId 的各个部分(共29位) #define BNMASK_PRT 0x1F000000 // 通讯协议类型 #define BNMASK_TID 0x00FF0000 // 目标设备ID #define BNMASK_SID 0x0000FF00 // 源设备ID #define BNMASK_CMD 0x000000FF // 命令 #define BNMASK_ID (BNMASK_TID|BNMASK_SID) // 目标设备种类和目标设备ID 构成了通讯节点的标识,通讯节点标识在整个CAN网络中要保持唯一 //---------------------------------------------------------------- // 通讯遵循的协议类型 // 通讯协议类型定义 #define BN_PROTOCOL_ALL 0x00 // 所有设备通讯 #define BN_PROTOCOL_MVCTRL 0x01 // 运动控制协议 #define BN_PROTOCOL_HEAD 0x05 // 机头板通讯协议 #define BN_PROTOCOL_COLOR 0x06 // 换色板控制协议 #define BN_PROTOCOL_EXTIO 0x07 // IO扩展板控制协议 #define BN_PROTOCOL_SEWHD 0xA1 // 缝纫机头板控制协议 //---------------------------------------------------------------- // 设备ID (目标设备ID 和 源设备ID),每种协议下的ID是可以重复的。 #define BN_ID_BROADCAST 0x00 // 所有ID(广播ID) // 其他,1--255,按照每块板子的分配ID执行 // ID 的分配可以通过总线遍历过程分配,也可以固定分配 // // //---------------------------------------------------------------- // 通讯命令定义 #define BN_CMD_BROADCAST 0x00 // 广播命令 #define BN_CMD_TRAVERSE 0x01 // 遍历命令 // 单向指令-主板发给外围板 #define BN_CMD_BUSSTA 0x02 // 总线状态命令 // 单向指令-外围板发给主板 #define BN_CMD_INPUTCHG 0x03 // 输入信号变化 #define BN_CMD_CHGOUTPUT 0x04 // 变化输出信号 #define BN_CMD_REGVAL 0x05 // 状态端口变化(读取寄存器值) #define BN_CMD_WTREG 0x06 // 写入命令或数据(设置寄存器值) #define BN_CMD_EXCTRL 0x07 // 外围板控制命令 #define BN_CMD_EXSTA 0x08 // 外围板状态命令 #define BN_CMD_TRANS_DATA 0x09 // 数据传输 #define BN_CMD_NVPARA 0x0A // 读取 or 设置 非易失性参数 //---------------------------------------------------------------- // 遍历命令子命令定义 #define TRA_CMD_ENTER_TRA 0x01 // 进入遍历状态 #define TRA_CMD_EXIT_TRA 0x02 // 退出遍历状态 #define TRA_CMD_NODE_TRA_BEG 0x03 // 遍历设置某节点ID开始 #define TRA_CMD_NODE_TRA_END 0x04 // 遍历设置某节点ID完成 #define TRA_CMD_ASK_TRA_STA 0x05 // 查询所有节点遍历状态 //---------------------------------------------------------------- // 总线节点状态 #define TRA_STA_INIT 0x00 // 初始状态 #define TRA_STA_TRA 0x01 // 进入遍历状态,遍历就绪(收到 进入遍历状态命令) #define TRA_STA_BEG 0X02 // 遍历开始状态(在遍历状态下,收到设置节点ID命令) #define TRA_STA_RESP 0x03 // 遍历响应状态(在遍历开始状态下,通过开关触发) #define TRA_STA_COMP 0x04 // 遍历完成状态(在遍历响应状态下,通过主板发送数据包触发) //---------------------------------------------------------------- // 寄存器 #define BOARD_VER_LEN 8 // 外围板程序版本长度 // 存储读取到的寄存器值(虚拟寄存器,人为定义) typedef struct { u8 rdnewbverflag; // 读取新程序版本标志 u32 rdbverbitmap; // 程序版本接收位图 u32 exbVer[BOARD_VER_LEN]; // 外围板程序版本 // ... }BoardRegVal; #define PORT_ADDR_HIGH 0xFFFF0000 #define PORT_ADDR_LOW 0x0000FFFF #define BOARD_VERSION 0x00010000 // 程序版本 #define EXBOARD_UPDATE 0x00080000 // 外围板升级 #define GET_NV_PARA 0x00100000 // 读取参数 //---------------------------------------------------------------- // 生成EXID #define MAKE_EXID(prt, tid, sid, cmd) ( (((u32)((prt)&0x1f))<<24) | (((u32)((tid)&0xff))<<16) | (((u32)((sid)&0xff))<<8) | (((u32)((cmd)&0xff))) ) // 从EXID解析各个字段 #define GET_PRT_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_PRT) >> 24)) #define GET_TID_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_TID) >> 16)) #define GET_SID_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_SID) >> 8)) #define GET_CMD_FROM_EXID(exid) ((u8)((((u32)(exid))&BNMASK_CMD) >> 0)) //---------------------------------------------------------------- // 广播ID #define BROADCAST_EXID (MAKE_EXID(BN_PROTOCOL_ALL, BN_ID_BROADCAST, BN_ID_BROADCAST, BN_CMD_BROADCAST)) // 生成过滤 #define MAKE_FILTER(exid, rtr) ((((u32)exid)<<3) | CAN_ID_EXT | rtr) //---------------------------------------------------------------- //---------------------------------------------------------------- typedef union { // 使用串口时的通讯包格式 struct { u32 sync; u16 cmd; u32 addr; u32 val; u16 crc; } __attribute__ ((packed)) sercomm; // 使用CAN总线时的通讯 struct { u16 rev1; union { u32 id; struct { u8 type; // 通讯节点种类或功能种类,有效位数为5位(支持0--31共32种)。 u8 tid; // 目标通讯节点id,有效位数为8位(支持0--255共256个)。 u8 sid; // 源通讯节点id,有效位数为8位(支持0--255共256个)。 u8 cmd; // 通讯命令(功能编码) } __attribute__ ((packed)) desc; } __attribute__ ((packed)) exId; // can 通讯的29位 exid union { u8 buff[8]; // buff struct { u8 tracmd; // 子命令 u8 nodeid; // 节点ID u8 nodetype; // 节点类型 u8 rev[5]; } __attribute__ ((packed)) traverse; // 遍历命令 struct { u8 staCode; // 状态代码 u32 cpuid; // 由板卡CPUID生成的校验 u8 nodetype; u8 signal; // 信号检测,异常为1 // bit0,ZP // bit1,MP u8 rev; } __attribute__ ((packed)) busSta; // 总线状态命令 int64_t inputs; // 输入信号 struct { u32 mask; u32 value; } __attribute__ ((packed)) outputs; // 输出信号 struct { u32 portaddr; u32 status; } __attribute__ ((packed)) rdport; // 状态端口 struct { u32 portaddr; u32 wrdata; } __attribute__ ((packed)) wrport; // 写入端口 struct { u16 ccmd; // 控制命令 u8 para[6]; // 参数 } __attribute__ ((packed)) exctrl; // 外围板控制命令 struct { u16 esta; // 状态代码 u8 para[6]; // 参数 } __attribute__ ((packed)) exsta; // 外围板状态命令 struct { u16 ccmd; // 控制命令 u8 subcmd; u8 para1; s32 para2; } __attribute__ ((packed)) mctrl; // M轴控制 struct { u16 ccmd; // 控制命令 u8 currentNP; // 当前针位 u16 mrotCtnAng; u8 para[3]; } __attribute__ ((packed)) coilpara; struct { u16 cmd; // 子命令 u8 parablockID; // 参数块ID u8 paraID; // 参数ID s32 paraval; // 参数值 } __attribute__ ((packed)) headNvPara; // 非易失性参数 } __attribute__ ((packed)) data; // can 通讯的8字节数据 u16 rev2; } __attribute__ ((packed)) cancomm; // 其他数据包格式...... } CtrlBusPacket; //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- #endif