forked from gary/BCU
2
0
Fork 0
BCU/library/drv_peripheral/drv_qfc41d.c.orig

151 lines
3.5 KiB
C
Raw Normal View History

/******************************************************************************
* @file drv_qfc41d.c
* @brief drv_qfc41d driver
* @version V1.0
* @author Gary
* @copyright
******************************************************************************/
#include "drv_qfc41d.h"
uint8_t rev_buff[QFC41D_MAX_RECV_SIZE] = {0};
uint8_t send_buff[QFC41D_MAX_SEND_SIZE] = {0};
uint8_t wifiName[40] = {0}, wifiPassWord[40] = {0};
//<2F><><EFBFBD><EFBFBD>
WifiBleItem qfc41dItem = {
.dev = QFC41D_UART_PORT,
.buf_pos = 0,
.buf_size = QFC41D_MAX_RECV_SIZE,
.buf = rev_buff,
.sendCall = NULL,
};
static void drv_qfc41d_push_data(WifiBleItem* item, uint8_t *buf, uint16_t len)
{
uint16_t i = 0;
if((item != NULL) && (item->buf_pos + len < item->buf_size))
{
item->buf[item->buf_pos++] = buf[i];
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD>ʾһ<CABE><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AT ָ<><EFBFBD><EEB7B5>
if (buf[i] == '\n')
{
item->buf[item->buf_pos] = '\0'; // <20><><EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD><EFBFBD><EFBFBD>
item->buf_pos = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
}
}
static void qf41d_uart_rx_it_call(kit_ret_e res, void *data)
{
OS_TRACE_ISR_ENTER();
drv_qfc41d_push_data(&qfc41dItem, data, 1);
OS_TRACE_ISR_EXIT();
}
// <20><><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ַ<EFBFBD>
void drv_wireless_send_char(char c)
{
while (!(USART2->SR & USART_SR_TXE)); // <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
USART2->DR = c;
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
void drv_wireless_send_string(const char *str)
{
while (*str)
{
drv_wireless_send_char(*str++);
}
drv_wireless_send_char('\r'); // <20><><EFBFBD><EFBFBD> CR
drv_wireless_send_char('\n'); // <20><><EFBFBD><EFBFBD> LF
}
// <20><><EFBFBD><EFBFBD> AT ָ<><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ֵ
int drv_wifi_send_cmd(const char *cmd, const char *response, uint32_t timeout)
{
memset(qfc41dItem.buf, 0, QFC41D_MAX_RECV_SIZE);
qfc41dItem.buf_pos = 0; // <20><><EFBFBD>ս<EFBFBD><D5BD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
drv_wireless_send_string(cmd);
uint32_t start_time = kit_time_get_tick(); // <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
while (kit_time_get_tick() - start_time < timeout)
{
if (strstr((char *)qfc41dItem.buf, response))
{
return 1; // <20>ɹ<EFBFBD>ƥ<EFBFBD><EFBFBD><E4B7B5>ֵ
}
}
return 0; // <20><>ʱδ<CAB1>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
static uint8_t drv_wifi_init()
{
// 1. <20><><EFBFBD><EFBFBD> AT ָ<><D6B8>
if (!drv_wifi_send_cmd("AT", "OK", WIFI_TIMEOUT))
{
KIT_PRINTF("WiFi Module not responding!\r\n");
return 1 ;
}
// 2. <20><><EFBFBD><EFBFBD> Wi-Fi Ϊ STA ģʽ
if (!drv_wifi_send_cmd("AT+CWMODE=1", "OK", WIFI_TIMEOUT))
{
KIT_PRINTF("Failed to set WiFi mode!\r\n");
return 1;
}
// 3. <20><><EFBFBD><EFBFBD> Wi-Fi
char cmd[128];
snprintf(cmd, sizeof(cmd), "AT+CWJAP=\"%s\",\"%s\"", wifiName, wifiPassWord);
if (!drv_wifi_send_cmd(cmd, "WIFI CONNECTED", WIFI_TIMEOUT * 2))
{
KIT_PRINTF("Failed to connect to WiFi!\r\n");
//return 1; //<2F><><EFBFBD>󲻷<EFBFBD><F3B2BBB7><EFBFBD>-<2D><>ֹӰ<D6B9><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
}
// 4. <20><>ȡ IP <20><>ַ
if (!drv_wifi_send_cmd("AT+CIFSR", ".", WIFI_TIMEOUT))
{
KIT_PRINTF("Failed to get IP address!\r\n");
//return 1; //<2F><><EFBFBD>󲻷<EFBFBD><F3B2BBB7><EFBFBD>-<2D><>ֹӰ<D6B9><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4>
}
KIT_PRINTF("WiFi Initialization Successful!\r\n");
return 0;
}
uint8_t drv_qfc41d_init(void)
{
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
drv_uart_init((UartDev)qfc41dItem.dev, 115200, 0 | UART_CFG_STOP_BIT_1, kGpioType_WIRELESSUart_Tx, kGpioType_WIRELESSUart_Rx);
//<2F><><EFBFBD>ý<EFBFBD><C3BD>ջص<D5BB><D8B5><EFBFBD><EFBFBD><EFBFBD>
drv_uart_set_interrupt(QFC41D_UART_PORT, kUartInterrupt_Rx, APP_CFG_INT_PRIO_UART2_RX, qf41d_uart_rx_it_call);//#define SIM_UART_PORT kUartDev_2
//<2F><>ʼ<EFBFBD><CABC>wifi
if(drv_wifi_init() != 0)
{
return 1;
` }
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}