Modem.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. /**********************************************************************************
  2. * File Name: Modem.c
  3. * Function Describe:device for modem
  4. * Relate Module:
  5. * Explain: the modem must be using ZTE MC8332
  6. * Writer: ShiLiangWen
  7. * Date: 2015.1.20
  8. ***********************************************************************************/
  9. #include "includes.h"
  10. void ModemSendAT(char *p)
  11. {
  12. char d;
  13. while(*p){
  14. d=*p;
  15. USART_SendData(USART3, (uint8_t) d);
  16. /* Loop until the end of transmission */
  17. while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET){}
  18. p++;
  19. }
  20. }
  21. int ModemSendData(unsigned char *pData,unsigned short datalen)
  22. {
  23. int i;
  24. for(i=0;i<datalen;i++){
  25. USART_SendData(USART3, pData[i]);
  26. /* Loop until the end of transmission */
  27. while (USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
  28. }
  29. return 1;
  30. }
  31. /**********************************************************************************
  32. 等待模块启动完成
  33. 0:成功 -1:超时
  34. ***********************************************************************************/
  35. int WaitModemIsOpened(void)
  36. {
  37. char buf[20];
  38. int time=100;
  39. while(time--){
  40. ModemSendAT("AT\r\n");
  41. if(0!=ModemWaitAckMsg("OK\r\n",buf,20,50)){
  42. break;
  43. }
  44. }
  45. if(time)return 0;
  46. else return -1;
  47. }
  48. void ModemPoweroff(void)
  49. {
  50. MODEM_PWRKEY_LOW;
  51. MODEM_RESET_LOW;
  52. DelayTick(50);
  53. MODEM_RESET_HIGH;
  54. DelayTick(10);
  55. MODEM_RESET_LOW;
  56. }
  57. void ModemCtrlInit(void)
  58. {
  59. GPIO_InitTypeDef GPIO_InitStructure;
  60. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  61. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  62. MODEM_DTR_HIGH;
  63. MODEM_RING_HIGH;
  64. MODEM_DSR_HIGH;
  65. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  66. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  67. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  68. MODEM_DTR_HIGH;
  69. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  70. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  71. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  72. MODEM_RING_HIGH;
  73. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  74. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  75. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  76. MODEM_DSR_HIGH;
  77. MODEM_DCD_HIGH;
  78. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  79. GPIO_InitStructure.GPIO_Pin = MODEM_DCD_PIN;
  80. GPIO_Init(MODEM_DCD_PORT, &GPIO_InitStructure);
  81. }
  82. /**********************************************************************************
  83. ModemInit
  84. 返回:0 初始化成功 非零-失败
  85. ***********************************************************************************/
  86. int ModemInit(void)
  87. {
  88. GPIO_InitTypeDef GPIO_InitStructure;
  89. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  90. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  91. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  92. GPIO_InitStructure.GPIO_Pin = MODEM_RESET_PIN;
  93. GPIO_Init(MODEM_RESET_PORT, &GPIO_InitStructure);
  94. GPIO_InitStructure.GPIO_Pin = MODEM_PWRKEY_PIN;
  95. GPIO_Init(MODEM_PWRKEY_PORT, &GPIO_InitStructure);
  96. ModemCtrlInit();
  97. MODEM_RESET_HIGH;
  98. MODEM_PWRKEY_HIGH;
  99. DelayTick(10);
  100. MODEM_RESET_LOW;
  101. DelayTick(50);
  102. return WaitModemIsOpened();
  103. }
  104. /**********************************************************************************
  105. CSQ2Num
  106. ***********************************************************************************/
  107. int CSQ2Num(char *str)
  108. {
  109. int csq;
  110. csq=atoi(str);
  111. if(csq<0 || csq>99)return 99;
  112. else return csq;
  113. }
  114. /**********************************************************************************
  115. ModemStrCmp
  116. ***********************************************************************************/
  117. int ModemStrCmp(char *msg,char *str)
  118. {
  119. char *p1=str;
  120. char *p2=msg;
  121. while(*p1!=0){
  122. if(*p1!=*p2)return 1;
  123. p1++;
  124. p2++;
  125. }
  126. return 0;
  127. }
  128. /**********************************************************************************
  129. ModemCheckRecv
  130. if timeout return 0
  131. else return r
  132. ***********************************************************************************/
  133. int ModemWaitMsg(char *pMsgBuf,unsigned short MsgBufLen,int timeout)
  134. {
  135. int r;
  136. timeout++;
  137. while(timeout){
  138. timeout--;
  139. r=MsgQueueAccept(&ModemMsgQueue,pMsgBuf, MsgBufLen);
  140. if(r)return r;
  141. else{
  142. if(timeout)DelayTick(1);
  143. }
  144. }
  145. return 0;
  146. }
  147. /**********************************************************************************
  148. ModemWaitAckMsg
  149. ***********************************************************************************/
  150. int ModemWaitAckMsg(char *pAck,char *pMsgBuf,unsigned short MsgBufLen,int timeout)
  151. {
  152. int r;
  153. timeout++;
  154. while(timeout){
  155. timeout--;
  156. r=MsgQueueAccept(&ModemMsgQueue,pMsgBuf, MsgBufLen);
  157. if(r){
  158. if(0==ModemStrCmp(pMsgBuf,pAck))return r;
  159. }else{
  160. if(timeout)DelayTick(1);
  161. }
  162. }
  163. return 0;
  164. }
  165. /*
  166. int ModemSendTcpData(unsigned char socket,unsigned char *pData,unsigned short len)
  167. {
  168. int i;
  169. char buf[150];
  170. char tmp[5];
  171. unsigned char temp=0;
  172. int flag=0;
  173. sprintf(buf,"AT+ZIPSEND=%d,%d\r",socket,len);
  174. ModemSendAT(buf);
  175. //SlwTrace(INF,buf);SlwTrace(INF,"\n");
  176. ModemSendData(pData,len);
  177. // if(ModemWaitACKMsg("OK",1))flag=1;
  178. #if 0
  179. sprintf(buf,"[TCP]");
  180. for(i=0;i<len;i++){
  181. sprintf(tmp,"%02x,",pData[i]);
  182. strcat(buf,tmp);
  183. }
  184. strcat(buf,"\r\n");
  185. printf(buf);
  186. #endif
  187. return flag;
  188. }*/
  189. int ModemSendUdpData(unsigned char socket,unsigned char *pData,unsigned short len)
  190. {
  191. int i;
  192. char buf[230];
  193. char tmp[5];
  194. unsigned char temp=0;
  195. int flag=0;
  196. sprintf(buf,"AT+ZIPSENDU=%d,%d\r",socket,len);
  197. ModemSendAT(buf);
  198. ModemSendData(pData,len);
  199. #if 1 //DEBUG
  200. sprintf(buf,"[Send=%d]",len);
  201. if(len>70)len=70;
  202. //for(i=0;i<len;i++){
  203. // sprintf(tmp,"%02x,",pData[i]);
  204. // strcat(buf,tmp);
  205. //}
  206. strcat(buf,"\r\n");
  207. SlwTrace(buf);
  208. #endif
  209. return flag;
  210. }
  211. unsigned short StrToNum(char *str)
  212. {
  213. unsigned short num;
  214. if(str[0]>0x2f && str[0]<0x3a){
  215. if(str[1]>0x2f && str[1]<0x3a){
  216. if(str[2]>0x2f && str[2]<0x3a){
  217. if(str[3]>0x2f && str[3]<0x3a){
  218. num=1000*(str[0]-0x30);
  219. num+=100*(str[1]-0x30);
  220. num+=10*(str[2]-0x30);
  221. num+=(str[3]-0x30);
  222. }else{
  223. num=100*(str[0]-0x30);
  224. num+=10*(str[1]-0x30);
  225. num+=(str[2]-0x30);
  226. }
  227. }else{
  228. num=10*(str[0]-0x30);
  229. num+=(str[1]-0x30);
  230. }
  231. }else{
  232. num= str[0]-0x30;
  233. }
  234. }else{
  235. num=0;
  236. }
  237. return num;
  238. }
  239. /**********************************************************************************
  240. *ModemSetDTRLow
  241. ***********************************************************************************
  242. void ModemSetDtrLow(void)
  243. {
  244. GPIO_InitTypeDef GPIO_InitStructure;
  245. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  246. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  247. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  248. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  249. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  250. MODEM_DTR_LOW;
  251. }*/
  252. /**********************************************************************************
  253. *ModemSetDTRInput
  254. ***********************************************************************************
  255. void ModemSetDtrInput(void)
  256. {
  257. GPIO_InitTypeDef GPIO_InitStructure;
  258. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  259. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  260. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  261. GPIO_InitStructure.GPIO_Pin = MODEM_DTR_PIN;
  262. GPIO_Init(MODEM_DTR_PORT, &GPIO_InitStructure);
  263. }*/
  264. /**********************************************************************************
  265. *ModemSetRINGLow
  266. ***********************************************************************************
  267. void ModemSetRingLow(void)
  268. {
  269. GPIO_InitTypeDef GPIO_InitStructure;
  270. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  271. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  272. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  273. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  274. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  275. MODEM_RING_LOW;
  276. }*/
  277. /**********************************************************************************
  278. *ModemSetRINGInput
  279. ***********************************************************************************
  280. void ModemSetRingInput(void)
  281. {
  282. GPIO_InitTypeDef GPIO_InitStructure;
  283. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  284. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  285. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  286. GPIO_InitStructure.GPIO_Pin = MODEM_RING_PIN;
  287. GPIO_Init(MODEM_RING_PORT, &GPIO_InitStructure);
  288. }*/
  289. /**********************************************************************************
  290. *ModemSetDSRLow
  291. ***********************************************************************************
  292. void ModemSetDsrLow(void)
  293. {
  294. GPIO_InitTypeDef GPIO_InitStructure;
  295. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  296. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  297. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  298. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  299. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  300. MODEM_DSR_LOW;
  301. }*/
  302. /**********************************************************************************
  303. *ModemSetDSRInput
  304. ***********************************************************************************
  305. void ModemSetDsrInput(void)
  306. {
  307. GPIO_InitTypeDef GPIO_InitStructure;
  308. //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);
  309. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  310. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  311. GPIO_InitStructure.GPIO_Pin = MODEM_DSR_PIN;
  312. GPIO_Init(MODEM_DSR_PORT, &GPIO_InitStructure);
  313. }*/
  314. /***********************************************************************************/