276 lines
7.7 KiB
C
276 lines
7.7 KiB
C
|
||
#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
|