Common.c 6.19 KB
Newer Older
崔立宝's avatar
崔立宝 committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
/**************************表针调试驱动**************************************/
#include "Common.h"

uint8_t   RSB_P;
uint8_t   RX_BUF[cnRSBufLen];    //串口接收缓存区
uint8_t   TX_BUF[cnRSBufLen];    //串口发送缓存区
//ACK命令数据
#pragma INTO_ROM
const uint8_t CommandACK[5] =
{
  cnUASTHandH,	  // 串口接受消息头高位
  cnUASTHandL,  	// 串口接受消息头低位
  2,
  comACK,   	// ACK
  (uint8_t)(2 + comACK),
};
//NCK命令数据
#pragma INTO_ROM
const uint8_t CommandNCK[5] =
{
  cnUASTHandH,	 // 串口接受消息头高位
  cnUASTHandL,   // 串口接受消息头低位
  2,
  comNCK,   // NACK
  (uint8_t)(2 + comNCK),
};
//---------------------------------------------------------------------------
//读写命令对应的RAM数据首地址表
#pragma INTO_ROM

const uint8_t *CommandRAMIF[16] 	=
{
  (uint8_t *)0,
  (uint8_t *)0,
  (uint8_t *) &CSBFrJDTB[1],	  //编号不能动 车速表
  (uint8_t *) &ZSBFrJDTB[1],    //编号不能动 转速表
  (uint8_t *)0,//&KPuls_cs,     //编号不能动
  (uint8_t *)0,			            //编号不能动
  (uint8_t *) &SUIBVJDTB[0],    //编号不能动 水温表
  (uint8_t *) &YOUBVJDTB[0],    //编号不能动 燃油表
  (uint8_t *)0,        		      //
  (uint8_t *)0,                 //
  (uint8_t *)0,      		        //
  (uint8_t *)0,//&CSB_SS_FrHL,  //编号不能动
  (uint8_t *)0,//&ZSB_SS_FrHL,  //编号不能动
  (uint8_t *)0,//&SBInputV,     //编号不能动
  (uint8_t *)0,//&YBInputV,	  	//编号不能动
  (uint8_t *)0,//&CJINF[0]      //编号不能动
};
/**************************************************
向串口发送1个字节数据
***************************************************/
void SendByteToUART(uint8_t myByte)
{
55 56 57
  wdt_reset();                  //复位看门狗定时器
  while (SCI0SR1_TDRE == 0);	  //等待发送缓存区空
  SCI0DRL = myByte;
崔立宝's avatar
崔立宝 committed
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
}
/**************************************************
向串口发送1个字节数据(用于调试)
***************************************************/
void SendWordToUART(uint16_t myWord)
{
  uint8_t *mP;
  mP = (uint8_t *)&myWord;
  SendByteToUART(mP[0]);
  SendByteToUART(mP[1]);
}
/**************************************************
把ROM中的一组数据从串口发送出去
***************************************************/
void SendRomStrToUART(uint8_t *myROMADR, uint8_t mDataLen)
{
  uint8_t i;
75
  for (i = 0; i < mDataLen; i++)
崔立宝's avatar
崔立宝 committed
76
  {
77
    SendByteToUART(myROMADR[i]); //向串口发送1个字节数据
崔立宝's avatar
崔立宝 committed
78 79 80 81 82 83 84 85 86 87 88 89 90 91
  }
}
/**************************************************
向仪器发ACK
***************************************************/
void SendACKToSBEI(void)
{
  SendRomStrToUART((uint8_t *)CommandACK, sizeof(CommandACK)); //给仪器发ACK
}
/**************************************************
//初始化串口接收程序
***************************************************/
void InitUARTRecvP(void)
{
92
  cli();                        //禁止全局中断
崔立宝's avatar
崔立宝 committed
93
  RSB_P = 0;
94
  sei();                        //开全局中断
崔立宝's avatar
崔立宝 committed
95 96 97 98 99 100 101
}
/**************************************************
串口接收程序(在19200波特率下.用于设置参数)
出口:=1表示收到一帧数据
***************************************************/
INT8U UARTRecvieP(void)
{
102
  if ((RSB_P >= 1) && (RX_BUF[0] != cnUASTHandH))
崔立宝's avatar
崔立宝 committed
103 104
    goto UARTRciP1;

105
  if ((RSB_P >= 2) && (RX_BUF[1] != cnUASTHandL))
崔立宝's avatar
崔立宝 committed
106 107
    goto UARTRciP1;

108
  if ((RSB_P >= 3) && (RX_BUF[2] > cnRSDatLen))
崔立宝's avatar
崔立宝 committed
109 110
    goto UARTRciP1;

111
  if (RSB_P >= (RX_BUF[2] + 3))
崔立宝's avatar
崔立宝 committed
112 113 114
    return 1;
  else
    return 0;
115 116 117
  
UARTRciP1:
  InitUARTRecvP();              //初始化串口接收程序
崔立宝's avatar
崔立宝 committed
118 119 120 121 122 123 124 125 126 127 128 129 130
  return 0;
}
/*****************************************************************************
 判断串口接受缓存区是否收到正确的数据
 出口:=0表示数据正确,COPY数据到发送缓存区,且函数自动清空缓存区,并重新开始接受
      =1表示数据不正确,且函数自动清空缓存区,并重新开始接受
      =2表示没有收到数据
*****************************************************************************/
INT8U RSSRecivJudge(void)
{
  INT8U i;
  INT8U mCC = 0;

131
  if (!UARTRecvieP())                    //串口有收到一帧数据
崔立宝's avatar
崔立宝 committed
132 133
    return 2;                            //no

134
  for (i = 0; i < RX_BUF[2]; i++)
崔立宝's avatar
崔立宝 committed
135 136
    mCC = mCC + RX_BUF[2 + i];

137
  if (mCC == RX_BUF[RX_BUF[2] + 2])
崔立宝's avatar
崔立宝 committed
138
  {
139
    for (i = 0; i < cnRSBufLen; i++)     //COPY串口接收缓存区数据到串口发送缓存区
崔立宝's avatar
崔立宝 committed
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166
      TX_BUF[i] = RX_BUF[i];

    InitUARTRecvP();                     //初始化并打开串口接收程序
    return 0;
  }
  else
  {
    InitUARTRecvP();                    //初始化并打开串口接收程序
    return 1;
  }
}
/***************************************************
根据发送缓存区的数据类型,序号,数据字节数计算RAM首地址
入口:发送缓存区数据
***************************************************/
INT8U *JSRAMADRGJLXN(void)
{
  return  TX_BUF[4] * TX_BUF[5] + (INT8U *)CommandRAMIF[TX_BUF[3] & 0x0F];
}
/***************************************************
处理从仪器发来的读数据命令函数
入口:命令数据在发送缓存区
***************************************************/
void ReadDataCOMPRG(void)
{
  INT8U i;
  INT8U *pRAMAdr;
167
  
崔立宝's avatar
崔立宝 committed
168 169
  TX_BUF[2] = TX_BUF[2] + TX_BUF[5];
  pRAMAdr = JSRAMADRGJLXN();                //根据发送缓存区的数据类型,序号,数据字节数计算RAM首地址
170 171
  
  for (i = 0; i < TX_BUF[5]; i++)
崔立宝's avatar
崔立宝 committed
172 173 174 175 176 177 178 179 180 181 182
    TX_BUF[6 + i] = *(pRAMAdr + i);
  JSCCSendDataToYQ();                       //计算发送缓存区数据CC并发送数据到仪器
}
/***************************************************
计算发送缓存区数据CC并发送数据到仪器
***************************************************/
void JSCCSendDataToYQ(void)
{
  INT8U i;
  INT8U mCC = 0;

183
  for (i = 0; i < TX_BUF[2]; i++)
崔立宝's avatar
崔立宝 committed
184 185 186 187
    mCC = mCC + TX_BUF[2 + i];

  TX_BUF[TX_BUF[2] + 2] = mCC;

188
  for (i = 0; i < (TX_BUF[2] + 3); i++)
崔立宝's avatar
崔立宝 committed
189 190 191 192 193 194 195 196 197 198 199 200 201
    SendByteToUART(TX_BUF[i]);
}
/***************************************************
处理从仪器发来的写数据命令函数
入口:命令数据在发送缓存区
(注:如果是,写车,转速表,油,水表,则要更新表的目标角度
***************************************************/
void WriteDataCOMPRG(void)
{
  INT8U i;
  INT8U *pRAMAdr;
  INT8U mTPE;

202
  pRAMAdr = JSRAMADRGJLXN();                //根据发送缓存区的数据类型,序号,数据字节数计算RAM首地址
崔立宝's avatar
崔立宝 committed
203

204
  for (i = 0; i < TX_BUF[5]; i++)
崔立宝's avatar
崔立宝 committed
205 206 207 208
    *(pRAMAdr + i) = TX_BUF[6 + i];

  mTPE = TX_BUF[3] & 0x0F;

209
  if (mTPE == 2)          //
崔立宝's avatar
崔立宝 committed
210
    STEPPER_MOTOR_0_DST_STEP = *((INT16U *)(pRAMAdr + 2)); 
211
  if (mTPE == 3)          //
崔立宝's avatar
崔立宝 committed
212
    STEPPER_MOTOR_3_DST_STEP = *((INT16U *)(pRAMAdr + 2)); 
213
  if (mTPE == 6)          //                         
崔立宝's avatar
崔立宝 committed
214
    STEPPER_MOTOR_1_DST_STEP = *((INT16U *)(pRAMAdr + 2));   
215
  if (mTPE == 7)          //                           
崔立宝's avatar
崔立宝 committed
216 217 218
    STEPPER_MOTOR_2_DST_STEP = *((INT16U *)(pRAMAdr + 2));   
}