原文地址:<a target=_blank href="http://blog.csdn.net/huangxianxinalice/article/details/9352313">http://blog.csdn.net/huangxianxinalice/article/details/9352313</a>
/
/**
\param pMbx 指针指向发送邮箱的命令(由主站来读)
\param flags Bit 0-6: 邮箱协议的类型:
0x01 - 紧急服务
0x02 - CoE 服务
0x04 - SoE 服务
0x80 - EoE 服务
0x10 - AoE 服务
0x20 - VoE 服务
Bit 7: 0 - 没有更多的碎片发送给需要的邮箱服务
1 - 有更多的碎片发送给邮箱服务,对应的相关函数XXXX_ContinueInd-function将会被带调用来产生新的碎片
\return 0: Success - 邮箱服务将会被存储在发送邮箱里
1: Failed - 邮箱命令不能被存储在发送邮箱,函数XXXX_ContinueInd service将会被调用当邮箱被主站读的时候。
\brief 这个函数放一个新的邮箱服务在发送邮箱
*
UINT8 MBX_MailboxSendReq( TMBX MBXMEM * pMbx, UINT8 flags )
{
UINT8 result = 0;
/* HBu 06.02.06: 在INIT状态,一个邮箱发送请求将会被拒绝 */
if ( (nAlStatus & STATE_MASK) == STATE_INIT )
return ERROR_INVALIDSTATE;
ENTER_MBX_CRITICAL;
DISABLE_MBX_INT;
/* 计数器在邮箱头里面,将会增加在每个新的邮箱服务被发送,如果邮箱的数据链路层被支持。
(software switch MAILBOX_REPEAT_SUPPORTED set)*/
pMbx->MbxHeader.Flags[MBX_OFFS_COUNTER] &= ~MBX_MASK_COUNTER;
/* HBu 13.02.06: 如果邮箱服务不能发送,那么Repeat_Counter将会添加得太多 */
/* u8MbxCounter 保留了一个实际的计数器给数据帧头,只有值1~7才被允许,假如邮箱的数据链路层支持的话。 */
if ( (u8MbxReadCounter & 0x07) == 0 )
u8MbxReadCounter = 1;
pMbx->MbxHeader.Flags[MBX_OFFS_COUNTER] |= u8MbxReadCounter << MBX_SHIFT_COUNTER;
/* 尝试将邮箱的命令拷贝到ESC里面 */
if ( MBX_CopyToSendMailbox(pMbx) != 0 )
{
/* 没有成功,说明发送邮箱已满,设置标志位 */
#if MAILBOX_QUEUE
result = PutInMbxQueue(pMbx, &sMbxSendQueue);
if (result != 0)
flags |= FRAGMENTS_FOLLOW;
else
u8MbxReadCounter++;
#else
flags |= FRAGMENTS_FOLLOW;
result = 1;
#endif
}
/* HBu 13.02.06: Repeat-Counter会增加得太多,如果邮箱服务可能发送 */
else
{
u8MbxReadCounter++;
}
if ( flags & FRAGMENTS_FOLLOW )
{
/* 存储对应的邮箱服务,对应的XXX_ContinueInd函数将被调用当发送邮箱将被主站读,因为这里有一些邮箱命令发送给这个服务*/
u8MailboxSendReqStored |= (flags & ((UINT8) ~FRAGMENTS_FOLLOW));
}
ENABLE_MBX_INT;
LEAVE_MBX_CRITICAL;
return result;
}