CMD0x22_Request_AnalogChannelSet_8000.c 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #include <string.h>
  2. #include "delay.h"
  3. #include "DebugDataDefine.h"
  4. #include "CommandsDefine.h"
  5. #include "AnalogChannelCtrl_Dictionary.h"
  6. #include "ProjectConfig.h"
  7. #include "Probe_MSO7000X_2d5g.h"
  8. #include "AnalogChannelCtrl_8g.h"
  9. #include "Helper.h"
  10. #include "usart.h"
  11. //////////////////////////////////////////////////////////////////////////////
  12. // 2024/7/X GHz_wcj MSO8000HD 8G模拟通道控制
  13. //////////////////////////////////////////////////////////////////////////////
  14. u8 Get4094CtrlWord(struct Paras595 params, u32* ctrlWord)
  15. {
  16. u32 _ctrlWord = 0;
  17. //衰减
  18. if(params.att == 0) //直通
  19. {
  20. _ctrlWord|= Bit_595_42542_V1;
  21. }
  22. else if(params.att == 1) //放大
  23. {
  24. _ctrlWord|= (Bit_595_42542_V1 | Bit_595_42542_V2 | Bit_595_1144_IN1);
  25. }
  26. else if(params.att==2) //衰减
  27. {
  28. _ctrlWord|=(Bit_595_42542_V2 | Bit_595_1144_IN2);
  29. }
  30. else if(params.att==3) //参考信号
  31. {
  32. _ctrlWord|=(Bit_595_1144_IN1 | Bit_595_1144_IN2);
  33. }
  34. else
  35. {
  36. return 0; //error
  37. }
  38. ctrlWord[0]=_ctrlWord;
  39. return 1;
  40. }
  41. u8 AnalogChannelSet_Check_Len(u16 dataLen)
  42. {
  43. if(dataLen<PACKAGE_CHANNELSET_INDEX_BYTES+PACKAGE_CHANNELSET_DATA_BYTES+PACKAGE_CHANNELSET_CHECK_AREA_BYTES+PACKAGE_CHANNELSET_FRAMEID_BYTES)
  44. {
  45. return 0;
  46. }
  47. if((dataLen-PACKAGE_CHANNELSET_INDEX_BYTES-PACKAGE_CHANNELSET_CHECK_AREA_BYTES-PACKAGE_CHANNELSET_FRAMEID_BYTES)%PACKAGE_CHANNELSET_DATA_BYTES!=0)
  48. {
  49. return 0;
  50. }
  51. return 1;
  52. }
  53. void AnalogChannel_GetAll4094Word(u8 *pData,u8 channelId){
  54. //控制HC595/CD4094
  55. struct Paras595 params595;
  56. params595.att = pData[OFFSET_IN_DATA_ATT_START] ; //衰减
  57. u32 ctrlWord595 = 0;
  58. u8 result = Get4094CtrlWord(params595, &ctrlWord595);
  59. if(result==0){ //参数错误
  60. return;
  61. }
  62. Low32HC595 |= (ctrlWord595 << 8*(channelId-1));
  63. }
  64. void AnalogChannel_SetAll4094(u8 *pData){
  65. u8 channelId = pData[0];
  66. Low32HC595 = Low32HC595 & ((u32)1<<31);
  67. u8 gotChData = 0;
  68. for(int i=0; i<MAX_CHANNEL_NUM; i++)
  69. {
  70. if(((channelId>>i) & 0x01) == 1){
  71. AnalogChannel_GetAll4094Word(pData + PACKAGE_CHANNELSET_INDEX_BYTES + gotChData * PACKAGE_CHANNELSET_DATA_BYTES, i+1);
  72. gotChData++;
  73. }
  74. }
  75. CD_4094(Low32HC595, 4);
  76. delay_ms(2);
  77. }
  78. void AnalogChannelSet(u8 *pData,u8 channelId)
  79. {
  80. u8 gain1 = pData[OFFSET_IN_DATA_GAIN_START] ;
  81. u8 gain2 = pData[OFFSET_IN_DATA_GAIN_START + 1] ;
  82. u16 fgn = pData[OFFSET_IN_DATA_FGN_START] + (pData[OFFSET_IN_DATA_FGN_START + 1]<<8);
  83. u16 fgp = pData[OFFSET_IN_DATA_FGP_START] + (pData[OFFSET_IN_DATA_FGP_START + 1]<<8);
  84. u16 fdn = pData[OFFSET_IN_DATA_FDN_START] + (pData[OFFSET_IN_DATA_FDN_START + 1]<<8);
  85. u16 fdp = pData[OFFSET_IN_DATA_FDP_START] + (pData[OFFSET_IN_DATA_FDP_START + 1]<<8);
  86. u32 ConfigWord;
  87. u8 dac_index;
  88. SpiLines spiLines; //SPI总线定义
  89. GPIOPin csLine;
  90. GPIOPin dataLine;
  91. GPIOPin clkLine;
  92. spiLines.csLine = &csLine;
  93. spiLines.dataLine = &dataLine;
  94. spiLines.clkLine = &clkLine;
  95. //控制字
  96. ParamsDAC_8G paramsDAC;
  97. paramsDAC.chnlId = channelId;
  98. //fgn
  99. paramsDAC.type = FGN;
  100. paramsDAC.data = fgn; //bias
  101. ConfigWord = GetDACConfigWord_8G(paramsDAC,&dac_index);
  102. DAC_AD5675(ConfigWord,dac_index);
  103. //fgp
  104. paramsDAC.type = FGP;
  105. paramsDAC.data = fgp; //bias
  106. ConfigWord = GetDACConfigWord_8G(paramsDAC,&dac_index);
  107. DAC_AD5675(ConfigWord,dac_index);
  108. //fdn
  109. paramsDAC.type = FDN;
  110. paramsDAC.data = fdn; //bias
  111. ConfigWord = GetDACConfigWord_8G(paramsDAC,&dac_index);
  112. DAC_AD5675(ConfigWord,dac_index);
  113. //fdp
  114. paramsDAC.type = FDP;
  115. paramsDAC.data = fdp; //bias
  116. ConfigWord = GetDACConfigWord_8G(paramsDAC,&dac_index);
  117. DAC_AD5675(ConfigWord,dac_index);
  118. //dsa1 -> gain1
  119. GetDsaSpiLine(channelId, DSA0_8G, &spiLines);
  120. DSA_PE43711_8G(LMH43711_ADDR_GAIN, gain1, &spiLines); //LMH6401_ADDR_GAIN
  121. //dsa2 -> gain2
  122. GetDsaSpiLine(channelId, DSA1_8G, &spiLines);
  123. DSA_PE43711_8G(LMH43711_ADDR_GAIN, gain2, &spiLines);
  124. }
  125. void CMD0x22_Request_AnalogChannelSet_process(u8 *pData,u16 dataLen,u8 bIsContentBitInverted_Recv,u8 bIsContentBitInverted_SendBack)
  126. {
  127. if(IsChannelSetting!=0)
  128. {
  129. return;
  130. }
  131. IsChannelSetting = 1;
  132. #ifdef RUNNING_WHERE_AT_BOOT
  133. Command_SendbackErrorMessage(Error0x02_CannotRunAtBoot,1);
  134. #else
  135. memcpy(G_DebugData_AnalogChannel_LastRecvData,pData,dataLen);
  136. if(AnalogChannelSet_Check_Len(dataLen)==0)
  137. {
  138. IsChannelSetting=0;
  139. Command_SendbackErrorMessage(Error0x05_CMD_ParaLentghError,1);
  140. return;
  141. }
  142. //pData[0],bit0-bit3:表示通道读热码;
  143. u8 channelIds = pData[0] & 0x0f;
  144. AnalogChannel_SetAll4094(pData);
  145. u8 gotChData = 0;
  146. for(int i=0; i<MAX_CHANNEL_NUM; i++)
  147. {
  148. u8 openFlag = (channelIds>>i) & 0x01;
  149. if(openFlag == 1)
  150. {
  151. AnalogChannelSet(pData + PACKAGE_CHANNELSET_INDEX_BYTES + gotChData * PACKAGE_CHANNELSET_DATA_BYTES,i+1);
  152. gotChData++;
  153. }
  154. }
  155. //Call back
  156. u8 dataBytes=PACKAGE_CHANNELSET_FRAMEID_BYTES;
  157. for(u8 i=0;i<PACKAGE_CHANNELSET_FRAMEID_BYTES;i++)
  158. {
  159. USART_WR_BUF[i] = pData[dataLen-PACKAGE_CHANNELSET_FRAMEID_BYTES+i];
  160. }
  161. USART6_Send(CMD0x22_Request_AnalogChannelSet,dataBytes,bIsContentBitInverted_SendBack);
  162. //end
  163. IsChannelSetting = 0;
  164. #endif
  165. }