CMD0x22_Request_AnalogChannelSet_8000.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  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_2d5g_base.h"
  9. #include "Helper.h"
  10. #include "usart.h"
  11. //////////////////////////////////////////////////////////////////////////////
  12. // 2203/5/X GHz_ljw 合并版,业务逻辑下沉 模拟通道控制
  13. //////////////////////////////////////////////////////////////////////////////
  14. u8 Get4094CtrlWord(struct Paras595 params, u32* ctrlWord)
  15. {
  16. u32 _ctrlWord = 0;
  17. u8 _isHigh = 0;
  18. // 带宽
  19. if(params.bandwidth == 0xFFFF)//FULL
  20. {
  21. _ctrlWord|=0;
  22. }
  23. else if(params.bandwidth == 500) //500MHz
  24. {
  25. _ctrlWord|=bwCtrlBit0 | bwCtrlBit2;
  26. }
  27. else if(params.bandwidth == 200) //200MHz
  28. {
  29. _ctrlWord|=bwCtrlBit0;
  30. }
  31. else if(params.bandwidth == 20) //20MHz
  32. {
  33. _ctrlWord|=bwCtrlBit0 | bwCtrlBit1;
  34. }
  35. else
  36. {
  37. return 0; //error
  38. }
  39. // 阻抗
  40. if(params.coupling == 0 && params.high_low == 1)//DC50
  41. {
  42. _ctrlWord|=coupleCtrl_4094[0];
  43. }
  44. else if(params.coupling == 0 && params.high_low == 0)//DC1M
  45. {
  46. _ctrlWord|=coupleCtrl_4094[1];
  47. _isHigh = 1;
  48. }
  49. else if(params.coupling == 1 && params.high_low == 0)//AC1M
  50. {
  51. _ctrlWord|=coupleCtrl_4094[2];
  52. _isHigh = 1;
  53. }
  54. else
  55. {
  56. return 0; //error
  57. }
  58. //衰减
  59. if(_isHigh)
  60. {
  61. if(params.att == 0) //直通
  62. {
  63. _ctrlWord|= lzDelayBit | hzDelayBit ;
  64. }
  65. else if(params.att == 12) //12dB
  66. {
  67. _ctrlWord|=lzDelayBit;
  68. }
  69. else if(params.att==26) //26dB
  70. {
  71. _ctrlWord|=hzDelayBit;
  72. }
  73. else if(params.att==38) //38dB
  74. {
  75. _ctrlWord|=0;
  76. }
  77. else
  78. {
  79. return 0; //error
  80. }
  81. }
  82. else
  83. {
  84. if(params.att==0) //直通
  85. {
  86. _ctrlWord|=0;
  87. }
  88. else if(params.att==6)//6dB
  89. {
  90. _ctrlWord|=lzDelayBit;
  91. }
  92. else if(params.att==12)//12dB
  93. {
  94. _ctrlWord|=hzDelayBit;
  95. }
  96. else if(params.att==20)//20dB
  97. {
  98. _ctrlWord|=lzDelayBit|hzDelayBit;
  99. }
  100. else
  101. {
  102. return 0; //error
  103. }
  104. }
  105. ctrlWord[0]=_ctrlWord;
  106. return 1;
  107. }
  108. u8 AnalogChannelSet_Check_Len(u16 dataLen)
  109. {
  110. if(dataLen<PACKAGE_CHANNELSET_DATA_BYTES+PACKAGE_CHANNELSET_INDEX_BYTES+PACKAGE_CHANNELSET_CHECK_AREA_BYTES+PACKAGE_CHANNELSET_FRAMEID_BYTES)
  111. {
  112. return 0;
  113. }
  114. if((dataLen-PACKAGE_CHANNELSET_INDEX_BYTES-PACKAGE_CHANNELSET_CHECK_AREA_BYTES-PACKAGE_CHANNELSET_FRAMEID_BYTES)%PACKAGE_CHANNELSET_DATA_BYTES!=0)
  115. {
  116. return 0;
  117. }
  118. return 1;
  119. }
  120. /*
  121. u32 GetDACConfigWord(struct ParasDAC params,u8* dac_index)
  122. {
  123. u32 ConfigWord;
  124. u8 high = offset_hz;
  125. u8 low = offset_lz;
  126. if(params.isBias==1)
  127. {
  128. high = move_hz;
  129. low = move_lz;
  130. }
  131. ConfigWord = 0x10300000;
  132. u8 dataType = params.high_low == 0 ? high : low;
  133. dac_index[0] = dacPortInfoTable[params.channelId-1][dataType][0] - 5;
  134. u8 dac_indexEx = dacPortInfoTable[params.channelId-1][dataType][2];
  135. u8 port = dacPortInfoTable[params.channelId-1][dataType][1];
  136. ConfigWord |= dac_indexEx << 24;
  137. ConfigWord |= port << 16;
  138. ConfigWord |= params.data;
  139. if(dac_index[0]==1){
  140. dac_index=dac_index; //test point
  141. }
  142. return ConfigWord;
  143. }*/
  144. void AnalogChannel_GetAll4094Word(u8 *pData,u8 channelId){
  145. //控制HC595/CD4094
  146. struct Paras595 params595;
  147. params595.gain = pData[OFFSET_IN_DATA_GAIN_START] ; //放大
  148. params595.att = pData[OFFSET_IN_DATA_ATT_START] ; //衰减
  149. params595.coupling = pData[OFFSET_IN_DATA_COUPLING_START];
  150. params595.high_low = pData[OFFSET_IN_DATA_HIGH_LOW_START];
  151. params595.bandwidth = pData[OFFSET_IN_DATA_BANDWIDTH_START] + (pData[OFFSET_IN_DATA_BANDWIDTH_START + 1]<<8);
  152. u32 ctrlWord595 = 0;
  153. u8 result = Get4094CtrlWord(params595, &ctrlWord595);
  154. if(result==0){ //参数错误
  155. return;
  156. }
  157. Low32HC595 |= (ctrlWord595 << 8*(channelId-1));
  158. }
  159. void AnalogChannel_SetAll4094(u8 *pData){
  160. u8 channelId = pData[1];
  161. Low32HC595 = Low32HC595 & ((u32)1<<31);
  162. u8 gotChData = 0;
  163. for(int i=0; i<MAX_CHANNEL_NUM; i++)
  164. {
  165. if(((channelId>>i) & 0x01) == 1){
  166. AnalogChannel_GetAll4094Word(pData + PACKAGE_CHANNELSET_INDEX_BYTES + gotChData * PACKAGE_CHANNELSET_DATA_BYTES, i+1);
  167. gotChData++;
  168. }
  169. }
  170. CD_4094(Low32HC595, 4);
  171. delay_ms(2);
  172. }
  173. /// @brief 通过595给DSA2配置spi使能
  174. /// @param pData
  175. /// @param channelId
  176. /// @param csEnable
  177. void AnalogChannel_GetAll4094Word_DSA2_CS(u8 *pData,u8 channelId, u8 csEnable){
  178. //控制HC595/CD4094
  179. struct Paras595 params595;
  180. params595.gain = pData[OFFSET_IN_DATA_GAIN_START] ; //放大
  181. params595.att = pData[OFFSET_IN_DATA_ATT_START] ; //衰减
  182. params595.coupling = pData[OFFSET_IN_DATA_COUPLING_START];
  183. params595.high_low = pData[OFFSET_IN_DATA_HIGH_LOW_START];
  184. params595.bandwidth = pData[OFFSET_IN_DATA_BANDWIDTH_START] + (pData[OFFSET_IN_DATA_BANDWIDTH_START + 1]<<8);
  185. u32 ctrlWord595 = 0;
  186. u8 result = Get4094CtrlWord(params595, &ctrlWord595);
  187. if(result==0){ //参数错误
  188. return;
  189. }
  190. ctrlWord595 |= (csEnable << 7);
  191. Low32HC595 |= (ctrlWord595 << 8*(channelId-1));
  192. }
  193. /// @brief 通过595给DSA2配置spi使能
  194. /// @param pData
  195. /// @param CHx_DSA_CSn
  196. void AnalogChannel_SetAll4094_DSA2_CS(u8 *pData, u8 CHx_DSA_CSn){
  197. u8 channelId = pData[1];
  198. Low32HC595 = Low32HC595 & ((u32)1<<31);
  199. u8 gotChData = 0;
  200. for(int i=0; i<MAX_CHANNEL_NUM; i++)
  201. {
  202. if(((channelId>>i) & 0x01) == 1){
  203. u8 csEnable = (CHx_DSA_CSn == i + 1) ? 1 : 0;
  204. AnalogChannel_GetAll4094Word_DSA2_CS(pData + PACKAGE_CHANNELSET_INDEX_BYTES + gotChData * PACKAGE_CHANNELSET_DATA_BYTES, i+1, csEnable);
  205. gotChData++;
  206. }
  207. }
  208. CD_4094(Low32HC595, 4);
  209. delay_us(2);
  210. }
  211. /// @brief 开关通道
  212. /// @param channelId
  213. /// @param openFlag
  214. void PowerAnaChnl(u8 channelId, u8 openFlag)
  215. {
  216. GPIOPin powerGpioPin; //控制管脚
  217. switch(channelId){
  218. case CH1_DSA_CS:
  219. {
  220. powerGpioPin.gpioType = GPIOD;
  221. powerGpioPin.pinIndex = GPIO_Pin_10;
  222. break;
  223. }
  224. case CH2_DSA_CS:
  225. {
  226. powerGpioPin.gpioType = GPIOE;
  227. powerGpioPin.pinIndex = GPIO_Pin_10;
  228. break;
  229. }
  230. case CH3_DSA_CS:
  231. {
  232. powerGpioPin.gpioType = GPIOC;
  233. powerGpioPin.pinIndex = GPIO_Pin_1;
  234. break;
  235. }
  236. case CH4_DSA_CS:
  237. {
  238. powerGpioPin.gpioType = GPIOE;
  239. powerGpioPin.pinIndex = GPIO_Pin_3;
  240. break;
  241. }
  242. default:
  243. return;
  244. }
  245. if(openFlag == 1){
  246. GPIO_ResetBits(powerGpioPin.gpioType, powerGpioPin.pinIndex);
  247. }
  248. else{
  249. GPIO_SetBits(powerGpioPin.gpioType, powerGpioPin.pinIndex);
  250. }
  251. }
  252. /// @brief 设置通道是否过FG
  253. /// @param channelId
  254. /// @param openFlag 0-不过FG,1-过FG
  255. void SetAnaChnlFG(u8 channelId, u8 openFlag)
  256. {
  257. GPIOPin switchGpioPin; //控制管脚
  258. switch(channelId){
  259. case CH1_DSA_CS:
  260. {
  261. switchGpioPin.gpioType = GPIOE;
  262. switchGpioPin.pinIndex = GPIO_Pin_1;
  263. break;
  264. }
  265. case CH2_DSA_CS:
  266. {
  267. switchGpioPin.gpioType = GPIOE;
  268. switchGpioPin.pinIndex = GPIO_Pin_0;
  269. break;
  270. }
  271. case CH3_DSA_CS:
  272. {
  273. switchGpioPin.gpioType = GPIOB;
  274. switchGpioPin.pinIndex = GPIO_Pin_9;
  275. break;
  276. }
  277. case CH4_DSA_CS:
  278. {
  279. switchGpioPin.gpioType = GPIOB;
  280. switchGpioPin.pinIndex = GPIO_Pin_8;
  281. break;
  282. }
  283. default:
  284. return;
  285. }
  286. if(openFlag == 1){
  287. GPIO_SetBits(switchGpioPin.gpioType, switchGpioPin.pinIndex);
  288. }
  289. else{
  290. GPIO_ResetBits(switchGpioPin.gpioType, switchGpioPin.pinIndex);
  291. }
  292. }
  293. void AnalogChannelSet(u8 *pData,u8 channelId, u8* pData595)
  294. {
  295. u8 fgFlag = pData[OFFSET_IN_DATA_FG_START];
  296. u8 gain1 = pData[OFFSET_IN_DATA_GAIN_START] ;
  297. u8 gain2 = pData[OFFSET_IN_DATA_GAIN_START + 1] ;
  298. u8 high_low = pData[OFFSET_IN_DATA_HIGH_LOW_START];
  299. u16 bias = pData[OFFSET_IN_DATA_BIAS_START] + (pData[OFFSET_IN_DATA_BIAS_START + 1]<<8); //hardware offset, software bias
  300. u16 move = pData[OFFSET_IN_DATA_MOVE_START] + (pData[OFFSET_IN_DATA_MOVE_START + 1]<<8); //hardware move, software offset
  301. u32 ConfigWord;
  302. u8 dac_index;
  303. //FG控制
  304. SetAnaChnlFG(channelId, fgFlag);
  305. //控制字
  306. struct ParasDAC paramsDAC;
  307. paramsDAC.high_low = high_low;
  308. paramsDAC.channelId = channelId;
  309. //bias
  310. paramsDAC.data = bias;
  311. paramsDAC.isBias = 1; //bias
  312. ConfigWord = GetDACConfigWord(paramsDAC,&dac_index);
  313. DAC_AD5675(ConfigWord,dac_index);
  314. //move
  315. paramsDAC.data = move;
  316. paramsDAC.isBias = 0; //move
  317. ConfigWord = GetDACConfigWord(paramsDAC,&dac_index);
  318. DAC_AD5675(ConfigWord,dac_index);
  319. //ref
  320. paramsDAC.data = 32000;
  321. paramsDAC.isBias = 2; //ref
  322. ConfigWord = GetDACConfigWord(paramsDAC,&dac_index);
  323. DAC_AD5675(ConfigWord,dac_index);
  324. //dsa1 -> gain1
  325. DSA_PE43711(LMH43711_ADDR_GAIN, gain1, channelId); //LMH6401_ADDR_GAIN
  326. /*dsa2 -> gain2 */
  327. //发送数据和时钟
  328. DSA2_PE43711(LMH43711_ADDR_GAIN, gain2, channelId);
  329. }
  330. void CMD0x22_Request_AnalogChannelSet_process(u8 *pData,u16 dataLen,u8 bIsContentBitInverted_Recv,u8 bIsContentBitInverted_SendBack)
  331. {
  332. if(IsChannelSetting!=0)
  333. {
  334. return;
  335. }
  336. IsChannelSetting = 1;
  337. #ifdef RUNNING_WHERE_AT_BOOT
  338. Command_SendbackErrorMessage(Error0x02_CannotRunAtBoot,1);
  339. #else
  340. memcpy(G_DebugData_AnalogChannel_LastRecvData,pData,dataLen);
  341. if(AnalogChannelSet_Check_Len(dataLen)==0)
  342. {
  343. IsChannelSetting=0;
  344. Command_SendbackErrorMessage(Error0x05_CMD_ParaLentghError,1);
  345. return;
  346. }
  347. //Calc
  348. u8 CRCStartIndex = dataLen - PACKAGE_CHANNELSET_FRAMEID_BYTES - PACKAGE_CHANNELSET_CHECK_AREA_BYTES;
  349. u8 SUMStartIndex = CRCStartIndex + PACKAGE_CHANNELSET_CRC32_BYTES;
  350. //u8 frameId[PACKAGE_CHANNELSET_FRAMEID_BYTES] ;
  351. u32 getCRC32 = pData[CRCStartIndex] + (pData[CRCStartIndex+1]<<8) + (pData[CRCStartIndex+2]<<16)+ (pData[CRCStartIndex+3]<<24);
  352. u16 getSUM16 = pData[SUMStartIndex] + (pData[SUMStartIndex+1]<<8) ;
  353. u32 calcCRC32 = Helper_CRC_CalcBlockCRC8(pData,CRCStartIndex);
  354. u16 calcSUM16 = Helper_Sum16(pData,CRCStartIndex);
  355. if(getCRC32!=calcCRC32 || getSUM16!=calcSUM16)
  356. {
  357. IsChannelSetting=0;
  358. Command_SendbackErrorMessage(Error0xFF_General,1);
  359. return;
  360. }
  361. //Calc End
  362. u8 gotChData = 0;
  363. //pData[0]:表示晶振开关;
  364. u8 isOpenCrystal = pData[0] & 0x01;
  365. //pData[1],bit0-bit3:表示通道读热码;
  366. u8 channelIds = pData[1] & 0x0f;
  367. AnalogChannel_SetAll4094(pData);
  368. for(int i=0; i<MAX_CHANNEL_NUM; i++)
  369. {
  370. u8 openFlag = (channelIds>>i) & 0x01;
  371. PowerAnaChnl(i + 1, openFlag);
  372. if(openFlag == 1)
  373. {
  374. AnalogChannelSet(pData + PACKAGE_CHANNELSET_INDEX_BYTES + gotChData * PACKAGE_CHANNELSET_DATA_BYTES,i+1, pData);
  375. gotChData++;
  376. }
  377. }
  378. if(isOpenCrystal == 0){
  379. //高阻信号
  380. GPIO_SetBits(GPIOD, GPIO_Pin_11);
  381. }
  382. else{
  383. //晶振信号
  384. GPIO_ResetBits(GPIOD, GPIO_Pin_11);
  385. }
  386. //Call back
  387. u8 dataBytes=PACKAGE_CHANNELSET_FRAMEID_BYTES;
  388. for(u8 i=0;i<PACKAGE_CHANNELSET_FRAMEID_BYTES;i++)
  389. {
  390. USART_WR_BUF[i] = pData[dataLen-PACKAGE_CHANNELSET_FRAMEID_BYTES+i];
  391. }
  392. USART6_Send(CMD0x22_Request_AnalogChannelSet,dataBytes,bIsContentBitInverted_SendBack);
  393. //end
  394. IsChannelSetting = 0;
  395. #endif
  396. }