CH395CMD.C 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : CH395CMD.C
  3. * Author : WCH
  4. * Version : V1.1
  5. * Date : 2014/8/1
  6. * Description : CH395芯片命令接口文件
  7. *
  8. *******************************************************************************/
  9. /* 头文件包含*/
  10. #include "CH395INC.H"
  11. #include "CH395CMD.H"
  12. #include "ch395_adapter.h"
  13. /********************************************************************************
  14. * Function Name : CH395CMDReset
  15. * Description : 复位CH395芯片
  16. * Input : None
  17. * Output : None
  18. * Return : None
  19. *******************************************************************************/
  20. void CH395CMDReset(void)
  21. {
  22. xWriteCH395Cmd(CMD00_RESET_ALL);
  23. xEndCH395Cmd();
  24. }
  25. /*******************************************************************************
  26. * Function Name : CH395CMDSleep
  27. * Description : 使CH395进入睡眠状态
  28. * Input : None
  29. * Output : None
  30. * Return : None
  31. *******************************************************************************/
  32. void CH395CMDSleep(void)
  33. {
  34. xWriteCH395Cmd(CMD00_ENTER_SLEEP);
  35. xEndCH395Cmd();
  36. }
  37. /********************************************************************************
  38. * Function Name : CH395CMDSleep
  39. * Description : 获取芯片以及固件版本号,1字节,高四位表示芯片版本,
  40. 低四位表示固件版本
  41. * Input : None
  42. * Output : None
  43. * Return : 1字节芯片及固件版本号
  44. *******************************************************************************/
  45. UINT8 CH395CMDGetVer(void)
  46. {
  47. UINT8 i;
  48. xWriteCH395Cmd(CMD01_GET_IC_VER);
  49. i = xReadCH395Data();
  50. xEndCH395Cmd();
  51. return i;
  52. }
  53. /********************************************************************************
  54. * Function Name : CH395CMDCheckExist
  55. * Description : 测试命令,用于测试硬件以及接口通讯
  56. * Input : testdata 1字节测试数据
  57. * Output : None
  58. * Return : 硬件OK,返回 testdata按位取反
  59. *******************************************************************************/
  60. UINT8 CH395CMDCheckExist(UINT8 testdata)
  61. {
  62. UINT8 i;
  63. xWriteCH395Cmd(CMD11_CHECK_EXIST);
  64. xWriteCH395Data(testdata);
  65. i = xReadCH395Data();
  66. xEndCH395Cmd();
  67. return i;
  68. }
  69. /********************************************************************************
  70. * Function Name : CH395CMDSetPHY
  71. * Description : 设置PHY,主要设置CH395 PHY为100/10M 或者全双工半双工,CH395默
  72. 为自动协商。
  73. * Input : phystat 参考PHY 命令参数/状态
  74. * Output : None
  75. * Return : None
  76. *******************************************************************************/
  77. void CH395CMDSetPHY(UINT8 phystat)
  78. {
  79. xWriteCH395Cmd(CMD10_SET_PHY);
  80. xWriteCH395Data(phystat);
  81. xEndCH395Cmd();
  82. }
  83. /*******************************************************************************
  84. * Function Name : CH395CMDGetPHYStatus
  85. * Description : 获取PHY的状态
  86. * Input : None
  87. * Output : None
  88. * Return : 当前CH395PHY状态,参考PHY参数/状态定义
  89. *******************************************************************************/
  90. UINT8 CH395CMDGetPHYStatus(void)
  91. {
  92. UINT8 i;
  93. xWriteCH395Cmd(CMD01_GET_PHY_STATUS);
  94. i = xReadCH395Data();
  95. xEndCH395Cmd();
  96. return i;
  97. }
  98. /*******************************************************************************
  99. * Function Name : CH395CMDGetGlobIntStatus
  100. * Description : 获取全局中断状态,收到此命令CH395自动取消中断,0x43及以下版本使用
  101. * Input : None
  102. * Output : None
  103. * Return : 返回当前的全局中断状态
  104. *******************************************************************************/
  105. UINT8 CH395CMDGetGlobIntStatus(void)
  106. {
  107. UINT8 init_status;
  108. xWriteCH395Cmd(CMD01_GET_GLOB_INT_STATUS);
  109. init_status = xReadCH395Data();
  110. xEndCH395Cmd();
  111. return init_status;
  112. }
  113. /********************************************************************************
  114. * Function Name : CH395CMDInitCH395
  115. * Description : 初始化CH395芯片。
  116. * Input : None
  117. * Output : None
  118. * Return : 返回执行结果
  119. *******************************************************************************/
  120. UINT8 CH395CMDInitCH395(void)
  121. {
  122. UINT8 i = 0;
  123. UINT8 s = 0;
  124. xWriteCH395Cmd(CMD0W_INIT_CH395);
  125. xEndCH395Cmd();
  126. while(1)
  127. {
  128. mDelaymS(10); /* 延时查询,建议2MS以上*/
  129. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  130. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  131. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出,本函数需要500MS以上执行完毕 */
  132. }
  133. return s;
  134. }
  135. /********************************************************************************
  136. * Function Name : CH395CMDSetUartBaudRate
  137. * Description : 设置CH395串口波特率,仅在串口模式下有效
  138. * Input : baudrate 串口波特率
  139. * Output : None
  140. * Return : None
  141. *******************************************************************************/
  142. void CH395CMDSetUartBaudRate(UINT32 baudrate)
  143. {
  144. //UINT8 i;
  145. xWriteCH395Cmd(CMD31_SET_BAUDRATE);
  146. xWriteCH395Data((UINT8)baudrate);
  147. xWriteCH395Data((UINT8)((UINT16)baudrate >> 8));
  148. xWriteCH395Data((UINT8)(baudrate >> 16));
  149. //i = xReadCH395Data();
  150. xReadCH395Data();
  151. xEndCH395Cmd();
  152. }
  153. /*******************************************************************************
  154. * Function Name : CH395GetCmdStatus
  155. * Description : 获取命令执行状态,某些命令需要等待命令执行结果
  156. * Input : None
  157. * Output : None
  158. * Return : 返回上一条命令执行状态
  159. *******************************************************************************/
  160. UINT8 CH395GetCmdStatus(void)
  161. {
  162. UINT8 i;
  163. xWriteCH395Cmd(CMD01_GET_CMD_STATUS);
  164. i = xReadCH395Data();
  165. xEndCH395Cmd();
  166. return i;
  167. }
  168. /********************************************************************************
  169. * Function Name : CH395CMDSetIPAddr
  170. * Description : 设置CH395的IP地址
  171. * Input : ipaddr 指IP地址
  172. * Output : None
  173. * Return : None
  174. *******************************************************************************/
  175. void CH395CMDSetIPAddr(UINT8 *ipaddr)
  176. {
  177. UINT8 i;
  178. xWriteCH395Cmd(CMD40_SET_IP_ADDR);
  179. for(i = 0; i < 4;i++)xWriteCH395Data(*ipaddr++);
  180. xEndCH395Cmd();
  181. }
  182. /********************************************************************************
  183. * Function Name : CH395CMDSetGWIPAddr
  184. * Description : 设置CH395的网关IP地址
  185. * Input : ipaddr 指向网关IP地址
  186. * Output : None
  187. * Return : None
  188. *******************************************************************************/
  189. void CH395CMDSetGWIPAddr(UINT8 *gwipaddr)
  190. {
  191. UINT8 i;
  192. xWriteCH395Cmd(CMD40_SET_GWIP_ADDR);
  193. for(i = 0; i < 4;i++)xWriteCH395Data(*gwipaddr++);
  194. xEndCH395Cmd();
  195. }
  196. /********************************************************************************
  197. * Function Name : CH395CMDSetMASKAddr
  198. * Description : 设置CH395的子网掩码,默认为255.255.255.0
  199. * Input : maskaddr 指子网掩码地址
  200. * Output : None
  201. * Return : None
  202. *******************************************************************************/
  203. void CH395CMDSetMASKAddr(UINT8 *maskaddr)
  204. {
  205. UINT8 i;
  206. xWriteCH395Cmd(CMD40_SET_MASK_ADDR);
  207. for(i = 0; i < 4;i++)xWriteCH395Data(*maskaddr++);
  208. xEndCH395Cmd();
  209. }
  210. /********************************************************************************
  211. * Function Name : CH395CMDSetMACAddr
  212. * Description : 设置CH395的MAC地址。
  213. * Input : amcaddr MAC地址指针
  214. * Output : None
  215. * Return : None
  216. *******************************************************************************/
  217. void CH395CMDSetMACAddr(UINT8 *amcaddr)
  218. {
  219. UINT8 i;
  220. xWriteCH395Cmd(CMD60_SET_MAC_ADDR);
  221. for(i = 0; i < 6;i++)xWriteCH395Data(*amcaddr++);
  222. xEndCH395Cmd();
  223. mDelaymS(100);
  224. }
  225. /********************************************************************************
  226. * Function Name : CH395CMDGetMACAddr
  227. * Description : 获取CH395的MAC地址。
  228. * Input : amcaddr MAC地址指针
  229. * Output : None
  230. * Return : None
  231. *******************************************************************************/
  232. void CH395CMDGetMACAddr(UINT8 *amcaddr)
  233. {
  234. UINT8 i;
  235. xWriteCH395Cmd(CMD06_GET_MAC_ADDR);
  236. for(i = 0; i < 6;i++)*amcaddr++ = xReadCH395Data();
  237. xEndCH395Cmd();
  238. }
  239. /*******************************************************************************
  240. * Function Name : CH395CMDSetMACFilt
  241. * Description : 设置MAC过滤。
  242. * Input : filtype 参考 MAC过滤
  243. table0 Hash0
  244. table1 Hash1
  245. * Output : None
  246. * Return : None
  247. *******************************************************************************/
  248. void CH395CMDSetMACFilt(UINT8 filtype,UINT32 table0,UINT32 table1)
  249. {
  250. xWriteCH395Cmd(CMD90_SET_MAC_FILT);
  251. xWriteCH395Data(filtype);
  252. xWriteCH395Data((UINT8)table0);
  253. xWriteCH395Data((UINT8)((UINT16)table0 >> 8));
  254. xWriteCH395Data((UINT8)(table0 >> 16));
  255. xWriteCH395Data((UINT8)(table0 >> 24));
  256. xWriteCH395Data((UINT8)table1);
  257. xWriteCH395Data((UINT8)((UINT16)table1 >> 8));
  258. xWriteCH395Data((UINT8)(table1 >> 16));
  259. xWriteCH395Data((UINT8)(table1 >> 24));
  260. xEndCH395Cmd();
  261. }
  262. /********************************************************************************
  263. * Function Name : CH395CMDGetUnreachIPPT
  264. * Description : 获取不可达信息 (IP,Port,Protocol Type)
  265. * Input : list 保存获取到的不可达
  266. 第1个字节为不可达代码,请参考 不可达代码(CH395INC.H)
  267. 第2个字节为IP包协议类型
  268. 第3-4字节为端口号
  269. 第4-8字节为IP地址
  270. * Output : None
  271. * Return : None
  272. *******************************************************************************/
  273. void CH395CMDGetUnreachIPPT(UINT8 *list)
  274. {
  275. UINT8 i;
  276. xWriteCH395Cmd(CMD08_GET_UNREACH_IPPORT);
  277. for(i = 0; i < 8; i++)
  278. {
  279. *list++ = xReadCH395Data();
  280. }
  281. xEndCH395Cmd();
  282. }
  283. /********************************************************************************
  284. * Function Name : CH395CMDGetRemoteIPP
  285. * Description : 获取远端的IP和端口地址,一般在TCP Server模式下使用
  286. * Input : sockindex Socket索引
  287. list 保存IP和端口
  288. * Output : None
  289. * Return : None
  290. *******************************************************************************/
  291. void CH395CMDGetRemoteIPP(UINT8 sockindex,UINT8 *list)
  292. {
  293. UINT8 i;
  294. xWriteCH395Cmd(CMD06_GET_REMOT_IPP_SN);
  295. xWriteCH395Data(sockindex);
  296. for(i = 0; i < 6; i++)
  297. {
  298. *list++ = xReadCH395Data();
  299. }
  300. xEndCH395Cmd();
  301. }
  302. /*******************************************************************************
  303. * Function Name : CH395SetSocketDesIP
  304. * Description : 设置socket n的目的IP地址
  305. * Input : sockindex Socket索引
  306. ipaddr 指向IP地址
  307. * Output : None
  308. * Return : None
  309. *******************************************************************************/
  310. void CH395SetSocketDesIP(UINT8 sockindex,UINT8 *ipaddr)
  311. {
  312. xWriteCH395Cmd(CMD50_SET_IP_ADDR_SN);
  313. xWriteCH395Data(sockindex);
  314. xWriteCH395Data(*ipaddr++);
  315. xWriteCH395Data(*ipaddr++);
  316. xWriteCH395Data(*ipaddr++);
  317. xWriteCH395Data(*ipaddr++);
  318. xEndCH395Cmd();
  319. }
  320. /*******************************************************************************
  321. * Function Name : CH395SetSocketProtType
  322. * Description : 设置socket 的协议类型
  323. * Input : sockindex Socket索引
  324. prottype 协议类型,请参考 socket协议类型定义(CH395INC.H)
  325. * Output : None
  326. * Return : None
  327. *******************************************************************************/
  328. void CH395SetSocketProtType(UINT8 sockindex,UINT8 prottype)
  329. {
  330. xWriteCH395Cmd(CMD20_SET_PROTO_TYPE_SN);
  331. xWriteCH395Data(sockindex);
  332. xWriteCH395Data(prottype);
  333. xEndCH395Cmd();
  334. }
  335. /*******************************************************************************
  336. * Function Name : CH395SetSocketDesPort
  337. * Description : 设置socket n的协议类型
  338. * Input : sockindex Socket索引
  339. desprot 2字节目的端口
  340. * Output : None
  341. * Return : None
  342. *******************************************************************************/
  343. void CH395SetSocketDesPort(UINT8 sockindex,UINT16 desprot)
  344. {
  345. xWriteCH395Cmd(CMD30_SET_DES_PORT_SN);
  346. xWriteCH395Data(sockindex);
  347. xWriteCH395Data((UINT8)desprot);
  348. xWriteCH395Data((UINT8)(desprot >> 8));
  349. xEndCH395Cmd();
  350. }
  351. /*******************************************************************************
  352. * Function Name : CH395SetSocketSourPort
  353. * Description : 设置socket n的协议类型
  354. * Input : sockindex Socket索引
  355. desprot 2字节源端口
  356. * Output : None
  357. * Return : None
  358. *******************************************************************************/
  359. void CH395SetSocketSourPort(UINT8 sockindex,UINT16 surprot)
  360. {
  361. xWriteCH395Cmd(CMD30_SET_SOUR_PORT_SN);
  362. xWriteCH395Data(sockindex);
  363. xWriteCH395Data((UINT8)surprot);
  364. xWriteCH395Data((UINT8)(surprot>>8));
  365. xEndCH395Cmd();
  366. }
  367. /******************************************************************************
  368. * Function Name : CH395SetSocketIPRAWProto
  369. * Description : IP模式下,socket IP包协议字段
  370. * Input : sockindex Socket索引
  371. prototype IPRAW模式1字节协议字段
  372. * Output : None
  373. * Return : None
  374. *******************************************************************************/
  375. void CH395SetSocketIPRAWProto(UINT8 sockindex,UINT8 prototype)
  376. {
  377. xWriteCH395Cmd(CMD20_SET_IPRAW_PRO_SN);
  378. xWriteCH395Data(sockindex);
  379. xWriteCH395Data(prototype);
  380. xEndCH395Cmd();
  381. }
  382. /********************************************************************************
  383. * Function Name : CH395EnablePing
  384. * Description : 开启/关闭 PING
  385. * Input : enable : 1 开启PING
  386. :0 关闭PING
  387. * Output : None
  388. * Return : None
  389. *******************************************************************************/
  390. void CH395EnablePing(UINT8 enable)
  391. {
  392. xWriteCH395Cmd(CMD01_PING_ENABLE);
  393. xWriteCH395Data(enable);
  394. xEndCH395Cmd();
  395. }
  396. /********************************************************************************
  397. * Function Name : CH395SendData
  398. * Description : 向发送缓冲区写数据
  399. * Input : sockindex Socket索引
  400. databuf 数据缓冲区
  401. len 长度
  402. * Output : None
  403. * Return : None
  404. *******************************************************************************/
  405. void CH395SendData(UINT8 sockindex,UINT8 *databuf,UINT16 len)
  406. {
  407. //UINT16 i;
  408. xWriteCH395Cmd(CMD30_WRITE_SEND_BUF_SN);
  409. xWriteCH395Data((UINT8)sockindex);
  410. xWriteCH395Data((UINT8)len);
  411. xWriteCH395Data((UINT8)(len>>8));
  412. mDelayuS(1);
  413. /*
  414. for(i = 0; i < len; i++)
  415. {
  416. xWriteCH395Data(*databuf++);
  417. }
  418. */
  419. xWriteCH395DataBlock(databuf,len);
  420. xEndCH395Cmd();
  421. }
  422. /*******************************************************************************
  423. * Function Name : CH395GetRecvLength
  424. * Description : 获取接收缓冲区长度
  425. * Input : sockindex Socket索引
  426. * Output : None
  427. * Return : 返回接收缓冲区有效长度
  428. *******************************************************************************/
  429. UINT16 CH395GetRecvLength(UINT8 sockindex)
  430. {
  431. UINT16 i;
  432. xWriteCH395Cmd(CMD12_GET_RECV_LEN_SN);
  433. xWriteCH395Data((UINT8)sockindex);
  434. i = xReadCH395Data();
  435. i = (UINT16)(xReadCH395Data()<<8) + i;
  436. xEndCH395Cmd();
  437. return i;
  438. }
  439. /*******************************************************************************
  440. * Function Name : CH395ClearRecvBuf
  441. * Description : 清除接收缓冲区
  442. * Input : sockindex Socket索引
  443. * Output : None
  444. * Return : None
  445. *******************************************************************************/
  446. void CH395ClearRecvBuf(UINT8 sockindex)
  447. {
  448. xWriteCH395Cmd(CMD10_CLEAR_RECV_BUF_SN);
  449. xWriteCH395Data((UINT8)sockindex);
  450. xEndCH395Cmd();
  451. }
  452. /********************************************************************************
  453. * Function Name : CH395GetRecvLength
  454. * Description : 读取接收缓冲区数据
  455. * Input : sockindex Socket索引
  456. len 长度
  457. pbuf 缓冲区
  458. * Output : None
  459. * Return : None
  460. *******************************************************************************/
  461. void CH395GetRecvData(UINT8 sockindex,UINT16 len,UINT8 *pbuf)
  462. {
  463. //UINT16 i;
  464. if(!len)return;
  465. xWriteCH395Cmd(CMD30_READ_RECV_BUF_SN);
  466. xWriteCH395Data(sockindex);
  467. xWriteCH395Data((UINT8)len);
  468. xWriteCH395Data((UINT8)(len>>8));
  469. mDelayuS(1);
  470. /*
  471. for(i = 0; i < len; i++)
  472. {
  473. *pbuf = xReadCH395Data();
  474. pbuf++;
  475. }
  476. */
  477. xReadCH395DataBlock(pbuf,len);
  478. xEndCH395Cmd();
  479. }
  480. /********************************************************************************
  481. * Function Name : CH395CMDSetRetryCount
  482. * Description : 设置重试次数
  483. * Input : count 重试值,最大为20次
  484. * Output : None
  485. * Return : None
  486. ********************************************************************************/
  487. void CH395CMDSetRetryCount(UINT8 count)
  488. {
  489. xWriteCH395Cmd(CMD10_SET_RETRAN_COUNT);
  490. xWriteCH395Data(count);
  491. xEndCH395Cmd();
  492. }
  493. /********************************************************************************
  494. * Function Name : CH395CMDSetRetryPeriod
  495. * Description : 设置重试周期
  496. * Input : period 重试周期单位为毫秒,最大1000ms
  497. * Output : None
  498. * Return : None
  499. *******************************************************************************/
  500. void CH395CMDSetRetryPeriod(UINT16 period)
  501. {
  502. xWriteCH395Cmd(CMD10_SET_RETRAN_COUNT);
  503. xWriteCH395Data((UINT8)period);
  504. xWriteCH395Data((UINT8)(period>>8));
  505. xEndCH395Cmd();
  506. }
  507. /********************************************************************************
  508. * Function Name : CH395CMDGetSocketStatus
  509. * Description : 获取socket
  510. * Input : None
  511. * Output : socket n的状态信息,第1字节为socket 打开或者关闭
  512. 第2字节为TCP状态
  513. * Return : None
  514. *******************************************************************************/
  515. void CH395CMDGetSocketStatus(UINT8 sockindex,UINT8 *status)
  516. {
  517. xWriteCH395Cmd(CMD12_GET_SOCKET_STATUS_SN);
  518. xWriteCH395Data(sockindex);
  519. *status++ = xReadCH395Data();
  520. *status++ = xReadCH395Data();
  521. xEndCH395Cmd();
  522. }
  523. /*******************************************************************************
  524. * Function Name : CH395OpenSocket
  525. * Description : 打开socket,此命令需要等待执行成功
  526. * Input : sockindex Socket索引
  527. * Output : None
  528. * Return : 返回执行结果
  529. *******************************************************************************/
  530. UINT8 CH395OpenSocket(UINT8 sockindex)
  531. {
  532. UINT8 i = 0;
  533. UINT8 s = 0;
  534. xWriteCH395Cmd(CMD1W_OPEN_SOCKET_SN);
  535. xWriteCH395Data(sockindex);
  536. xEndCH395Cmd();
  537. while(1)
  538. {
  539. mDelaymS(5); /* 延时查询,建议2MS以上*/
  540. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  541. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  542. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  543. }
  544. return s;
  545. }
  546. /*******************************************************************************
  547. * Function Name : CH395CloseSocket
  548. * Description : 关闭socket,
  549. * Input : sockindex Socket索引
  550. * Output : None
  551. * Return : 返回执行结果
  552. *******************************************************************************/
  553. UINT8 CH395CloseSocket(UINT8 sockindex)
  554. {
  555. UINT8 i = 0;
  556. UINT8 s = 0;
  557. xWriteCH395Cmd(CMD1W_CLOSE_SOCKET_SN);
  558. xWriteCH395Data(sockindex);
  559. xEndCH395Cmd();
  560. while(1)
  561. {
  562. mDelaymS(5); /* 延时查询,建议2MS以上*/
  563. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  564. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  565. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  566. }
  567. return s;
  568. }
  569. /********************************************************************************
  570. * Function Name : CH395TCPConnect
  571. * Description : TCP连接,仅在TCP模式下有效,此命令需要等待执行成功
  572. * Input : sockindex Socket索引
  573. * Output : None
  574. * Return : 返回执行结果
  575. *******************************************************************************/
  576. UINT8 CH395TCPConnect(UINT8 sockindex)
  577. {
  578. UINT8 i = 0;
  579. UINT8 s = 0;
  580. xWriteCH395Cmd(CMD1W_TCP_CONNECT_SN);
  581. xWriteCH395Data(sockindex);
  582. xEndCH395Cmd();
  583. while(1)
  584. {
  585. mDelaymS(5); /* 延时查询,建议2MS以上*/
  586. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  587. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  588. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  589. }
  590. return s;
  591. }
  592. /******************************************************************************
  593. * Function Name : CH395TCPListen
  594. * Description : TCP监听,仅在TCP模式下有效,此命令需要等待执行成功
  595. * Input : sockindex Socket索引
  596. * Output : None
  597. * Return : 返回执行结果
  598. *******************************************************************************/
  599. UINT8 CH395TCPListen(UINT8 sockindex)
  600. {
  601. UINT8 i = 0;
  602. UINT8 s = 0;
  603. xWriteCH395Cmd(CMD1W_TCP_LISTEN_SN);
  604. xWriteCH395Data(sockindex);
  605. xEndCH395Cmd();
  606. while(1)
  607. {
  608. mDelaymS(5); /* 延时查询,建议2MS以上*/
  609. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  610. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  611. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  612. }
  613. return s;
  614. }
  615. /********************************************************************************
  616. * Function Name : CH395TCPDisconnect
  617. * Description : TCP断开,仅在TCP模式下有效,此命令需要等待执行成功
  618. * Input : sockindex Socket索引
  619. * Output : None
  620. * Return : None
  621. *******************************************************************************/
  622. UINT8 CH395TCPDisconnect(UINT8 sockindex)
  623. {
  624. UINT8 i = 0;
  625. UINT8 s = 0;
  626. xWriteCH395Cmd(CMD1W_TCP_DISNCONNECT_SN);
  627. xWriteCH395Data(sockindex);
  628. xEndCH395Cmd();
  629. while(1)
  630. {
  631. mDelaymS(5); /* 延时查询,建议2MS以上*/
  632. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  633. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  634. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  635. }
  636. return s;
  637. }
  638. /*******************************************************************************
  639. * Function Name : CH395GetSocketInt
  640. * Description : 获取socket n的中断状态
  641. * Input : sockindex socket索引
  642. * Output : None
  643. * Return : 中断状态
  644. *******************************************************************************/
  645. UINT8 CH395GetSocketInt(UINT8 sockindex)
  646. {
  647. UINT8 intstatus;
  648. xWriteCH395Cmd(CMD11_GET_INT_STATUS_SN);
  649. xWriteCH395Data(sockindex);
  650. mDelayuS(2);
  651. intstatus = xReadCH395Data();
  652. xEndCH395Cmd();
  653. return intstatus;
  654. }
  655. /*******************************************************************************
  656. * Function Name : CH395CRCRet6Bit
  657. * Description : 对多播地址进行CRC运算,并取高6位。
  658. * Input : mac_addr MAC地址
  659. * Output : None
  660. * Return : 返回CRC32的高6位
  661. *******************************************************************************/
  662. UINT8 CH395CRCRet6Bit(UINT8 *mac_addr)
  663. {
  664. INT32 perByte;
  665. INT32 perBit;
  666. const UINT32 poly = 0x04C11DB7;
  667. UINT32 crc_value = 0xFFFFFFFF;
  668. UINT8 c;
  669. for ( perByte = 0; perByte < 6; perByte ++ )
  670. {
  671. c = *(mac_addr++);
  672. for ( perBit = 0; perBit < 8; perBit++ )
  673. {
  674. crc_value = (crc_value<<1)^((((crc_value>>31)^c)&0x01)?poly:0);
  675. c >>= 1;
  676. }
  677. }
  678. crc_value=crc_value>>26;
  679. return ((UINT8)crc_value);
  680. }
  681. /******************************************************************************
  682. * Function Name : CH395DHCPEnable
  683. * Description : 启动/停止DHCP
  684. * Input : flag 1:启动DHCP;0:停止DHCP
  685. * Output : None
  686. * Return : 执行状态
  687. *******************************************************************************/
  688. UINT8 CH395DHCPEnable(UINT8 flag)
  689. {
  690. UINT8 i = 0;
  691. UINT8 s;
  692. xWriteCH395Cmd(CMD10_DHCP_ENABLE);
  693. xWriteCH395Data(flag);
  694. xEndCH395Cmd();
  695. while(1)
  696. {
  697. mDelaymS(20);
  698. s = CH395GetCmdStatus(); /* 不能过于频繁查询*/
  699. if(s !=CH395_ERR_BUSY)break; /* 如果CH395芯片返回忙状态*/
  700. if(i++ > 200)return CH395_ERR_UNKNOW; /* 超时退出*/
  701. }
  702. return s;
  703. }
  704. /******************************************************************************
  705. * Function Name : CH395GetDHCPStatus
  706. * Description : 获取DHCP状态
  707. * Input : None
  708. * Output : None
  709. * Return : DHCP状态,0为成功,其他值表示错误
  710. *******************************************************************************/
  711. UINT8 CH395GetDHCPStatus(void)
  712. {
  713. UINT8 status;
  714. xWriteCH395Cmd(CMD01_GET_DHCP_STATUS);
  715. status = xReadCH395Data();
  716. xEndCH395Cmd();
  717. return status;
  718. }
  719. /*******************************************************************************
  720. * Function Name : CH395GetIPInf
  721. * Description : 获取IP,子网掩码和网关地址
  722. * Input : None
  723. * Output : 12个字节的IP,子网掩码和网关地址
  724. * Return : None
  725. *******************************************************************************/
  726. void CH395GetIPInf(UINT8 *addr)
  727. {
  728. UINT8 i;
  729. xWriteCH395Cmd(CMD014_GET_IP_INF);
  730. for(i = 0; i < 20; i++)
  731. {
  732. *addr++ = xReadCH395Data();
  733. }
  734. xEndCH395Cmd();
  735. }
  736. /*******************************************************************************
  737. * Function Name : CH395WriteGPIOAddr
  738. * Description : 写GPIO寄存器
  739. * Input : regadd 寄存器地址
  740. * :regval 寄存器值
  741. * Output : None
  742. * Return : None
  743. *******************************************************************************/
  744. void CH395WriteGPIOAddr(UINT8 regadd,UINT8 regval)
  745. {
  746. xWriteCH395Cmd(CMD20_WRITE_GPIO_REG);
  747. xWriteCH395Data(regadd);
  748. xWriteCH395Data(regval);
  749. }
  750. /*******************************************************************************
  751. * Function Name : CH395ReadGPIOAddr
  752. * Description : 读GPIO寄存器
  753. * Input : regadd 寄存器地址
  754. * Output : None
  755. * Return : 寄存器的值
  756. *******************************************************************************/
  757. UINT8 CH395ReadGPIOAddr(UINT8 regadd)
  758. {
  759. UINT8 i;
  760. xWriteCH395Cmd(CMD10_READ_GPIO_REG);
  761. xWriteCH395Data(regadd);
  762. mDelaymS(1);
  763. i = xReadCH395Data();
  764. return i;
  765. }
  766. /*******************************************************************************
  767. * Function Name : CH395EEPROMErase
  768. * Description : 擦除EEPROM
  769. * Input : None
  770. * Output : None
  771. * Return : 执行状态
  772. *******************************************************************************/
  773. UINT8 CH395EEPROMErase(void)
  774. {
  775. UINT8 i;
  776. xWriteCH395Cmd(CMD00_EEPROM_ERASE);
  777. while(1)
  778. {
  779. mDelaymS(20);
  780. i = CH395GetCmdStatus();
  781. if(i == CH395_ERR_BUSY)continue;
  782. break;
  783. }
  784. return i;
  785. }
  786. /*******************************************************************************
  787. * Function Name : CH395EEPROMWrite
  788. * Description : 写EEPROM
  789. * Input : eepaddr EEPROM地址
  790. * :buf 缓冲区地址
  791. * :len 长度
  792. * Output : None
  793. * Return : 执行状态
  794. *******************************************************************************/
  795. UINT8 CH395EEPROMWrite(UINT16 eepaddr,UINT8 *buf,UINT8 len)
  796. {
  797. UINT8 i;
  798. xWriteCH395Cmd(CMD30_EEPROM_WRITE);
  799. xWriteCH395Data((UINT8)(eepaddr));
  800. xWriteCH395Data((UINT8)(eepaddr >> 8));
  801. xWriteCH395Data(len);
  802. while(len--)xWriteCH395Data(*buf++);
  803. while(1)
  804. {
  805. mDelaymS(20);
  806. i = CH395GetCmdStatus();
  807. if(i == CH395_ERR_BUSY)continue;
  808. break;
  809. }
  810. return i;
  811. }
  812. /*******************************************************************************
  813. * Function Name : CH395EEPROMRead
  814. * Description : 写EEPROM
  815. * Input : eepaddr EEPROM地址
  816. * :buf 缓冲区地址
  817. * :len 长度
  818. * Output : None
  819. * Return : None
  820. *******************************************************************************/
  821. void CH395EEPROMRead(UINT16 eepaddr,UINT8 *buf,UINT8 len)
  822. {
  823. xWriteCH395Cmd(CMD30_EEPROM_READ);
  824. xWriteCH395Data((UINT8)(eepaddr));
  825. xWriteCH395Data((UINT8)(eepaddr >> 8));
  826. xWriteCH395Data(len);
  827. mDelaymS(1);
  828. while(len--)*buf++ = xReadCH395Data();
  829. }
  830. /*******************************************************************************
  831. * Function Name : CH395SetTCPMss
  832. * Description : 设置TCP MSS值
  833. * Input : tcpmss
  834. * Output : None
  835. * Return : None
  836. *******************************************************************************/
  837. void CH395SetTCPMss(UINT16 tcpmss)
  838. {
  839. xWriteCH395Cmd(CMD20_SET_TCP_MSS);
  840. xWriteCH395Data((UINT8)(tcpmss));
  841. xWriteCH395Data((UINT8)(tcpmss >> 8));
  842. }
  843. /*******************************************************************************
  844. * Function Name : CH395SetSocketRecvBuf
  845. * Description : 设置Socket接收缓冲区
  846. * Input : sockindex socket索引
  847. :startblk 起始地址
  848. :blknum 单位缓冲区个数 ,单位为512字节
  849. * Output : None
  850. * Return : None
  851. *******************************************************************************/
  852. void CH395SetSocketRecvBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum)
  853. {
  854. xWriteCH395Cmd(CMD30_SET_RECV_BUF);
  855. xWriteCH395Data(sockindex);
  856. xWriteCH395Data(startblk);
  857. xWriteCH395Data(blknum);
  858. }
  859. /*******************************************************************************
  860. * Function Name : CH395SetSocketSendBuf
  861. * Description : 设置Socket发送缓冲区
  862. * Input : sockindex socket索引
  863. :startblk 起始地址
  864. :blknum 单位缓冲区个数
  865. * Output : None
  866. * Return : None
  867. *******************************************************************************/
  868. void CH395SetSocketSendBuf(UINT8 sockindex,UINT8 startblk,UINT8 blknum)
  869. {
  870. xWriteCH395Cmd(CMD30_SET_SEND_BUF);
  871. xWriteCH395Data(sockindex);
  872. xWriteCH395Data(startblk);
  873. xWriteCH395Data(blknum);
  874. }
  875. /*******************************************************************************
  876. * Function Name : CH395UDPSendTo
  877. * Description : UDP向指定的IP和端口发送数据
  878. * Input : buf : 发送数据缓冲区
  879. len : 发送数据长度
  880. ip : 目标IP
  881. port : 目标端口
  882. sockeid : socket索引值
  883. * Output : None
  884. * Return : None
  885. *******************************************************************************/
  886. void CH395UDPSendTo(UINT8 *buf,UINT32 len,UINT8 *ip,UINT16 port,UINT8 sockindex)
  887. {
  888. CH395SetSocketDesIP(sockindex,ip); /* 设置socket 0目标IP地址 */
  889. CH395SetSocketDesPort(sockindex,port);
  890. CH395SendData(sockindex,buf,len);
  891. }
  892. /*******************************************************************************
  893. * Function Name : CH395SetStartPara
  894. * Description : 设置CH395启动参数
  895. * Input : mdata
  896. * Output : None
  897. * Return : None
  898. *******************************************************************************/
  899. void CH395SetStartPara(UINT32 mdata)
  900. {
  901. xWriteCH395Cmd(CMD40_SET_FUN_PARA);
  902. xWriteCH395Data((UINT8)mdata);
  903. xWriteCH395Data((UINT8)((UINT16)mdata>>8));
  904. xWriteCH395Data((UINT8)(mdata >> 16));
  905. xWriteCH395Data((UINT8)(mdata >> 24));
  906. }
  907. /*******************************************************************************
  908. * Function Name : CH395CMDGetGlobIntStatus
  909. * Description : 获取全局中断状态,收到此命令CH395自动取消中断,0x44及以上版本使用
  910. * Input : None
  911. * Output : None
  912. * Return : 返回当前的全局中断状态
  913. *******************************************************************************/
  914. UINT16 CH395CMDGetGlobIntStatus_ALL(void)
  915. {
  916. UINT16 init_status;
  917. xWriteCH395Cmd(CMD02_GET_GLOB_INT_STATUS_ALL);
  918. mDelayuS(2);
  919. init_status = xReadCH395Data();
  920. init_status = (UINT16)(xReadCH395Data()<<8) + init_status;
  921. xEndCH395Cmd();
  922. return init_status;
  923. }
  924. /*******************************************************************************
  925. * Function Name : CH395SetKeepLive
  926. * Description : 设置keepalive功能
  927. * Input : sockindex Socket号
  928. * cmd 0:关闭 1:开启
  929. * Output : None
  930. * Return : None
  931. *******************************************************************************/
  932. void CH395SetKeepLive(UINT8 sockindex,UINT8 cmd)
  933. {
  934. xWriteCH395Cmd(CMD20_SET_KEEP_LIVE_SN);
  935. xWriteCH395Data(sockindex);
  936. xWriteCH395Data(cmd);
  937. }
  938. /*******************************************************************************
  939. * Function Name : CH395KeepLiveCNT
  940. * Description : 设置keepalive重试次数
  941. * Input : cnt 重试次数()
  942. * Output : None
  943. * Return : None
  944. *******************************************************************************/
  945. void CH395KeepLiveCNT(UINT8 cnt)
  946. {
  947. xWriteCH395Cmd(CMD10_SET_KEEP_LIVE_CNT);
  948. xWriteCH395Data(cnt);
  949. }
  950. /*******************************************************************************
  951. * Function Name : CH395KeepLiveIDLE
  952. * Description : 设置KEEPLIVE空闲
  953. * Input : idle 空闲时间(单位:ms)
  954. * Output : None
  955. * Return : None
  956. *******************************************************************************/
  957. void CH395KeepLiveIDLE(UINT32 idle)
  958. {
  959. xWriteCH395Cmd(CMD40_SET_KEEP_LIVE_IDLE);
  960. xWriteCH395Data((UINT8)idle);
  961. xWriteCH395Data((UINT8)((UINT16)idle>>8));
  962. xWriteCH395Data((UINT8)(idle >> 16));
  963. xWriteCH395Data((UINT8)(idle >> 24));
  964. }
  965. /*******************************************************************************
  966. * Function Name : CH395KeepLiveINTVL
  967. * Description : 设置KeepLive间隔时间
  968. * Input : intvl 间隔时间(单位:ms)
  969. * Output : None
  970. * Return : None
  971. *******************************************************************************/
  972. void CH395KeepLiveINTVL(UINT32 intvl)
  973. {
  974. xWriteCH395Cmd(CMD40_SET_KEEP_LIVE_INTVL);
  975. xWriteCH395Data((UINT8)intvl);
  976. xWriteCH395Data((UINT8)((UINT16)intvl>>8));
  977. xWriteCH395Data((UINT8)(intvl >> 16));
  978. xWriteCH395Data((UINT8)(intvl >> 24));
  979. }
  980. /*******************************************************************************
  981. * Function Name : CH395SetTTLNum
  982. * Description : 设置TTL
  983. * Input : sockindex Socket号
  984. * TTLnum:TTL数
  985. * Output : None
  986. * Return : None
  987. *******************************************************************************/
  988. void CH395SetTTLNum(UINT8 sockindex,UINT8 TTLnum)
  989. {
  990. xWriteCH395Cmd(CMD20_SET_TTL);
  991. xWriteCH395Data(sockindex);
  992. xWriteCH395Data(TTLnum);
  993. }
  994. /**************************** endfile *************************************/