/**************************Copyright (c)****************************************************
* 珠海派诺科技公司
*
* ------------------------文件信息---------------------------------------------------
* 文件名: driver_mc8332.c
* 版本:
* 描述: MC8332 CDMA驱动
* ---------------------------------------------------------------------------------------
* 作者 : linp
* 创建日期: 2016.12.8
****************************************************************************************/
#include <string.h>
#include <stdio.h>
#include "stm32f2xx.h"
#include "stm32f2xx_conf.h"
#include "ucos_ii.h"
#include "driver_usart.h"
#include "sys_time.h"
#include "wireless_cdma.h"
#include "dz.h"
#include "debug_printf.h"
#include "msgRing.h"
#define MC8332_GPIO_PWEN 0
#define MC8332_GPIO_ONOFF 1
#define CDMA_AT_INIT 0
#define CDMA_AT_CONNECT 1
#define CDMA_AT_OK 2
typedef struct
{
GPIO_TypeDef *iog;
uint16_t iop;
} GPIO_DEF;
const GPIO_DEF g_mc8332_pin[] =
{
{GPIOA, GPIO_Pin_5},
{GPIOE, GPIO_Pin_15},
};
static unsigned short csq_value = 0;
#define M26_RECV_BUF_SIZE 512
#define TICK_TIMEOUT (120 *1000)
#define RSSI_TICK_TIMEOUT (30 *1000)
typedef struct
{
uint8_t status;
uint8_t restFlag;
uint8_t buf[M26_RECV_BUF_SIZE];
uint8_t tx_buf[M26_RECV_BUF_SIZE];
MSG_RING ring;
MSG_RING txRing;
char send_buf[128];
uint8_t recv_buf[M26_RECV_BUF_SIZE];
uint32_t tick;
uint32_t rssiTick; /*信号轻度间隔*/
}M26_STATUS;
static M26_STATUS g_m26_status = {0};
//套接字互斥锁操作宏
static uint8_t perr;
static OS_EVENT *g_gprsSem; //套接字互斥信号量
#define CDMA_LOCK OSSemPend(g_gprsSem, 0, &perr)
#define CDMA_UNLOCK OSSemPost(g_gprsSem)
void cdma_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
//上电使能
GPIO_InitStructure.GPIO_Pin = g_mc8332_pin[MC8332_GPIO_PWEN].iop;
GPIO_Init(g_mc8332_pin[MC8332_GPIO_PWEN].iog, &GPIO_InitStructure);
//复位使能
GPIO_InitStructure.GPIO_Pin = g_mc8332_pin[MC8332_GPIO_ONOFF].iop;
GPIO_Init(g_mc8332_pin[MC8332_GPIO_ONOFF].iog, &GPIO_InitStructure);
GPIO_SetBits(g_mc8332_pin[MC8332_GPIO_PWEN].iog, g_mc8332_pin[MC8332_GPIO_PWEN].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
GPIO_SetBits(g_mc8332_pin[MC8332_GPIO_ONOFF].iog, g_mc8332_pin[MC8332_GPIO_ONOFF].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
GPIO_ResetBits(g_mc8332_pin[MC8332_GPIO_ONOFF].iog, g_mc8332_pin[MC8332_GPIO_ONOFF].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
if(1)
{
msg_ring_init(&g_m26_status.ring, g_m26_status.buf, M26_RECV_BUF_SIZE);
msg_ring_init(&g_m26_status.txRing, g_m26_status.tx_buf, M26_RECV_BUF_SIZE);
}
g_gprsSem = OSSemCreate(1);
usart_init(USART_GPRS, 115200, 0, 8, 1);
}
void cdma_reset(void)
{
GPIO_ResetBits(g_mc8332_pin[MC8332_GPIO_PWEN].iog, g_mc8332_pin[MC8332_GPIO_PWEN].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
GPIO_SetBits(g_mc8332_pin[MC8332_GPIO_PWEN].iog, g_mc8332_pin[MC8332_GPIO_PWEN].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
GPIO_SetBits(g_mc8332_pin[MC8332_GPIO_ONOFF].iog, g_mc8332_pin[MC8332_GPIO_ONOFF].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
GPIO_ResetBits(g_mc8332_pin[MC8332_GPIO_ONOFF].iog, g_mc8332_pin[MC8332_GPIO_ONOFF].iop);
OSTimeDlyHMSM(0, 0, 3, 0);
if(1)
{
g_m26_status.status = CDMA_AT_INIT;
msg_ring_clear(&g_m26_status.ring);
msg_ring_clear(&g_m26_status.txRing);
g_m26_status.restFlag = 0;
}
}
/**********************16进制打印函数***************************/
#if 0
static uint8_t print_strbuf[M26_RECV_BUF_SIZE];
static void hex_print(uint8_t *buf, int len)
{
int offset = 0;
int i;
uint8_t p;
print_strbuf[offset++] = '\r';
print_strbuf[offset++] = '\n';
for(i = 0; i < len; ++i)
{
p = (buf[i] >> 4);
if (p > 9)
{
p = p - 10;
print_strbuf[offset++] = p + 'A';
}
else
{
print_strbuf[offset++] = p + '0';
}
p = buf[i] & 0x0F;
if (p > 9)
{
p = p - 10;
print_strbuf[offset++] = p + 'A';
}
else
{
print_strbuf[offset++] = p + '0';
}
print_strbuf[offset++] = ' ';
}
// usart_send(USART_DEBUG, print_strbuf, offset);
}
#endif
/************************************************************************/
static int cdma_uart_send(const char *buf, int len)
{
return usart_send(USART_GPRS, (const uint8_t *)buf, len);
}
static int cdma_uart_recv(uint8_t *buf, int len, int timeout)
{
int recv_len=0;
if (0 == timeout)
{
recv_len = usart_gprs_recv(USART_GPRS, buf, len, 100);
}
else
{
recv_len = usart_recv(USART_GPRS, buf, len, timeout);
}
if (recv_len > 0)
{
//dbg_printf(1, "%s", buf);
}
return recv_len;
}
static void cdma_rev_put(uint8_t *buf, int len)
{
char * p1 = NULL;
char * p2 = NULL;
//char * p3 = NULL;
char * pdatalen = NULL;
int strlen_len = 0 ;
int strlen = 0;
int i = 0;
p1 = strstr((const char *)buf,"TCP,");
p2 = strstr((const char *)(buf+2),"\r\n");
//p3 = strstr((const char *)(p2+2),"\r\n");
pdatalen = p1 + 4;
strlen_len = p2 - p1 -4;
for(i =0;i<strlen_len;i++)
{
strlen = strlen*10 + ((*pdatalen)-'0');
pdatalen ++;
}
CDMA_LOCK;
msg_ring_put(&g_m26_status.ring, (const uint8_t*)(p2+2), strlen);
CDMA_UNLOCK;
//hex_print((uint8_t*)(p2+2), strlen);
g_m26_status.tick = tick_get();
}
static int cdma_rev_send(int revlen)
{
const char *at_cmd = "AT+QIRD=0,1,0,%d\r\n";
int len;
len = sprintf(g_m26_status.send_buf, at_cmd, revlen);
if(cdma_uart_send(g_m26_status.send_buf, len) <= 0)
{
return -1;
}
while(1)
{
memset(g_m26_status.recv_buf, 0x00, M26_RECV_BUF_SIZE);
len = cdma_uart_recv(g_m26_status.recv_buf, M26_RECV_BUF_SIZE, 5);
if(len <= 0)
{
return -1;
}
if(strstr((const char *)g_m26_status.recv_buf, "+QIRDI:") != NULL)
{
cdma_rev_send(M26_RECV_BUF_SIZE);
}
else if(strstr((const char *)g_m26_status.recv_buf, "+QIRD:") != NULL)
{
cdma_rev_put(g_m26_status.recv_buf,len);
return 0;
}
else
{
cdma_rev_send(M26_RECV_BUF_SIZE);
return -2;
}
}
}
static int cdma_ate0(void)
{
if(1)
{
const char *at_cmd = "ATE0\r\n";
int len = 0;
len = sprintf((char *)g_m26_status.send_buf, "%s", at_cmd);
if(cdma_uart_send(g_m26_status.send_buf, len) <= 0)
{
return -1;
}
while(1)
{
len = cdma_uart_recv(g_m26_status.recv_buf, M26_RECV_BUF_SIZE, 1);
if(len <= 0)
{
return -1;
}
if(strstr((const char *)g_m26_status.recv_buf, "OK") != NULL)
{
return 0;
}
else
{
return -2;
}
}
}
}
static int cdma_cpin(void)
{
const char *at_cmd = "AT+CPIN?\r\n";
int len = 0;
len = sprintf((char *)g_m26_status.send_buf, "%s", at_cmd);
if(cdma_uart_send(g_m26_status.send_buf, len) <= 0)
{
return -1;
}
while(1)
{
len = cdma_uart_recv(g_m26_status.recv_buf, M26_RECV_BUF_SIZE, 5);
if(len <= 0)
{
return -1;
}
if(strstr((const char *)g_m26_status.recv_buf, "+CPIN: READY") != NULL)
{
return 0;
}
else
{
return -2;
}
}
}
static int try_cpin(void)
{
int tryt
- 1
- 2
前往页