提交 6dff14a0 作者: 高增攀

123

上级 e2f2b1a9
#include "Drv_PillarComm.h"
#include "Memory.h"
#include "Drv_InternetBsb.h"
osMessageQId PillarMsg = 0;
osMessageQId InterMsg = 0;
/**************************************************************************************************
** 函数名: CAN1_SendMessage
** 输 入: ulCanId----发送ID, ulCanDataA----发送数据的底4字节, ulCanDataB----发送数据的高4字节
** 输 出: 参数读取状态
** 描 述: 通过CAN通道发送数据
** 日 期: 2010/08/19
**************************************************************************************************/
u8 PillarCommSendMsg(StructPillarCommSend *pMsg)
{
CanTxMsg TxMessage;
u8 TransmitMailbox = 0;
TxMessage.ExtId = pMsg->Id.Mult;// 设定扩展标识符
TxMessage.IDE = CAN_ID_EXT;// 设定消息标识符的类型
TxMessage.RTR = CAN_RTR_DATA;// 设定待传输消息的帧类型
TxMessage.DLC = pMsg->Len; //设定待传输消息的帧长度
TxMessage.Data[0] = pMsg->Data[0];// 包含了待传输数据
TxMessage.Data[1] = pMsg->Data[1];// 包含了待传输数据
TxMessage.Data[2] = pMsg->Data[2];// 包含了待传输数据
TxMessage.Data[3] = pMsg->Data[3];// 包含了待传输数据
TxMessage.Data[4] = pMsg->Data[4];// 包含了待传输数据
TxMessage.Data[5] = pMsg->Data[5];// 包含了待传输数据
TxMessage.Data[6] = pMsg->Data[6];// 包含了待传输数据
TxMessage.Data[7] = pMsg->Data[7];// 包含了待传输数据
TransmitMailbox = CAN_Transmit(PillarComm_Can, &TxMessage);//开始一个消息的传输
if(CAN_TxStatus_NoMailBox == TransmitMailbox)
return FALSE;//未发送成功,返回FALSE
return TRUE;
}
void PillarComm_Can_IRQHandler(void)
{
CanRxMsg RxMessage;
UnionPillarCommId CommId = {.Mult = 0,};
StructPillarCommRecv Frame;
CanRxMsg RxMsg;
u8 IrSta = 0;
//StructDcModuleStatus Data;
u8 RecvFlag;
IrSta = MCP2515_B_ReadStatus();
if (IrSta & 0x01)
{
RecvFlag = MCP2515_B_Receive(0, &RxMessage);
MCP2515_B_BitModify(CANINTF, 0x01, 0x00);
if (TRUE == RecvFlag)
{
if ((CAN_ID_EXT == RxMsg.IDE) && (CAN_RTR_DATA == RxMsg.RTR))
{
DcModuleMsgReceive(&RxMsg);
}
}
}
else if (IrSta & 0x02)
{
RecvFlag = MCP2515_B_Receive(1, &RxMessage);
MCP2515_B_BitModify(CANINTF, 0x02, 0x00);
if (TRUE == RecvFlag)
{
if ((CAN_ID_EXT == RxMsg.IDE) && (CAN_RTR_DATA == RxMsg.RTR))
{
DcModuleMsgReceive(&RxMessage);
}
}
}
CommId.Mult = RxMessage.ExtId;
if(1 == CommId.Disp.R)
return;
if(1 == CommId.Disp.DP)
return;
if((CommId.Disp.DA_PS != UserParam.PillarCommAddr) && (CommId.Disp.DA_PS != BroadCastAddr))
return;
if(CommId.Disp.PF < 240)
{
Frame.DA = CommId.Disp.DA_PS;
Frame.FrameId = CommId.Disp.PF << 8;
if(CommId.Disp.DP)
Frame.FrameId += 0x010000;
}
else
{
Frame.DA = 0xFF;
Frame.FrameId = (CommId.Disp.PF << 8) + CommId.Disp.DA_PS;
if(CommId.Disp.DP)
Frame.FrameId += 0x010000;
}
switch(Frame.FrameId)
{
//case BCR:
case BPS:
case TCS:
case TPS:
case TAA:
//case BAC:
Frame.Prio = CommId.Disp.Prio;
Frame.DP = CommId.Disp.DP;
Frame.PF = CommId.Disp.PF;
Frame.SA = CommId.Disp.SA;
Frame.Len = RxMessage.DLC;
if(Frame.Len > 8)
Frame.Len = 8;
Frame.Data[0] = RxMessage.Data[0];
Frame.Data[1] = RxMessage.Data[1];
Frame.Data[2] = RxMessage.Data[2];
Frame.Data[3] = RxMessage.Data[3];
Frame.Data[4] = RxMessage.Data[4];
Frame.Data[5] = RxMessage.Data[5];
Frame.Data[6] = RxMessage.Data[6];
Frame.Data[7] = RxMessage.Data[7];
Frame.Len = 8;
{
portBASE_TYPE taskWoken = pdFALSE;
if(pdTRUE == xQueueSendFromISR(PillarMsg, &Frame, &taskWoken))
portEND_SWITCHING_ISR(taskWoken);
}
break;
default:
break;
}
switch(Frame.FrameId >> 8)
{
//case BCR:
case eCmd_sAckPillarSignIn:
case eCmd_sReqTimeSyn:
case eCmd_sAckHeartBeat:
case eCmd_sReqStartTransaction:
case eCmd_sReqStopTransaction:
case eCmd_sReqReserveNow:
case eCmd_sReqCancelReserve:
case eCmd_sAckCardSure:
case eCmd_sAckChgRecord:
case eCmd_sAckAwaitChgRecd:
case eCmd_sReqSetQrcode:
case eCmd_sReqPillarReset:
case eCmd_sReqGetServerIp:
case eCmd_sReqSetServerIp:
case eCmd_sReqGetRate:
case eCmd_sReqSetRate:
case eCmd_sAckStartTransaction:
case eCmd_sAckStopTransaction:
case eCmd_sAckCancelReserve:
case eCmd_cReqSetMoneyKey:
//case BAC:
Frame.Prio = CommId.Disp.Prio;
Frame.DP = CommId.Disp.DP;
Frame.PF = CommId.Disp.PF;
Frame.SA = CommId.Disp.SA;
Frame.Len = RxMessage.DLC;
if(Frame.Len > 8)
Frame.Len = 8;
Frame.Data[0] = RxMessage.Data[0];
Frame.Data[1] = RxMessage.Data[1];
Frame.Data[2] = RxMessage.Data[2];
Frame.Data[3] = RxMessage.Data[3];
Frame.Data[4] = RxMessage.Data[4];
Frame.Data[5] = RxMessage.Data[5];
Frame.Data[6] = RxMessage.Data[6];
Frame.Data[7] = RxMessage.Data[7];
Frame.Len = 8;
{
portBASE_TYPE taskWoken = pdFALSE;
if(pdTRUE == xQueueSendFromISR(InterMsg, &Frame, &taskWoken))
portEND_SWITCHING_ISR(taskWoken);
}
break;
default:
break;
}
}
void PillarCanInit(void)
{
MCP2515_B_EnterCritical();
MCP2515_B_SetInt(TCURxIrqHandle, DISABLE);
MCP2515_B_SpiInit(); //初始化MCU的SPI总线
MCP2515_B_Reset(); // MCP2515 启动前进行软件复位
//使用位修改指令将MCP2515设置为配置模式
//也就是将CANCTRL寄存器的REQOP[2:0]设置为100
MCP2515_B_BitModify(CANCTRL, 0xE0, (1 << REQOP2));
/*
//计算并设置MCP2515的位时间
// 时钟频率:Fosc = 16MHz
// 分频控制器 CNF1.BRP[5:0] = 7
// 最小时间份额 TQ = 2 * ( BRP + 1 ) / Fosc = 2*(7+1)/16M = 1uS
// 同步段 Sync Seg = 1TQ
// 传播段 Prop Seg = ( PRSEG + 1 ) * TQ = 1 TQ
// 相位缓冲段 Phase Seg1 = ( PHSEG1 + 1 ) * TQ = 1 TQ
// 相位缓冲段 Phase Seg2 = ( PHSEG2 + 1 ) * TQ = 1 TQ
// 同步跳转长度设置为 CNF1.SJW[1:0] = 00, 即 1TQ
// 总线波特率 NBR = Fbit = 1/(sync seg + Prop seg + PS1 + PS2 )
// = 1/(4TQ) = 1/4uS = 250kHz
//设置分频控制器CNF1.BRP[5:0] = 7,同步跳转长度设置为 CNF1.SJW[1:0] = 00
MCP2515_WriteReg( CNF1, (1<<BRP0)|(1<<BRP1)|(1<<BRP2) );
// 设置传播段 Prop Seg 为00,即1TQ,相位缓冲段 Phase Seg1的长度1TQ
MCP2515_WriteReg( CNF2, (1<<BTLMODE)|(0<<PHSEG10) );
// 设置 相位缓冲段 Phase Seg2为 1TQ , 禁用唤醒滤波器
MCP2515_WriteReg( CNF3, (0<<PHSEG20) );
*/
MCP2515_B_WriteReg(CNF1, (1 << BRP0) | (1 << BRP1) | (1 << BRP2));
// 设置传播段 Prop Seg 为00,即1TQ,相位缓冲段 Phase Seg1的长度1TQ
MCP2515_B_WriteReg(CNF2, (1 << BTLMODE) | (0 << PHSEG11));
// 设置 相位缓冲段 Phase Seg2为 1TQ , 禁用唤醒滤波器
MCP2515_B_WriteReg(CNF3, (0 << PHSEG21));
// 设置MCP2515中断使能寄存器,使能接收缓冲器中断
MCP2515_B_WriteReg(CANINTE, (1 << RX1IE) | (1 << RX0IE));
//设置数据接收相关寄存器
// 设置RXM[1:0]=11,关闭接收缓冲器0屏蔽/滤波功能,接收所有报文;禁止滚存功能
//MCP2515_WriteReg(RXB0CTRL, (1<<RXM1)|(1<<RXM0));
MCP2515_B_WriteReg(RXB0CTRL, (1 << RXM1) | (1 << RXM0) | (1 << BUKT));
// 设置RXM[1:0]=11,关闭接收缓冲器1屏蔽/滤波功能,接收所有报文;
MCP2515_B_WriteReg(RXB1CTRL, (1 << RXM1) | (1 << RXM0));
u8 Temp[4] =
{
0, 0, 0, 0
};
//设置6个验收滤波寄存器为0,
MCP2515_B_WriteBuffer(RXF0SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXF1SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXF2SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXF3SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXF4SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXF5SIDH, Temp, 4);
//设置2个验收滤波寄存器为0,
MCP2515_B_WriteBuffer(RXM0SIDH, Temp, 4);
MCP2515_B_WriteBuffer(RXM1SIDH, Temp, 4);
//配置引脚
//设置接收相关引脚控制寄存器,配置它们禁用第二功能
MCP2515_B_WriteReg(BFPCTRL, 0);
//调试使用,设置BFPCTRL使RX0BF,RX1BF设置为数字输出。
//MCP2515_BitModify( BFPCTRL, (1<<B1BFE)|(1<<B0BFE)|(1<<B1BFM)|(1<<B0BFM), (1<<B1BFE)|(1<<B0BFE) );
//设置发送相关引脚控制寄存器,配置它们禁用第二功能
MCP2515_B_WriteReg(TXRTSCTRL, 0);
//MCP2515进入环回模式,进行功能测试
//MCP2515_BitModify(CANCTRL, 0XE0, (1<<REQOP1));
//MCP2515进入正常模式
MCP2515_B_BitModify(CANCTRL, 0xE0, 0);
MCP2515_B_SetInt(PillarComm_Can_IRQHandler, ENABLE);
MCP2515_B_ExitCritical();
MCP2515_B_SpiHightSpeedInit();
}
u8 PillarCommInit(void)
{
/* Create Storage Message Queue */
PillarMsg = NULL;
osMessageQDef(PillarMsg, 64, StructPillarCommRecv);
PillarMsg = osMessageCreate(osMessageQ(PillarMsg), NULL);
InterMsg = NULL;
osMessageQDef( InterMsg, 64, StructPillarCommRecv);
InterMsg = osMessageCreate(osMessageQ(InterMsg), NULL);
PillarCanInit();
return TRUE;
}
#ifndef __DRV_PILLARCOMM_H__
#define __DRV_PILLARCOMM_H__
#include "Global.h"
#define PillarComm_BaudRate (250000) // (125000)
#define PillarComm_Can CAN2
#define PillarComm_Can_CLK RCC_APB1Periph_CAN2
#define PillarComm_Can_CLK_INIT RCC_APB1PeriphClockCmd
#define PillarComm_Can_IRQn CAN2_RX0_IRQn
#define PillarComm_Can_IRQHandler CAN2_RX0_IRQHandler
#define PillarComm_Can_TX_PIN GPIO_Pin_13
#define PillarComm_Can_TX_GPIO_PORT GPIOB
#define PillarComm_Can_TX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define PillarComm_Can_TX_SOURCE GPIO_PinSource13
#define PillarComm_Can_TX_AF GPIO_AF_CAN2
#define PillarComm_Can_RX_PIN GPIO_Pin_12
#define PillarComm_Can_RX_GPIO_PORT GPIOB
#define PillarComm_Can_RX_GPIO_CLK RCC_AHB1Periph_GPIOB
#define PillarComm_Can_RX_SOURCE GPIO_PinSource12
#define PillarComm_Can_RX_AF GPIO_AF_CAN2
#define MasterAddr (0x80)
#define BroadCastAddr (0xFF)
#define MinSlaveAddr (0x01)
#define MaxSlaveAddr (0x03)
typedef union
{
u32 Mult;
struct
{
u32 SA : 8;
u32 DA_PS : 8;
u32 PF : 8;
u32 DP : 1;
u32 R : 1;
u32 Prio : 3;
u32 Reserve : 3;
}Disp;
}UnionPillarCommId;
typedef struct
{
u8 Len;
u8 Data[8];
UnionPillarCommId Id;
}StructPillarCommSend;
typedef struct
{
u8 Prio;
u8 DP;
u8 PF;
u8 DA;
u8 SA;
u8 Len;
u8 Data[8];
u32 FrameId;
}StructPillarCommRecv;
typedef enum
{
BCR = 0x000100,//分体充电通道控制 100ms 点对点
BPS = 0x008100,//分体状态 100ms 广播
TCS = 0x000200,//主体充电通道状态 100ms 点对点
TPS = 0x008200,//主体桩状态 100ms 广播
TAA = 0x00C100,//主体地址分配 100ms 广播
BAC = 0x00C200,//分体地址确认 100ms 广播
IDT = 0x006600,//桩号传输
}EnumPillarCommFrameId;
extern osMessageQId PillarMsg;
extern osMessageQId InterMsg;
extern void PillarCanInit(void);
extern u8 PillarCommInit(void);
extern u8 PillarCommSendMsg(StructPillarCommSend *pMsg);
#endif
#ifndef __THD_PILLARCOMM_H__
#define __THD_PILLARCOMM_H__
#include "Global.h"
typedef union
{
u8 Byte[8];
struct
{
u8 ChannelReq : 1;
u8 OutRelay : 1;
u8 DrainResist : 1;
u8 : 5;
u8 ChargeStart : 1;
u8 : 7;
u8 : 8;
u8 PowerOut : 1;
u8 : 7;
u16 NeedVolt : 16;
u16 NeedCurrt : 16;
}Bit;
}UnionBranchCtrl;
typedef union
{
u8 Byte[8];
struct
{
u8 EmergencyStop : 1;
u8 AddrConflict : 1;
u8 CommError : 1;
u8 IsolateError : 1;
u8 IsolateWarrn : 1;
u8 : 3;
u8 : 8;
u8 : 8;
u8 : 8;
u8 : 8;
u8 : 8;
u8 : 8;
u8 : 8;
}Bit;
}UnionBranchSta;
typedef union
{
u8 Byte[8];
struct
{
u8 ChannelSta : 4;
u8 OutRelay : 1;
u8 DrainResist : 1;
u8 : 1;
u8 : 1;
u8 : 8;
u8 : 8;
u8 PowerOut : 1;
u8 : 2;
u8 ModNum : 5;
u16 ActualVolt : 16;
u16 ActualCurrt : 16;
}Bit;
}UnionTrunkResp;
typedef union
{
u8 Byte[8];
struct
{
u8 DrainResist : 1;
u8 RelayError : 1;
u8 MainDoor : 1;
u8 SpdError : 1;
u8 CommError_0 : 1;
u8 CommError_1 : 1;
u8 CommError_2 : 1;
u8 CommError_3 : 1;
u8 CommError_4 : 1;
u8 CommError_5 : 1;
u8 VaildNum_4 : 3;
u8 VaildNum_5 : 3;
u8 MaxVolt : 8;
u8 MinVolt : 8;
u8 MaxCurrt : 8;
u8 MinCurrt : 8;
u8 VaildNum_0 : 4;
u8 VaildNum_1 : 4;
u8 VaildNum_2 : 4;
u8 VaildNum_3 : 4;
}Bit;
}UnionTrunkSta;
typedef union
{
u8 Byte[8];
struct
{
u16 Volt_0 : 16;
u16 Volt_1 : 16;
u16 Volt_2 : 16;
u16 Volt_3 : 16;
}Bit;
}UnionAssignAddr;
typedef union
{
u8 Byte[8];
struct
{
u16 Volt : 16;
u16 : 16;
u16 : 16;
u16 : 16;
}Bit;
}UnionConfigAddr;
typedef struct
{
UnionBranchCtrl Ctrl;
u32 CtrlRecvTick;
UnionBranchSta Status;
u32 StatusRecvTick;
UnionConfigAddr ConfigAddr;
u32 ConfigAddrRecvTick;
}StructTrunkRecv;
typedef struct
{
UnionTrunkResp LastVal;
UnionTrunkResp CurVal;
u8 SendCnt;
u32 CycleSendTick;
u32 EventSendTick;
}StructTrunkRespSend;
typedef struct
{
UnionTrunkSta LastVal;
UnionTrunkSta CurVal;
u8 SendCnt;
u32 CycleSendTick;
u32 EventSendTick;
}StructTrunkStaSend;
typedef struct
{
UnionAssignAddr LastVal;
UnionAssignAddr CurVal;
u8 SendCnt;
u32 CycleSendTick;
u32 EventSendTick;
}StructTrunkAddrSend;
typedef struct
{
StructTrunkRespSend Resp[3];
StructTrunkStaSend Sta;
StructTrunkAddrSend Addr;
}StructTrunkSend;
typedef struct
{
u8 HeartBeatFlag; //0ʧ 1
}StructBranchInterRec;
typedef struct
{
UnionTrunkResp TrunkResp;
u32 TrunkRespRecvTick;
UnionTrunkSta TrunkSta;
u32 TrunkStaRecvTick;
UnionAssignAddr AssignAddr;
u32 AssignAddrRecvTick;
StructBranchInterRec IntInfo;
u32 AssignInterRecvTick;
}StructBranchRecv;
typedef struct
{
UnionBranchCtrl LastVal;
UnionBranchCtrl CurVal;
u8 SendCnt;
u32 CycleSendTick;
u32 EventSendTick;
}StructBranchCtrlSend;
typedef struct
{
UnionBranchSta LastVal;
UnionBranchSta CurVal;
u8 SendCnt;
u32 CycleSendTick;
u32 EventSendTick;
}StructBranchStaSend;
typedef struct
{
u8 HeartBeatFlag; //0ʧ 1
}StructBranchInterSend;
typedef struct
{
StructBranchCtrlSend Ctrl;
StructBranchStaSend Sta;
StructBranchInterSend IntInfo;
}StructBranchSend;
extern StructBranchSend BranchSend;
extern StructTrunkRecv TrunkRecv[3];
extern void ChannelSet(EnumSwitchStatus Set) ;
extern EnumSwitchStatus ChannelStaGet(void);
extern void PillarComm(void const *argument);
#endif
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论