fm175xx.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. /******************************************************************************/
  2. /** \file fm175xx.c
  3. **
  4. ** fm175xx driver API.
  5. ** @link Driver Group Some description @endlink
  6. **
  7. ** - 2020-07-29 1.0 Ronnie First version for Device Driver Library of
  8. ** Module.
  9. **
  10. ******************************************************************************/
  11. /*******************************************************************************
  12. * Include files
  13. ******************************************************************************/
  14. #include "fm175xx.h"
  15. #include "lpcd.h"
  16. #define TAG "fm175xx"
  17. /******************************************************************************
  18. * Local pre-processor symbols/macros ('#define')
  19. ******************************************************************************/
  20. #define MI_NOTAGERR 0xEE
  21. #define MAXRLEN 64 /* FIFO最大长度 */
  22. #define Anticollision 0x02
  23. /******************************************************************************
  24. * Global variable definitions (declared in header file with 'extern')
  25. ******************************************************************************/
  26. /******************************************************************************
  27. * Local type definitions ('typedef')
  28. ******************************************************************************/
  29. /******************************************************************************
  30. * Local function prototypes ('static')
  31. ******************************************************************************/
  32. /******************************************************************************
  33. * Local variable definitions ('static') *
  34. ******************************************************************************/
  35. /*****************************************************************************
  36. * Function implementation - global ('extern') and local ('static')
  37. ******************************************************************************/
  38. /*********************************************************************************************************
  39. ** Function name: Read_Reg
  40. ** Descriptions: 读取寄存器
  41. ** input parameters: reg_add:寄存器数值
  42. ** output parameters: N/A
  43. ** Returned value: 寄存器数值
  44. *********************************************************************************************************/
  45. uint8_t GetReg(uint8_t reg_add,uint8_t *regData)
  46. {
  47. *regData=ReadRawRC(reg_add);
  48. return *regData;
  49. }
  50. /*********************************************************************************************************
  51. ** Function name: Read_Reg
  52. ** Descriptions: 读取寄存器
  53. ** input parameters: reg_add:寄存器数值
  54. ** output parameters: N/A
  55. ** Returned value: 寄存器数值
  56. *********************************************************************************************************/
  57. uint8_t SetReg(uint8_t reg_add,uint8_t ucRegVal)
  58. {
  59. WriteRawRC(reg_add, ucRegVal);
  60. return 1;
  61. }
  62. /*********************************************************************************************************
  63. ** Function name: Read_Reg
  64. ** Descriptions: 读取寄存器数值
  65. ** input parameters: reg_add:寄存器地址
  66. ** output parameters: N/A
  67. ** Returned value: 寄存器数值
  68. *********************************************************************************************************/
  69. uint8_t Read_Reg(uint8_t reg_addr)
  70. {
  71. uint8_t reg_value = ReadRawRC(reg_addr);
  72. return reg_value;
  73. }
  74. /*********************************************************************************************************
  75. ** Function name: Read_Reg_All
  76. ** Descriptions: 读取全部寄存器
  77. ** input parameters: reg_value:寄存器数值
  78. ** output parameters: N/A
  79. ** Returned value: true:操作成功 ERROR:操作失败
  80. *********************************************************************************************************/
  81. bool Read_Reg_All(uint8_t *reg_value)
  82. {
  83. uint8_t i;
  84. for(i = 0; i < 64; i++)
  85. {
  86. *(reg_value + i) = ReadRawRC(i);
  87. }
  88. return true;
  89. }
  90. /*********************************************************************************************************
  91. ** Function name: Write_Reg
  92. ** Descriptions: 写寄存器操作
  93. ** input parameters: reg_addr:寄存器地址
  94. ** reg_value:寄存器数值
  95. ** output parameters: N/A
  96. ** Returned value: true:操作成功 ERROR:操作失败
  97. *********************************************************************************************************/
  98. bool Write_Reg(uint8_t reg_addr, uint8_t reg_value)
  99. {
  100. WriteRawRC(reg_addr, reg_value);
  101. return true;
  102. }
  103. /*********************************************************************************************************
  104. ** Function name: Read_FIFO
  105. ** Descriptions: 读出FIFO的数据
  106. ** input parameters: length:读取数据长度
  107. ** *fifo_data:数据存放指针
  108. ** output parameters: N/A
  109. ** Returned value: true:操作成功 ERROR:操作失败
  110. *********************************************************************************************************/
  111. void Read_FIFO(uint8_t length, uint8_t *fifo_data)
  112. {
  113. uint8_t i;
  114. if (length == 0)
  115. return;
  116. for (i = 0; i < length; i++) {
  117. *(fifo_data + i) = Read_Reg(FIFODataReg);
  118. }
  119. }
  120. /*********************************************************************************************************
  121. ** Function name: Write_FIFO
  122. ** Descriptions: 写入FIFO
  123. ** input parameters: length:读取数据长度
  124. ** *fifo_data:数据存放指针
  125. ** output parameters: N/A
  126. ** Returned value: true:操作成功 ERROR:操作失败
  127. *********************************************************************************************************/
  128. void Write_FIFO(uint8_t length, uint8_t *fifo_data)
  129. {
  130. uint8_t i;
  131. if(length == 0)
  132. return;
  133. for (i = 0; i < length; i++) {
  134. Write_Reg(FIFODataReg, *(fifo_data + i));
  135. }
  136. }
  137. /*********************************************************************************************************
  138. ** Function name: Clear_FIFO
  139. ** Descriptions: 清空FIFO
  140. ** input parameters:
  141. ** output parameters: N/A
  142. ** Returned value: true:操作成功 ERROR:操作失败
  143. *********************************************************************************************************/
  144. bool Clear_FIFO(void)
  145. {
  146. Set_BitMask(FIFOLevelReg, 0x80); /* 清除FIFO缓冲 */
  147. if ( Read_Reg(FIFOLevelReg) == 0 )
  148. return true;
  149. else
  150. return false;
  151. }
  152. /*********************************************************************************************************
  153. ** Function name: Set_BitMask
  154. ** Descriptions: 置位寄存器操作
  155. ** input parameters: reg_add,寄存器地址
  156. ** mask,寄存器写1位
  157. ** output parameters: N/A
  158. ** Returned value: true:操作成功 ERROR:操作失败
  159. *********************************************************************************************************/
  160. bool Set_BitMask(uint8_t reg_addr, uint8_t mask)
  161. {
  162. bool result;
  163. result = Write_Reg(reg_addr, Read_Reg(reg_addr) | mask); /* set bit mask */
  164. return result;
  165. }
  166. /*********************************************************************************************************
  167. ** Function name: Clear_BitMask
  168. ** Descriptions: 清除位寄存器操作
  169. ** input parameters: reg_add,寄存器地址
  170. ** mask,寄存器清除位
  171. ** output parameters: N/A
  172. ** Returned value: true:操作成功 ERROR:操作失败
  173. *********************************************************************************************************/
  174. bool Clear_BitMask(uint8_t reg_addr, uint8_t mask)
  175. {
  176. bool result;
  177. result = Write_Reg(reg_addr, Read_Reg(reg_addr) & ~mask); /* clear bit mask */
  178. return result;
  179. }
  180. /*********************************************************************************************************
  181. ** Function name: Read_Ext_Reg
  182. ** Descriptions: 读取扩展寄存器
  183. ** input parameters: reg_add,寄存器地址;
  184. ** output parameters: reg_value,寄存器数值
  185. ** Returned value: true:操作成功 ERROR:操作失败
  186. *********************************************************************************************************/
  187. uint8_t Read_Ext_Reg(uint8_t reg_add)
  188. {
  189. Write_Reg(JREG_EXT_REG_ENTRANCE, JBIT_EXT_REG_RD_ADDR + reg_add);
  190. return Read_Reg(JREG_EXT_REG_ENTRANCE);
  191. }
  192. /*********************************************************************************************************
  193. ** Function name: Write_Ext_Reg
  194. ** Descriptions: 写入扩展寄存器
  195. ** input parameters: reg_add,寄存器地址;
  196. ** reg_value,寄存器数值
  197. ** output parameters:
  198. ** Returned value: true:操作成功 ERROR:操作失败
  199. *********************************************************************************************************/
  200. bool Write_Ext_Reg(uint8_t reg_add, uint8_t reg_value)
  201. {
  202. Write_Reg(JREG_EXT_REG_ENTRANCE, JBIT_EXT_REG_WR_ADDR + reg_add);
  203. return Write_Reg(JREG_EXT_REG_ENTRANCE, JBIT_EXT_REG_WR_DATA + reg_value);
  204. }
  205. /*********************************************************************************************************
  206. ** Function name: ModifyReg_Ext
  207. ** Descriptions: 扩展寄存器位操作
  208. ** input parameters: reg_add,寄存器地址;
  209. ** reg_value,寄存器数值
  210. ** output parameters:
  211. ** Returned value: true:操作成功 ERROR:操作失败
  212. *********************************************************************************************************/
  213. bool ModifyReg_Ext(uint8_t ExtRegAddr, uint8_t mask, uint8_t set)
  214. {
  215. uint8_t regdata;
  216. regdata = Read_Ext_Reg(ExtRegAddr);
  217. if(set)
  218. {
  219. regdata |= mask;
  220. }
  221. else{
  222. regdata &= ~(mask);
  223. }
  224. return Write_Ext_Reg(ExtRegAddr, regdata);
  225. }
  226. /*********************************************************************************************************
  227. ** Function name: Get_FIFODataLenth
  228. ** Descriptions: 读取FIFO接收数据长度信息
  229. ** input parameters: FIFOLen: FIFO有效字节长度
  230. ** LastBitsLen: 最后字节的有效位长度
  231. ** pRecBitsLen: 所有数据的位长度
  232. ** output parameters: N/A
  233. ** Returned value: true:操作成功 false:操作失败
  234. *********************************************************************************************************/
  235. bool Get_FIFODataLenth(uint8_t *FIFOLen,uint8_t *LastBitsLen,uint32_t *pRecBitsLen)
  236. {
  237. *FIFOLen = Read_Reg(FIFOLevelReg); /* 读取FIFO有效字节长度 */
  238. *LastBitsLen = Read_Reg(ControlReg) & 0x07; /* 读取FIFO最后字节的有效位长度 */
  239. if(*LastBitsLen) { /* 计算所有字节的的有效位长度和 */
  240. *pRecBitsLen = *LastBitsLen;
  241. if(*FIFOLen > 1){
  242. *pRecBitsLen += (*FIFOLen-1)*8;
  243. }
  244. if(*FIFOLen == 0) {
  245. *FIFOLen = 1;
  246. }
  247. }
  248. else {
  249. *pRecBitsLen = (*FIFOLen) * 8;
  250. }
  251. return true;
  252. }
  253. /*********************************************************************************************************
  254. ** Function name: Set_RF
  255. ** Descriptions: 设置射频输出
  256. ** input parameters: mode,射频输出模式
  257. ** 0,关闭输出
  258. ** 1,仅打开TX1输出
  259. ** 2,仅打开TX2输出
  260. ** 3,TX1,TX2打开输出,TX2为反向输出
  261. ** output parameters: N/A
  262. ** Returned value: true:操作成功 ERROR:操作失败
  263. *********************************************************************************************************/
  264. bool Set_Rf(uint8_t mode)
  265. {
  266. uint8_t regVal;
  267. bool result = false;
  268. if( (Read_Reg(TxControlReg) & 0x03) == mode )
  269. return true;
  270. if( mode == 0 )
  271. result = Clear_BitMask(TxControlReg, 0x03); /* 关闭TX1,TX2输出 */
  272. if( mode== 1 ) {
  273. regVal = Read_Reg(TxControlReg);
  274. regVal = regVal & 0xFC;
  275. result = Write_Reg(TxControlReg, regVal | 0x01); /* 仅打开TX1输出 */
  276. }
  277. if( mode == 2) {
  278. regVal = Read_Reg(TxControlReg);
  279. regVal = regVal & 0xFC;
  280. result = Write_Reg(TxControlReg, regVal |0x02); /* 仅打开TX2输出 */
  281. }
  282. if (mode == 3)
  283. {
  284. result = Set_BitMask(TxControlReg,0x03); /* 打开TX1,TX2输出 */
  285. }
  286. Delay_Ms(10);
  287. return result;
  288. }
  289. /*********************************************************************************************************
  290. ** Function name: Pcd_Comm
  291. ** Descriptions: 读卡器通信 不利用IRQ管脚的情况
  292. ** input parameters: Command:通信操作命令
  293. ** pInData:发送数据数组
  294. ** InLenByte:发送数据数组字节长度
  295. ** pOutData:接收数据数组
  296. ** pOutLenBit:接收数据的位长度
  297. ** output parameters: N/A
  298. ** Returned value: true:操作成功 ERROR:操作失败
  299. *********************************************************************************************************/
  300. bool Pcd_Comm(uint8_t Command,
  301. uint8_t *pInData,
  302. uint8_t InLenByte,
  303. uint8_t *pOutData,
  304. uint32_t *pOutLenBit)
  305. {
  306. uint8_t status = false;
  307. uint8_t irqEn = 0x00; /* 使能的中断 */
  308. uint8_t waitFor = 0x00; /* 等待的中断 */
  309. uint8_t lastBits = 0x00;
  310. uint8_t n; /* 获取中断请求寄存器 */
  311. uint8_t sendLen = 0x00; /* 发送数据长度 */
  312. uint8_t sendPi = 0x00;
  313. uint8_t revLen = 0x00; /* 接收数据长度 */
  314. uint8_t fifoLen = 0x00;
  315. uint8_t errorReg = 0x00; /* 错误标志位 */
  316. uint8_t collPos = 0x00; /* 冲突位 */
  317. uint32_t i;
  318. Write_Reg(ComIrqReg, 0x7F); /* 清楚IRQ标记 */
  319. Write_Reg(TModeReg, 0x80); /* 设置TIMER自动启动 */
  320. switch (Command) {
  321. case MFAuthent: /* Mifare认证 */
  322. irqEn = 0x12;
  323. waitFor = 0x10;
  324. break;
  325. case Transceive: /* 发送FIFO中的数据到天线,传输后激活接收电路*/
  326. irqEn = 0x77;
  327. waitFor = 0x30;
  328. break;
  329. default:
  330. break;
  331. }
  332. Write_Reg(ComIEnReg, irqEn | 0x80);
  333. Write_Reg(CommandReg, Idle);
  334. Set_BitMask(FIFOLevelReg, 0x80); /* 最高位置1,立刻清除FIFO的读写指针和寄存器ErrReg里的BufferOvfl位 */
  335. Clear_FIFO(); /* 清空FIFO数据 */
  336. sendLen = InLenByte > MAXRLEN ? MAXRLEN:InLenByte; /* 限制发送数据长度,最大长度为FIFO长度64字节 */
  337. sendPi += sendLen;
  338. InLenByte -= sendLen;
  339. Write_FIFO(sendLen, pInData); /* 数据写入FIFO */
  340. Write_Reg(CommandReg, Command); /* 设置数据发送命令 */
  341. if (Command == Transceive) {
  342. Set_BitMask(BitFramingReg, 0x80); /* 开启数据发送 */
  343. }
  344. i = 30000; /* 根据时钟频率调整,操作M1卡最大等待时间25ms*/
  345. do {
  346. n = Read_Reg(ComIrqReg); /* 读取控制中断请求寄存器 */
  347. i--;
  348. }
  349. // while ((i != 0) && !(n & 0x03) && !(n & waitFor)); delay_ms(2); /* n&0x01=0x00表示PCDsettimer时间未到未超时(如果换成(n&0x03)则需要加一定延时Mifare卡才能写成功)*/
  350. while ((i != 0) && !(n & 0x01) && !(n & waitFor)); /* n&waitFor!=0x00表示接收到一串有效数据流 */
  351. // ESP_LOGI(TAG, "ComIrqReg=0x%x\r\n", n);
  352. Clear_BitMask(BitFramingReg, 0x80); /* 关闭发送 */
  353. if (i != 0) {
  354. errorReg = Read_Reg(ErrorReg);
  355. if(!(errorReg & 0x1B)) { /* 无错误 */
  356. status = true;
  357. if (n & irqEn & 0x01) { /* 等待超时 */
  358. status = MI_NOTAGERR;
  359. }
  360. if (Command == Transceive) {
  361. fifoLen = Read_Reg(FIFOLevelReg); /* 读取接收数据字节数 */
  362. lastBits = Read_Reg(ControlReg) & 0x07; /* 读取该接收最后一字节的有效位 */
  363. if (lastBits) {
  364. *pOutLenBit = lastBits;
  365. if(fifoLen > 1)
  366. *pOutLenBit += (fifoLen-1) * 8;
  367. if (fifoLen == 0)
  368. fifoLen = 1;
  369. } else {
  370. *pOutLenBit = fifoLen * 8;
  371. }
  372. Read_FIFO(fifoLen, &pOutData[revLen]); /* 读取FIFO数据 */
  373. }
  374. }
  375. else if(errorReg & 0x08) { /* 有冲突 */
  376. // ESP_LOGI(TAG, "冲突\r\n");
  377. Write_Reg(ErrorReg, ~(0x08)); /* 清除接收中断 */
  378. collPos = Read_Reg(CollReg); /* 获取冲突位置 冲突在第几位(1-32)*/
  379. collPos &= 0x1f;
  380. *pOutLenBit = (collPos == 0 )?32:collPos;
  381. fifoLen =*pOutLenBit/8 +(*pOutLenBit%8?1:0); /* 字节长度 */
  382. Read_FIFO(fifoLen, &pOutData[revLen]);
  383. status = Anticollision;
  384. }
  385. else {
  386. status = false;
  387. }
  388. }
  389. Clear_BitMask(BitFramingReg, 0x80);//关闭发送
  390. return status;
  391. }
  392. /*********************************************************************************************************
  393. ** Function name: Pcd_SetTimer
  394. ** Descriptions: 设置接收延时
  395. ** input parameters: delaytime,延时时间(单位为毫秒) 最大不能超过5000ms
  396. ** output parameters: N/A
  397. ** Returned value: true:操作成功 ERROR:操作失败
  398. *********************************************************************************************************/
  399. bool Pcd_SetTimer(uint32_t delaytime)
  400. {
  401. uint32_t TimeReload;
  402. uint32_t Prescaler;
  403. Prescaler = 0;
  404. TimeReload = 0;
  405. while(Prescaler < 0xfff) {
  406. TimeReload = ((delaytime * (long)13560) - 1) / (Prescaler * 2 + 1);
  407. if (TimeReload < 0xffff)
  408. break;
  409. Prescaler++;
  410. }
  411. TimeReload = TimeReload & 0xFFFF;
  412. Set_BitMask(TModeReg, Prescaler >> 8); /* 先写高字节 */
  413. Write_Reg(TPrescalerReg, Prescaler & 0xFF); /* 再低字节 高低字节在两个不同寄存器 */
  414. Write_Reg(TReloadMSBReg, TimeReload >> 8); /* 先高字节 */
  415. Write_Reg(TReloadLSBReg, TimeReload & 0xFF); /* 低字节 */
  416. return true;
  417. }
  418. /*********************************************************************************************************
  419. ** Function name: Pcd_ConfigISOType
  420. ** Descriptions: 配置ISO14443A/B协议
  421. ** input parameters: type = 0:ISO14443A协议;
  422. ** type = 1,ISO14443B协议;
  423. ** output parameters: N/A
  424. ** Returned value: true:操作成功 ERROR:操作失败
  425. *********************************************************************************************************/
  426. bool Pcd_ConfigISOType(uint8_t type)
  427. {
  428. if(type == 0){ /* 配置为ISO14443_A */
  429. Set_BitMask(ControlReg, 0x10); /* ControlReg 0x0C 设置reader模式 */
  430. Set_BitMask(TxAutoReg, 0x40); /* TxASKReg 0x15 设置100%ASK有效 */
  431. Write_Reg(TxModeReg, 0x00); /* TxModeReg 0x12 设置TX CRC无效,TX FRAMING =TYPE A */
  432. Write_Reg(RxModeReg, 0x00); /* RxModeReg 0x13 设置RX CRC无效,RX FRAMING =TYPE A */
  433. Write_Reg(RxThresholdReg, 0x55); /* 接收译码器阈值 */
  434. Write_Reg(RFCfgReg, 0x48); /* 接收增益 默认值 */
  435. /* 发射功率 */
  436. Write_Reg(GsNOnReg, 0xf8); /* 天线开启时N驱动电导 */
  437. Write_Reg(CWGsPReg, 0x3f); /* 无调制时P驱动的电导 */
  438. /* A卡使用米勒编码100%调制,调制深度不随天线设计变化,所以不需要调整调制深度寄存器 */
  439. }
  440. if(type == 1){ /* 配置为ISO14443_B */
  441. Write_Reg(ControlReg, 0x10);
  442. Write_Reg(TxAutoReg, 0x00);
  443. Write_Reg(TxModeReg, 0x83); /* BIT1~0 = 2'b11:ISO/IEC 14443B */
  444. Write_Reg(RxModeReg, 0x83); /* BIT1~0 = 2'b11:ISO/IEC 14443B */
  445. Write_Reg(RxThresholdReg, 0x55); /* 接收译码器阈值 */
  446. Write_Reg(RFCfgReg, 0x48); /* 接收增益 默认值 */
  447. Write_Reg(TxBitPhaseReg, 0x87); /* 默认值 */
  448. /* B卡使用不归零编码10%调制,调制深度随天线设计变化,所以需要调整调制深度寄存器 */
  449. /* GsNOnReg高位4位和低4位相差越大,调制深度越大(粗调)*/
  450. /* CWGsPReg和ModGsPReg相差越大(主要是ModGsPReg的值越小),调制深度越大(细调) */
  451. Write_Reg(GsNOnReg, 0x83); /* 天线开启时N驱动电导 */
  452. Write_Reg(GsNOffReg, 0x38); /* 天线关闭时N驱动电导 */
  453. Write_Reg(CWGsPReg, 0x30); /* 无调制时P驱动的电导 */
  454. Write_Reg(ModGsPReg, 0x20); /* 调制时P驱动的电导 */
  455. }
  456. return true;
  457. }
  458. /*********************************************************************************************************
  459. ** Function name: FM175X_SoftReset
  460. ** Descriptions: FM175xx软件复位
  461. ** input parameters: N/A
  462. ** output parameters: N/A
  463. ** Returned value: true:操作成功 ERROR:操作失败
  464. *********************************************************************************************************/
  465. void FM175X_SoftReset(void)
  466. {
  467. Write_Reg(CommandReg, SoftReset);
  468. Delay_Ms(1); /* FM175XX芯片复位需要1ms */
  469. Set_BitMask(ControlReg, 0x10); /* FM175xx作为NFC通讯协议的发起端 */
  470. }
  471. /*********************************************
  472. 函数名: FM175X_SoftPowerdown
  473. 功能: 软件低功耗操作
  474. 输入参数:
  475. 返回值: true,进入低功耗模式;
  476. false,退出低功耗模式;
  477. ********************************************/
  478. bool FM175X_SoftPowerdown(void)
  479. {
  480. if(Read_Reg(CommandReg) & 0x10)
  481. {
  482. Clear_BitMask(CommandReg,0x10);//退出低功耗模式
  483. return false;
  484. }
  485. else{
  486. Set_BitMask(CommandReg,0x10);//进入低功耗模式
  487. return true;
  488. }
  489. }
  490. /*********************************************************************************************************
  491. ** Function name: FM175XX_Initial
  492. ** Descriptions: FM175XX 初始化
  493. ** input parameters: N/A
  494. ** output parameters: N/A
  495. ** Returned value: NONE
  496. *********************************************************************************************************/
  497. void FM175XX_Initial(void)
  498. {
  499. uint8_t regdata,res;
  500. regdata = 0x20; //WaterLevel,收到一半数据时候,起中断
  501. SetReg(WaterLevelReg, regdata);
  502. }
  503. /******************************************************************************
  504. * EOF (not truncated)
  505. ******************************************************************************/