修改蓝牙驱动底层,简化了使用方式
        修改总钻风驱动底层,增加对V2.1版本总钻风的PCLK参数设置
        增加双频GPS定位模块的底层驱动
This commit is contained in:
SeekFree
2022-03-11 18:38:02 +08:00
parent 2675e06f91
commit 1a18effc04
188 changed files with 14999 additions and 8351 deletions

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -223,6 +223,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -223,6 +223,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

View File

@@ -0,0 +1,514 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#include "zf_stm_systick.h"
#include "zf_uart.h"
#include "math.h"
#include "SEEKFREE_GPS_TAU1201.h"
#include <string.h>
gps_info_struct gps_tau1201;
uint8 gps_tau1201_buffer[100];
uint8 gps_tau1201_num; //<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
uint8 gps_tau1201_flag; //1<><31><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD> 0<><30>û<EFBFBD>вɼ<D0B2><C9BC><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><>ȡָ<C8A1><D6B8>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param num <20>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *str <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return uint8 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 get_parameter_index(uint8 num, char *str)
{
uint8 i, j = 0;
int8* temp;
uint8 len = 0, len1;
temp = strchr(str, '\n');
if(NULL != temp)
{
len = (uint8)((uint32)temp - (uint32)str + 1);
}
for(i = 0;i < len;i ++)
{
if(str[i] == ',')
{
j++;
}
if(j == num)
{
len1 = i + 1;
break;
}
}
return len1;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int str_to_int(char *buf)
{
int return_value = 0;
int dat;
char *str = buf;
while(*str != '\0')
{
dat = *str - '0';
return_value = return_value * 10 + dat;
str ++;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊint
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
int get_int_number(char *s)
{
char buf[10];
uint8 i;
int return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_int(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double str_to_double(char *buf)
{
double return_value = 0;
double dat;
int integer = 1;
char *str = buf;
int8 negative_flag = 1;
int i;
if('-' == *str)
{
negative_flag = -1;
str++;
}
while(*str != '\0')
{
dat = *str - '0';
if('.' == *str)
{
integer = 0;
i = 1;
}
else
{
if( integer == 1 )
{
return_value = return_value * 10 + dat;
}
else
{
return_value = return_value + dat / (10 * i);
i = i * 10 ;
}
}
str ++;
}
return return_value*negative_flag;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊfloat
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return float <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
float get_float_number(char *s)
{
uint8 i;
char buf[10];
float return_value;
i=get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = (float)str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊdouble
// @param *s <20>ַ<EFBFBD><D6B7><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_double_number(char *s)
{
uint8 i;
char buf[10];
double return_value;
i = get_parameter_index(1, s);
i = i - 1;
strncpy(buf, s, i);
buf[i] = 0;
return_value = str_to_double(buf);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @param *time <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void utc_to_btc(gps_time_struct *time)
{
uint8 day_num;
time->hour = time->hour + 8;
if(time->hour > 23)
{
time->hour -= 24;
time->day += 1;
if(2 == time->month)
{
day_num = 28;
if((time->year%4 == 0 && time->year%100 != 0) || time->year%400 == 0)//<2F>ж<EFBFBD><D0B6>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
{
day_num ++;//<2F><><EFBFBD><EFBFBD> 2<><32>Ϊ29<32><39>
}
}
else
{
day_num = 31;//1 3 5 7 8 10 12<31><32>Щ<EFBFBD>·<EFBFBD>Ϊ31<33><31>
if(4 == time->month || 6 == time->month || 9 == time->month || 11 == time->month )
{
day_num = 30;
}
}
if(time->day > day_num)
{
time->day = 1;
time->month++;
if(time->month > 12)
{
time->month -= 12;
time->year ++;
}
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief RMC<4D><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gnrmc_parse(char *line, gps_info_struct *gps)
{
uint8 state, temp;
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude;//γ<><CEB3>
float lati_cent_tmp, lati_second_tmp;
float long_cent_tmp, long_second_tmp;
float speed_tmp;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
gps->state = 0;
if (state == 'A') //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
return_value = 1;
gps->state = 1;
gps -> ns = buf[get_parameter_index(4, buf)];
gps -> ew = buf[get_parameter_index(6, buf)];
latitude = get_double_number(&buf[get_parameter_index(3, buf)]);
longitude = get_double_number(&buf[get_parameter_index( 5, buf)]);
gps->latitude_degree = (int)latitude / 100; //γ<><CEB3>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
lati_cent_tmp = (latitude - gps->latitude_degree * 100);
gps->latitude_cent = (int)lati_cent_tmp;
lati_second_tmp = (lati_cent_tmp - gps->latitude_cent) * 10000;
gps->latitude_second = (int)lati_second_tmp;
gps->longitude_degree = (int)longitude / 100; //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>
long_cent_tmp = (longitude - gps->longitude_degree * 100);
gps->longitude_cent = (int)long_cent_tmp;
long_second_tmp = (long_cent_tmp - gps->longitude_cent) * 10000;
gps->longitude_second = (int)long_second_tmp;
gps->latitude = gps->latitude_degree + (double)gps->latitude_cent/60 + (double)gps->latitude_second/600000;
gps->longitude = gps->longitude_degree + (double)gps->longitude_cent/60 + (double)gps->longitude_second/600000;
speed_tmp = get_float_number(&buf[get_parameter_index(7, buf)]); //<2F>ٶ<EFBFBD>(<28><><EFBFBD><EFBFBD>/Сʱ)
gps->speed = speed_tmp * 1.85f; //ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>/Сʱ
gps->direction = get_float_number(&buf[get_parameter_index(8, buf)]); //<2F>Ƕ<EFBFBD>
}
//<2F>ڶ<EFBFBD>λû<CEBB><C3BB><EFBFBD><EFBFBD>ЧǰҲ<C7B0><D2B2><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>ݵģ<DDB5><C4A3><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>ӽ<EFBFBD><D3BD><EFBFBD>
gps->time.hour = (buf[7] - '0') * 10 + (buf[8] - '0'); //ʱ<><CAB1>
gps->time.minute = (buf[9] - '0') * 10 + (buf[10] - '0');
gps->time.second = (buf[11] - '0') * 10 + (buf[12] - '0');
temp = get_parameter_index(9, buf);
gps->time.day = (buf[temp + 0] - '0') * 10 + (buf[temp + 1] - '0'); //<2F><><EFBFBD><EFBFBD>
gps->time.month = (buf[temp + 2] - '0') * 10 + (buf[temp + 3] - '0');
gps->time.year = (buf[temp + 4] - '0') * 10 + (buf[temp + 5] - '0')+2000;
utc_to_btc(&gps->time);
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GGA<47><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *line <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
// @param *gps <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return uint8 1<><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܽ<EFBFBD><DCBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint8 gps_gngga_parse(char *line, gps_info_struct *gps)
{
uint8 state;
char *buf = line;
uint8 return_value = 0;
state = buf[get_parameter_index(2, buf)];
if (state != ',')
{
gps->satellite_used = (uint8)get_int_number(&buf[get_parameter_index(7, buf)]);
gps->height = get_float_number(&buf[get_parameter_index(9, buf)]) + get_float_number(&buf[get_parameter_index(11, buf)]); //<2F>߶<EFBFBD> = <20><><EFBFBD>θ߶<CEB8> + <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ˮ׼<CBAE><D7BC><EFBFBD>ĸ߶<C4B8>
return_value = 1;
}
return return_value;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_distance(double latitude1, double longitude1, double latitude2, double longitude2)
{
const double EARTH_RADIUS = 6378137;//<2F><><EFBFBD><EFBFBD><EFBFBD>뾶(<28><>λ<EFBFBD><CEBB>m)
double rad_latitude1;
double rad_latitude2;
double rad_longitude1;
double rad_longitude2;
double distance;
double a;
double b;
rad_latitude1 = ANGLE_TO_RAD(latitude1);//<2F><><EFBFBD>ݽǶȼ<C7B6><C8BC><EFBFBD><E3BBA1>
rad_latitude2 = ANGLE_TO_RAD(latitude2);
rad_longitude1 = ANGLE_TO_RAD(longitude1);
rad_longitude2 = ANGLE_TO_RAD(longitude2);
a = rad_latitude1 - rad_latitude2;
b = rad_longitude1 - rad_longitude2;
distance = 2 * asin(sqrt(pow(sin(a/2),2) + cos(rad_latitude1)*cos(rad_latitude2)*pow(sin(b/2),2)));//google maps<70><73><EFBFBD><EFBFBD>ʵ<EFBFBD>ֵ<EFBFBD><D6B5>
distance = distance * EARTH_RADIUS;
return distance;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>λ<EFBFBD><CEBB>
// @param latitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude1 <09><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @param latitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>γ<EFBFBD><CEB3>
// @param longitude2 <09>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
// @return double <20><><EFBFBD>ط<EFBFBD>λ<EFBFBD>ǣ<EFBFBD>0<EFBFBD><30>360<36><30>
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
double get_two_points_azimuth(double latitude1, double longitude1, double latitude2, double longitude2)
{
latitude1 = ANGLE_TO_RAD(latitude1);
latitude2 = ANGLE_TO_RAD(latitude2);
longitude1 = ANGLE_TO_RAD(longitude1);
longitude2 = ANGLE_TO_RAD(longitude2);
double x = sin(longitude2 - longitude1) * cos(latitude2);
double y = cos(latitude1) * sin(latitude2) - sin(latitude1) * cos(latitude2) * cos(longitude2 - longitude1);
double angle = RAD_TO_ANGLE(atan2(x,y));
return angle>0?angle:angle+360;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <09><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_data_parse(void)
{
if(0 == strncmp((char *)&gps_tau1201_buffer[3], "RMC", 3))
{
gps_gnrmc_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
else if(0 == strncmp((char *)&gps_tau1201_buffer[3], "GGA", 3))
{
gps_gngga_parse((char *)gps_tau1201_buffer, &gps_tau1201);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53><EFBFBD>ڻص<DABB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// @since v1.0
// Sample usage: <09>˺<EFBFBD><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ڴ<EFBFBD><DAB4>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڽ<EFBFBD><DABD>е<EFBFBD><D0B5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void gps_uart_callback(void)
{
uint8 dat;
uart_query(GPS_TAU1201_UART, &dat);
if('$' == dat || ('$' != gps_tau1201_buffer[0]))//֡ͷУ<CDB7><D0A3>
{
gps_tau1201_num = 0;
}
gps_tau1201_buffer[gps_tau1201_num++] = dat;
if('\n' == dat)
{
//<2F>յ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_buffer[gps_tau1201_num] = 0; //<2F><>ĩβ<C4A9><CEB2><EFBFBD><EFBFBD>\0
gps_data_parse(); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
gps_tau1201_flag = 1;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief GPS<50><53>ʼ<EFBFBD><CABC>
// @param void
// @return void
// @since v1.0
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void gps_init(void)
{
const uint8 set_rate[] = {0xF1, 0xD9, 0x06, 0x42, 0x14, 0x00, 0x00, 0x0A, 0x05, 0x00, 0x64, 0x00, 0x00, 0x00, 0x60, 0xEA, 0x00, 0x00, 0xD0, 0x07, 0x00, 0x00, 0xC8, 0x00, 0x00, 0x00, 0xB8, 0xED};
const uint8 open_gga[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x00, 0x01, 0xFB, 0x10};
const uint8 open_rmc[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x05, 0x01, 0x00, 0x1A};
const uint8 close_gll[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x01, 0x00, 0xFB, 0x11};
const uint8 close_gsa[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x02, 0x00, 0xFC, 0x13};
const uint8 close_grs[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x03, 0x00, 0xFD, 0x15};
const uint8 close_gsv[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x04, 0x00, 0xFE, 0x17};
const uint8 close_vtg[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x06, 0x00, 0x00, 0x1B};
const uint8 close_zda[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x07, 0x00, 0x01, 0x1D};
const uint8 close_gst[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x08, 0x00, 0x02, 0x1F};
const uint8 close_txt[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x40, 0x00, 0x3A, 0x8F};
const uint8 close_txt_ant[] = {0xF1, 0xD9, 0x06, 0x01, 0x03, 0x00, 0xF0, 0x20, 0x00, 0x1A, 0x4F};
gps_type = GPS_TAU1201;
enableInterrupts();
systick_delay_ms(STM0, 500);//<2F>ȴ<EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
uart_init(GPS_TAU1201_UART, 115200, GPS_TAU1201_RX, GPS_TAU1201_TX);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)set_rate, sizeof(set_rate));//<2F><><EFBFBD><EFBFBD>GPS<50><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ10hz<68><7A><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ1hz
systick_delay_ms(STM0, 200);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_rmc, sizeof(open_rmc));//<2F><><EFBFBD><EFBFBD>rmc<6D><63><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)open_gga, sizeof(open_gga));//<2F><><EFBFBD><EFBFBD>gga<67><61><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gll, sizeof(close_gll));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsa, sizeof(close_gsa));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_grs, sizeof(close_grs));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gsv, sizeof(close_gsv));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_vtg, sizeof(close_vtg));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_zda, sizeof(close_zda));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_gst, sizeof(close_gst));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt, sizeof(close_txt));
systick_delay_ms(STM0, 50);
uart_putbuff(GPS_TAU1201_UART, (uint8 *)close_txt_ant, sizeof(close_txt_ant));
systick_delay_ms(STM0, 50);
disableInterrupts();
}

View File

@@ -0,0 +1,107 @@
/*********************************************************************************************************************
* COPYRIGHT NOTICE
* Copyright (c) 2021,<2C><><EFBFBD>ɿƼ<C9BF>
* All rights reserved.
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>QQȺ<51><C8BA>һȺ<D2BB><C8BA>179029047(<28><><EFBFBD><EFBFBD>) <20><>Ⱥ<EFBFBD><C8BA>244861897
*
* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݰ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>У<EFBFBD>δ<EFBFBD><CEB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5>;<EFBFBD><CDBE>
* <20><>ӭ<EFBFBD><D3AD>λʹ<CEBB>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EBB1A3><EFBFBD><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC>İ<EFBFBD>Ȩ<EFBFBD><C8A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*
* @file SEEKFREE_GPS_TAU1201.c
* @company <09>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD>ɿƼ<C9BF><C6BC><EFBFBD><EFBFBD>޹<EFBFBD>˾
* @author <09><><EFBFBD>ɿƼ<C9BF>(QQ3184284598)
* @version <09>鿴doc<6F><63>version<6F>ļ<EFBFBD> <20>汾˵<E6B1BE><CBB5>
* @Software IAR 8.32.4 or MDK 5.28
* @Taobao https://seekfree.taobao.com/
* @date 2021-12-30
* @note
* <09><><EFBFBD>߶<EFBFBD><DFB6>
* ------------------------------------
* ģ<><C4A3><EFBFBD>ܽ<EFBFBD> <09><>Ƭ<EFBFBD><C6AC><EFBFBD>ܽ<EFBFBD>
* RX <09>鿴 GPS_TAU1201_RX<52><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* TX <20>鿴 GPS_TAU1201_TX<54><EFBFBD><EAB6A8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* GND <09><>Դ<EFBFBD><D4B4>
* VCC 5V<35><56>Դ
* ------------------------------------
********************************************************************************************************************/
#ifndef _SEEKFREE_GPS_TAU1201_h
#define _SEEKFREE_GPS_TAU1201_h
#include "common.h"
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
#define GPS_TAU1201_UART UART_3
#define GPS_TAU1201_RX UART3_TX_P15_6 // GPS RX<52><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>
#define GPS_TAU1201_TX UART3_RX_P15_7 // GPS TX<54><58><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ANGLE_TO_RAD(X) (X * PI / 180.0)//<2F>Ƕ<EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
#define RAD_TO_ANGLE(X) (X * 180.0 / PI)//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD>Ƕ<EFBFBD>
#define PI 3.1415926535898
typedef struct{
uint16 year;
uint8 month;
uint8 day;
uint8 hour;
uint8 minute;
uint8 second;
}gps_time_struct;
typedef struct{
gps_time_struct time; //ʱ<><CAB1>
uint8 state; //<2F><>Ч״̬ 1<><31><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч 0<><30><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>Ч
uint16 latitude_degree; //<2F><>
uint16 latitude_cent; //<2F><>
uint16 latitude_second; //<2F><>
uint16 longitude_degree; //<2F><>
uint16 longitude_cent; //<2F><>
uint16 longitude_second; //<2F><>
double latitude; //<2F><><EFBFBD><EFBFBD>
double longitude; //γ<><CEB3>
int8 ns; //γ<>Ȱ<EFBFBD><C8B0><EFBFBD> N<><4E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򣩻<EFBFBD> S<><53><EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD>
int8 ew; //<2F><><EFBFBD>Ȱ<EFBFBD><C8B0><EFBFBD> E<><45><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> W<><57><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float speed; //<2F>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD>/ÿСʱ<D0A1><CAB1>
float direction; //<2F><><EFBFBD><EFBFBD><E6BABD><EFBFBD><EFBFBD>000.0~359.9 <20>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD><E6B1B1>Ϊ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD>׼<EFBFBD><D7BC>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>GNGGA<47><41><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
uint8 satellite_used; //<2F><><EFBFBD>ڶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
float height; //<2F>߶<EFBFBD>
}gps_info_struct;
extern gps_info_struct gps_tau1201;
extern uint8 gps_tau1201_flag;
double get_two_points_distance(double lat1, double lng1, double lat2, double lng2);
double get_two_points_azimuth(double lat1, double lon1, double lat2, double lon2);
void gps_uart_callback(void);
void gps_init(void);
#endif

View File

@@ -49,6 +49,7 @@ uint8 receive_num = 0;
vuint8 uart_receive_flag;
uint8 link_list_num;
int16 timeout = MT9V03X_INIT_TIMEOUT;
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int16 MT9V03X_CFG[CONFIG_FINISH][2]=
@@ -62,7 +63,8 @@ int16 MT9V03X_CFG[CONFIG_FINISH][2]=
{LR_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ188 376 752ʱ<32>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{UD_OFFSET, 0}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>ֵ <20><>ƫ<EFBFBD><C6AB> <20><>Ϊ120 240 480ʱ<30>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> <20><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD>ݺ<EFBFBD><DDBA><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD>ƣ<EFBFBD><C6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ü<EFBFBD><C3BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
{GAIN, 32}, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ16-64 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ع<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>̶<EFBFBD><CCB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>¸ı<C2B8>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̶<EFBFBD>
{PCLK_MODE, 0}, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>MT9V034 V2.0<EFBFBD>Լ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϰ汾֧<EFBFBD>ָ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> PCLKģʽ Ĭ<>ϣ<EFBFBD>0 <20><>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>0 1<><31> 0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źţ<C5BA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>źš<C5BA><><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>CH32V307<30><37>DVP<56>ӿڻ<D3BF>STM32<33><32>DCMI<4D>ӿڲɼ<DAB2><C9BC><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>Ϊ1)
{INIT, 0} //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC>ʼ<EFBFBD><CABC>
};
@@ -133,10 +135,20 @@ void set_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
systick_delay_ms(STM0, 2);
}
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ʼ<EFBFBD><CABC><EFBFBD>ɹ<EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
while((0xff != receive[1]) || (0xff != receive[2]));
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(((0xff != receive[1]) || (0xff != receive[2])) && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
//<2F><><EFBFBD>ϲ<EFBFBD><CFB2>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E1B1A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>51<35><31>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>eeprom<6F><6D>
//<2F><><EFBFBD><EFBFBD>set_exposure_time<6D><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ع<EFBFBD><D8B9><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><E6B4A2>eeprom<6F><6D>
}
@@ -165,8 +177,12 @@ void get_config(UARTN_enum uartn, int16 buff[CONFIG_FINISH-1][2])
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
buff[i][1] = receive[1]<<8 | receive[2];
@@ -192,8 +208,12 @@ uint16 get_version(UARTN_enum uartn)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
return ((uint16)(receive[1]<<8) | receive[2]);
@@ -220,8 +240,12 @@ uint16 set_exposure_time(UARTN_enum uartn, uint16 light)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -261,8 +285,12 @@ uint16 set_mt9v03x_reg(UARTN_enum uartn, uint8 addr, uint16 data)
uart_putbuff(uartn,send_buffer,4);
timeout = MT9V03X_INIT_TIMEOUT;
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ܻش<DCBB><D8B4><EFBFBD><EFBFBD><EFBFBD>
while(!uart_receive_flag);
while(!uart_receive_flag && timeout-- > 0)
{
systick_delay_ms(STM0, 1);
}
uart_receive_flag = 0;
temp = receive[1]<<8 | receive[2];
@@ -307,16 +335,15 @@ void mt9v03x_init(void)
gpio_init((PIN_enum)(MT9V03X_DATA_PIN+i), GPI, 0, PULLUP);
}
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, FALLING, MT9V03X_W*MT9V03X_H);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5>300M <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪFALLING
eru_init(MT9V03X_VSYNC_PIN, FALLING); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>½<EFBFBD><C2BD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD>ж<EFBFBD>
restoreInterrupts(interrupt_state);
}
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
uint8 mt9v03x_dma_init_flag; //<2F><><EFBFBD>³<EFBFBD>ʼ<EFBFBD><CABC>DMA<4D>ı<EFBFBD>־λ
uint8 mt9v03x_finish_flag = 0; //һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ɱ<EFBFBD>־λ
uint8 mt9v03x_dma_int_num; //<2F><>ǰDMA<4D>жϴ<D0B6><CFB4><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -328,14 +355,7 @@ void mt9v03x_vsync(void)
{
CLEAR_GPIO_FLAG(MT9V03X_VSYNC_PIN);
mt9v03x_dma_int_num = 0;
if(mt9v03x_dma_init_flag)
{
mt9v03x_dma_init_flag = 0;
IfxDma_resetChannel(&MODULE_DMA, MT9V03X_DMA_CH);
link_list_num = eru_dma_init(MT9V03X_DMA_CH, GET_PORT_IN_ADDR(MT9V03X_DATA_PIN), camera_buffer_addr, MT9V03X_PCLK_PIN, RISING, MT9V03X_W*MT9V03X_H);
dma_start(MT9V03X_DMA_CH);
}
else
if(!mt9v03x_finish_flag)//<2F>鿴ͼ<E9BFB4><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD><CFA3><EFBFBD><EFBFBD><EFBFBD>δʹ<CEB4><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>򲻿<EFBFBD>ʼ<EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>ʳ<EFBFBD>ͻ
{
if(1 == link_list_num)
{
@@ -343,10 +363,11 @@ void mt9v03x_vsync(void)
DMA_SET_DESTINATION(MT9V03X_DMA_CH, camera_buffer_addr);
}
dma_start(MT9V03X_DMA_CH);
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief MT9V03X<33><58><EFBFBD><EFBFBD>ͷDMA<4D><41><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
// @param NULL
@@ -357,25 +378,14 @@ void mt9v03x_vsync(void)
void mt9v03x_dma(void)
{
CLEAR_DMA_FLAG(MT9V03X_DMA_CH);
mt9v03x_dma_int_num++;
if(IfxDma_getChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH))
{//ͼ<><CDBC><EFBFBD>д<EFBFBD>λ
mt9v03x_finish_flag = 0;
dma_stop(MT9V03X_DMA_CH);
IfxDma_clearChannelTransactionRequestLost(&MODULE_DMA, MT9V03X_DMA_CH);
mt9v03x_dma_init_flag = 1;
}
else
if(mt9v03x_dma_int_num >= link_list_num)
{
mt9v03x_dma_int_num++;
if(mt9v03x_dma_int_num >= link_list_num)
{
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
mt9v03x_dma_int_num = 0;
mt9v03x_finish_flag = 1;//һ<><D2BB>ͼ<EFBFBD><CDBC><EFBFBD>Ӳɼ<D3B2><C9BC><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ3.8MS<EFBFBD><EFBFBD><EFBFBD><EFBFBD>(50FPS<50><53>188*120<32>ֱ<EFBFBD><D6B1><EFBFBD>)
dma_stop(MT9V03X_DMA_CH);
}
}

View File

@@ -46,6 +46,8 @@
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
#define MT9V03X_INIT_TIMEOUT 0x0080
//--------------------------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//--------------------------------------------------------------------------------------------------
@@ -76,6 +78,7 @@ typedef enum
LR_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UD_OFFSET, //ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GAIN, //ͼ<><CDBC>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
PCLK_MODE,
CONFIG_FINISH, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>ռλ<D5BC><CEBB><EFBFBD><EFBFBD>
COLOR_GET_WHO_AM_I = 0xEF,

View File

@@ -211,6 +211,10 @@ IFX_INTERRUPT(uart3_rx_isr, 0, UART3_RX_INT_PRIO)
{
enableInterrupts();//<2F><><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>Ƕ<EFBFBD><C7B6>
IfxAsclin_Asc_isrReceive(&uart3_handle);
if(GPS_TAU1201 == gps_type)
{
gps_uart_callback();
}
}
IFX_INTERRUPT(uart3_er_isr, 0, UART3_ER_INT_PRIO)
{

View File

@@ -2350,5 +2350,7 @@
</project-mappings>
</storageModule>
<storageModule moduleId="refreshScope"/>
</cproject>

View File

@@ -1,5 +1,10 @@
V1.2.6
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>÷<EFBFBD>ʽ
<20>޸<EFBFBD><DEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ײ㣬<D7B2><E3A3AC><EFBFBD>Ӷ<EFBFBD>V2.1<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCLK<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<20><><EFBFBD><EFBFBD>˫ƵGPS<50><53>λģ<CEBB><C4A3><EFBFBD>ĵײ<C4B5><D7B2><EFBFBD><EFBFBD><EFBFBD>
V1.2.5
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
<EFBFBD>Ż<EFBFBD>Ӳ<EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SPI<EFBFBD><EFBFBD>Ļˢ<EFBFBD><EFBFBD><EFBFBD>ٶȣ<EFBFBD>IPS1.14<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>188*120<32>ɴ<EFBFBD>31֡<31><D6A1><EFBFBD><EFBFBD>ʾ160*120<32>ɴ<EFBFBD>37֡<37><D6A1>TFT1.8<EFBFBD><EFBFBD>Ļ<EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>160*120<32>ɴ<EFBFBD>37֡<37><D6A1>
V1.2.4
<09>޸<EFBFBD>systick_delay_ms<6D><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1><EFBFBD>ϳ<EFBFBD><CFB3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<CAB1><EFBFBD><E4B2BB>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -28,6 +28,7 @@ CAMERA_TYPE_enum camera_type; //
uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
WIRELESS_TYPE_enum wireless_type;//<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
GPS_TYPE_enum gps_type; //gps<70><73><EFBFBD><EFBFBD>
IFX_ALIGN(4) IfxCpu_syncEvent g_cpuSyncEvent = 0;//<2F>¼<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>

View File

@@ -119,6 +119,11 @@ typedef enum //
WIRELESS_CH9141, //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>
}WIRELESS_TYPE_enum;
typedef enum //<2F><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>
{
GPS_TAU1201 = 1, //<2F><><EFBFBD>󱱶<EFBFBD>GPSģ<53><C4A3>
}GPS_TYPE_enum;
#include <math.h>
#include <string.h>
#include "IfxCpu.h"
@@ -127,7 +132,7 @@ extern CAMERA_TYPE_enum camera_type; //
extern uint8 *camera_buffer_addr; //<2F><><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ
extern WIRELESS_TYPE_enum wireless_type;
extern GPS_TYPE_enum gps_type;
extern IfxCpu_syncEvent g_cpuSyncEvent;
void get_clk(void);

View File

@@ -66,6 +66,7 @@
#include "SEEKFREE_RDA5807.h"
#include "SEEKFREE_7725_UART.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
#include "SEEKFREE_GPS_TAU1201.h"
#endif

View File

@@ -31,479 +31,248 @@
#include "zf_assert.h"
#include "SEEKFREE_BLUETOOTH_CH9141.h"
uint8 uart_flag;
uint8 uart_data;
static fifo_struct bluetooth_ch9141_fifo;
static uint8 bluetooth_ch9141_buffer[BLUETOOTH_CH9141_BUFFER_SIZE]; // <20><><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode = 0; //0:<3A><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ 1:ATģʽ 2:ģ<>鸴λ<E9B8B4><CEBB>
vuint8 at_mode_num; //atģʽʱ<CABD><CAB1><EFBFBD><EFBFBD>ָʾ<D6B8><CABE><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>
vuint8 at_mode_data[30]; //<2F><><EFBFBD><EFBFBD>at<61><74><EFBFBD><EFBFBD><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD>
vuint8 at_mode_cmd_flag; //OKӦ<4B><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ճɹ<D5B3><C9B9>ı<EFBFBD>־λ
uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
uint8 bluetooth_ch9141_rx_buffer;
void bluetooth_ch9141_check_response(void);
static uint8 bluetooth_ch9141_data;
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD>8<EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
// @brief FIFO <20><>ʼ<EFBFBD><EFBFBD> <20><><EFBFBD>ض<EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *buffer_addr Ҫ<><D2AA><EFBFBD>صĻ<D8B5><C4BB><EFBFBD><EFBFBD><EFBFBD>
// @param size <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback()
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size)
{
while(uart_query(BLUETOOTH_CH9141_UART, &bluetooth_ch9141_rx_buffer))
if(buffer_addr == NULL)
return FIFO_BUFFER_NULL;
fifo->buffer = buffer_addr;
fifo->head = 0;
fifo->end = 0;
fifo->size = size;
fifo->max = size;
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO ͷָ<CDB7><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_head_offset (fifo_struct *fifo, uint32 offset)
{
fifo->head += offset;
while(fifo->max <= fifo->head) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
if(1 == at_mode)
fifo->head -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO βָ<CEB2><D6B8>λ<EFBFBD><CEBB>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param offset ƫ<><C6AB><EFBFBD><EFBFBD>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_end_offset (fifo_struct *fifo, uint32 offset)
{
fifo->end += offset;
while(fifo->max <= fifo->end) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>С ֱ<><D6B1>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD>󻺳<EFBFBD><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD>С
{
fifo->end -= fifo->max;
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void fifo_clear (fifo_struct *fifo)
{
fifo->head = 0;
fifo->end = 0;
fifo->size = fifo->max;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief FIFO <20><>ѯ<EFBFBD><D1AF>ǰ<EFBFBD><C7B0><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @return void
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 fifo_used (fifo_struct *fifo)
{
return (fifo->max - fifo->size);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><> FIFO <20><>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *dat <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param length <20><>Ҫд<D2AA><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_write_buffer(&fifo,data,32)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length)
{
uint32 temp_length;
if(length < fifo->size) // ʣ<><CAA3><EFBFBD>ռ<EFBFBD><D5BC>㹻װ<E3B9BB>±<EFBFBD><C2B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
temp_length = fifo->max - fifo->head; // <20><><EFBFBD><EFBFBD>ͷָ<CDB7><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(length > temp_length) // <20><><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ȳ<EFBFBD><C8B2><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֶβ<D6B6><CEB2><EFBFBD>
{
//<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ <20><><EFBFBD><EFBFBD>Ӧ<EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_data[at_mode_num++] = bluetooth_ch9141_rx_buffer;
bluetooth_ch9141_check_response();
}
else if(2 == at_mode)
{
//ģ<><C4A3><EFBFBD><EFBFBD><EFBFBD>ڸ<EFBFBD>λ<EFBFBD><CEBB> <20>˴<EFBFBD>if<69><66><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD>Ҫ<EFBFBD>Ķ<EFBFBD>
at_mode_num++;
memcpy(&fifo->buffer[fifo->head], dat, temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
dat += temp_length; // <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB>
memcpy(&fifo->buffer[fifo->head], dat, length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_head_offset(fifo, length - temp_length); // ͷָ<CDB7><D6B8>ƫ<EFBFBD><C6AB>
}
else
{
//͸<><CDB8>ģʽ <20>û<EFBFBD><C3BB>ڴ˴<DAB4><CBB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ֽں<D6BD><DABA><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˴<EFBFBD><CBB4><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>ڴ˴<DAB4><CBB4><EFBFBD>ȡbluetooth_ch9141_rx_buffer<65><72><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_flag = 1;
uart_data = bluetooth_ch9141_rx_buffer;
memcpy(&fifo->buffer[fifo->head], dat, length); // һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD>
fifo_head_offset(fifo, length); // ͷָ<EFBFBD><EFBFBD>ƫ<EFBFBD><EFBFBD>
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>OKӦ<4B><D3A6><EFBFBD>ź<EFBFBD>
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_check_response(void)
{
if(4 <= at_mode_num)
{
if(0 == strncmp("OK\r\n", (int8 *)&at_mode_data[at_mode_num-4], 4))
{
at_mode_cmd_flag = 1;
}
}
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB>û<EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *str <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command(const int8 *str)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, str);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD><E9B7A2>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD><D0B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
// @param *cmd <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *data <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_send_at_command_parameter(const int8 *cmd, const int8 *data)
{
at_mode_num = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putstr(BLUETOOTH_CH9141_UART, "AT+");
uart_putstr(BLUETOOTH_CH9141_UART, cmd);
uart_putstr(BLUETOOTH_CH9141_UART, "=");
uart_putstr(BLUETOOTH_CH9141_UART, data);
uart_putstr(BLUETOOTH_CH9141_UART, "\r\n");
//<2F>ȴ<EFBFBD><C8B4>յ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>ź<EFBFBD>
while(!at_mode_cmd_flag);
at_mode_cmd_flag = 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_enter_at_mode(void)
{
systick_delay_ms(STM0, 550); //<2F><><EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>Ҫ<EFBFBD><D2AA>֤ģ<D6A4><C4A3><EFBFBD><EFBFBD>550ms<6D><73>û<EFBFBD>н<EFBFBD><D0BD>չ<EFBFBD><D5B9>κ<EFBFBD><CEBA><EFBFBD><EFBFBD><EFBFBD>
at_mode = 1; //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_send_at_command("AT...");
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>˳<EFBFBD>ATģʽ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_exit_at_mode(void)
{
bluetooth_ch9141_send_at_command("AT+EXIT");
at_mode = 0; //<2F><><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
systick_delay_ms(STM0, 300); //<2F>ȴ<EFBFBD><C8B4>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>ATģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD>鸴λ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_reset(void)
{
bluetooth_ch9141_send_at_command("AT+RESET");
at_mode = 2; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>
at_mode_num = 0;
while(7 > at_mode_num); //<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>ɸ<EFBFBD>λ
at_mode = 0; //<2F><>λ֮<CEBB><D6AE>ģ<EFBFBD><C4A3><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>͸<EFBFBD><CDB8>ģʽ
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
// @param NULL
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_get_mac_address(void)
{
bluetooth_ch9141_send_at_command("AT+MAC?");
//mac<61><63>ַΪС<CEAA>θ<EFBFBD>ʽ<EFBFBD><CABD>mac_address[0]<5D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>λ
memcpy(mac_address, (uint8 *)at_mode_data, 17);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9><EFBFBD>
// @param tx_power <20><><EFBFBD>÷<EFBFBD><C3B7>͹<EFBFBD><CDB9>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_TX_POWEER_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_tx_power(CH9141_TX_POWEER_enum tx_power)
{
int8 tx_power_data;
tx_power_data = (uint8)tx_power + '0';
bluetooth_ch9141_send_at_command_parameter("TPL", &tx_power_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_mode(CH9141_MODE_enum mode)
{
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡ״̬
// @param mode ģʽ<C4A3><CABD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD>鿴CH9141_MODE_enumö<6D>ٳ<EFBFBD>Ա
// @return CH9141_STATUS_enum <20><><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
CH9141_STATUS_enum bluetooth_ch9141_get_status(CH9141_MODE_enum mode)
{
CH9141_STATUS_enum ch9141_status;
int8 mode_data;
mode_data = (uint8)mode + '0';
bluetooth_ch9141_send_at_command_parameter("BLEMODE", &mode_data);
bluetooth_ch9141_send_at_command("AT+BLESTA?");
ch9141_status = (at_mode_data[0] - '0') * 10 + (at_mode_data[1] - '0');
if(SLAVE_MODE == mode)
{
ch9141_status += SLAVE_NO_INIT;
}
return ch9141_status;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8><EFBFBD><EFBFBD>
// @param *str <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>Ƴ<EFBFBD><C6B3>Ȳ<EFBFBD><C8B2>ܳ<EFBFBD><DCB3><EFBFBD>18<31><38><EFBFBD>ַ<EFBFBD> <20><>ֻ<EFBFBD><D6BB>ΪӢ<CEAA><D3A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_name(const int8 *str)
{
bluetooth_ch9141_send_at_command_parameter("NAME", str);
bluetooth_ch9141_send_at_command_parameter("PNAME", str);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param enable ʹ<><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD>룬1<EBA3AC><31>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӱ<EFBFBD><D3B1>
// @param *password <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD> <20><><EFBFBD><EFBFBD>Ϊ6<CEAA><36><EFBFBD>ַ<EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_set_password(uint8 enable, const int8 *password)
{
if(0 == enable)
{
//<2F>ر<EFBFBD><D8B1><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_send_at_command_parameter("PASEN", "OFF");
fifo->size -= length; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʣ<EFBFBD><EFBFBD>ȼ<EFBFBD>С
}
else
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EBB2A2><CAB9>
bluetooth_ch9141_send_at_command_parameter("PASEN", "ON");
bluetooth_ch9141_send_at_command_parameter("PASS", password);
return FIFO_SPACE_NO_ENOUGH;
}
return FIFO_SUCCESS;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>MAC<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *mac_and_password <20><>Ҫ<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><EFBFBD>豸mac<EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// @brief <20><> FIFO <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @param *fifo FIFO <20><><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
// @param *dat Ŀ<><EFBFBD><EABBBA><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
// @param *length <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD> <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>
// @param flag <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬ <20><>ѡ<EFBFBD><D1A1><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ն<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return fifo_state_enum <20><><EFBFBD><EFBFBD>״̬
// Sample usage: if(fifo_read_buffer(&fifo,data,32,FIFO_READ_ONLY)!=FIFO_SUCCESS) while(1);
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_connect(const int8 *mac_and_password)
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag)
{
bluetooth_ch9141_send_at_command_parameter("CONN", mac_and_password);
}
uint8 data_check = 0;
uint32 temp_length;
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><EFBFBD>úú<C3BA><C3BA><EFBFBD>ÿ<EFBFBD>ο<EFBFBD><CEBF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>
// @param *mac_and_password <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ӵ<EFBFBD><D3B5>豸mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// @return void
// @since v1.0
// Sample usage:
// @note bluetooth_ch9141_default_connect("58:B7:33:E4:C2:84,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
// <20><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB>鿴CH9141<34><31>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>CH9141<34><31><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD>
// <20><>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <20><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:67<36><37><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_default_connect("67:65:64:63:62:61,000000");
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_default_connect(const int8 *mac_and_password)
{
bluetooth_ch9141_send_at_command_parameter("CONADD", mac_and_password);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ȡrssi(<28>ź<EFBFBD>ǿ<EFBFBD><C7BF>)
// @param void
// @return int8 <20><><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD><C7BF>0<EFBFBD><30>-127
// @since v1.0
// Sample usage:
// @note <20><><EFBFBD>ô˺<C3B4><CBBA><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CMD<4D><44><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ATģʽ
// <20><>Ҫ<EFBFBD>ر<EFBFBD>ע<EFBFBD><D7A2>bluetooth_ch9141_enter_at_mode<64><65><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>500ms<6D><73><EFBFBD><EFBFBD>ʱ
//-------------------------------------------------------------------------------------------------------------------
int16 bluetooth_ch9141_get_rssi(void)
{
uint8 i;
size_t length;
int16 rssi;
bluetooth_ch9141_send_at_command_parameter("RSSI", "ON,0");
length = strlen((int8 *)at_mode_data);
length -= 12;//<2F><><EFBFBD><EFBFBD>RSSI <20>ж<EFBFBD><D0B6><EFBFBD>λ
rssi = 0;
for(i=0; i<length; i++)
if(*length > fifo_used(fifo))
{
rssi = rssi*10 + (at_mode_data[0] - '0');
*length = (fifo->max - fifo->size); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
data_check = 1; // <20><>־<EFBFBD><D6BE><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD>
}
return -rssi;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><EFBFBD><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// @since v1.0
// Sample usage:
// @note
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len)
{
while(len)
temp_length = fifo->max - fifo->end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ж<EFBFBD><D0B6>ٿռ<D9BF>
if(*length <= temp_length) // <20>һ<E3B9BB><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
//<2F><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD> RTSΪ<53>߱<EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޷<EFBFBD><DEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽһ<CABD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵȴ<D6B5>
if(gpio_get(BLUETOOTH_CH9141_RTS_PIN))
if(NULL != dat) memcpy(dat, &fifo->buffer[fifo->end], *length); // һ<><D2BB><EFBFBD>Զ<EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
if(NULL != dat)
{
break;
memcpy(dat, &fifo->buffer[fifo->end], temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
memcpy(&dat[temp_length], &fifo->buffer[0], *length - temp_length); // <20><><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//RTSΪ<53>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽RTSΪ<53><CEAA><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>RTSΪ<53><CEAA>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//while(gpio_get(BLUETOOTH_CH9141_RTS_PIN)); //<2F><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_putchar(BLUETOOTH_CH9141_UART, *buff);
buff++;
len--;
}
return len;
if(flag == FIFO_READ_AND_CLEAN) // <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD> FIFO ״̬
{
fifo_end_offset(fifo, *length); // <20>ƶ<EFBFBD> FIFO ͷָ<CDB7><D6B8>
fifo->size += *length;
}
return (data_check?FIFO_DATA_NO_ENOUGH:FIFO_SUCCESS);
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD><EFBFBD><EFBFBD>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
// @param void
// @return void
// Sample usage:
// @note <20>ú<EFBFBD><C3BA><EFBFBD><EFBFBD><EFBFBD>ISR<53>ļ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>жϳ<D0B6><CFB3>򱻵<EFBFBD><F2B1BBB5><EFBFBD>
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_uart_callback (void)
{
// <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߴ<EFBFBD><DFB4>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ձ<EFBFBD>־
uart_query(BLUETOOTH_CH9141_INDEX, &bluetooth_ch9141_data);
fifo_write_buffer(&bluetooth_ch9141_fifo, &bluetooth_ch9141_data, 1); // <20><><EFBFBD><EFBFBD> FIFO
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
// @param mode <20><><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return void
// @since v1.0
// Sample usage:
// @note
// <09><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
// <09><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
// bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
// 58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <09>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
// @param mode <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ MASTER_MODE(<28><><EFBFBD><EFBFBD>)<29><><EFBFBD><EFBFBD>SLAVE_MODE(<28>ӻ<EFBFBD>)
// @return uint8 <20><>ʼ<EFBFBD><CABC>״̬ 0-<2D>ɹ<EFBFBD> 1-ʧ<><CAA7>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password)
uint8 bluetooth_ch9141_init (void)
{
int8 *str = salve_mac_password;
if(str != NULL)
{
while(*str)
{
if(*str++ == 0x20)
{
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>пո<D0BF>
ZF_ASSERT(0);
return;
}
}
}
boolean irq_status;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200<30><30>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
wireless_type = WIRELESS_CH9141;
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 0, PULLDOWN);
//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init (BLUETOOTH_CH9141_UART, BLUETOOTH_CH9141_UART_BAUD, BLUETOOTH_CH9141_UART_TX, BLUETOOTH_CH9141_UART_RX); //<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
irq_status = areInterruptsEnabled();
enableInterrupts();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD>ӳɹ<D3B3><C9B9>ͱ<EFBFBD><CDB1><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5>ó<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܳɹ<DCB3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ϵ<EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><EFBFBD>ϵ磬Ȼ<E7A3AC><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
if(MASTER_MODE == mode)
{
//1.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>mac<61><63>ַ<EFBFBD>Ĵӻ<C4B4><D3BB>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
//===================<3D>ر<EFBFBD>ע<EFBFBD><D7A2>==================
//<2F><><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD>mac<61><63>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>뽫mac<61><63><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
//<2F><><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E9BFB4><EFBFBD><EFBFBD>mac<61><63>ַΪ61:62:63:64:65:66<36><36><EFBFBD><EFBFBD>ʹ<EFBFBD>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>ʱ<EFBFBD><CAB1>Ӧ<EFBFBD><D3A6>д
//bluetooth_ch9141_connect("66:65:64:63:62:61,000000");
//58:B7:33:E4:C2:84Ϊmac<61><63>ַ ,Ϊ<>ָ<EFBFBD><D6B8><EFBFBD> 000000Ϊ<30>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ӻ<EFBFBD>MAC<41><43>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//int8 salve_mac_password[] = "80:90:2C:E4:C2:84,000000";
bluetooth_ch9141_default_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>´β<C2B4><CEB2><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>Ӵӻ<D3B4>
bluetooth_ch9141_connect(salve_mac_password); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>õĴӻ<C4B4><D3BB><EFBFBD>ַ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(MASTER_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
else if(SLAVE_MODE == mode)
{
//2.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
bluetooth_ch9141_set_mode(mode); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
bluetooth_ch9141_get_mac_address();//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>MAC<41><43>ַ
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ֮<CABD><D6AE><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>λȻ<CEBB><C8BB><EFBFBD>ٴν<D9B4><CEBD><EFBFBD>ATģʽ<C4A3><CABD><EFBFBD>ܼ<EFBFBD><DCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>ò<EFBFBD><C3B2>ɹ<EFBFBD>
bluetooth_ch9141_set_tx_power(TX_POWER_4DB);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>
bluetooth_ch9141_set_name("ble");
bluetooth_ch9141_set_password(1, "000000"); //000000Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC>޸<EFBFBD>
bluetooth_ch9141_reset(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɺ<EFBFBD><C9BA><EFBFBD>Ҫ<EFBFBD><D2AA>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD>òŻ<C3B2><C5BB><EFBFBD>Ч
bluetooth_ch9141_enter_at_mode(); //<2F><><EFBFBD><EFBFBD>ATģʽ
//<2F>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>ӳɹ<D3B3>
while(SLAVE_CONNECTED != bluetooth_ch9141_get_status(mode));
bluetooth_ch9141_exit_at_mode(); //<2F>˳<EFBFBD>ATģʽ
}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD>ǿ<EFBFBD>ȿ<EFBFBD><C8BF>԰<EFBFBD><D4B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//bluetooth_ch9141_enter_at_mode();
//int16 rssi = bluetooth_ch9141_get_rssi();
disableInterrupts();
restoreInterrupts(irq_status);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>õIJ<C3B5><C4B2><EFBFBD><EFBFBD><EFBFBD>Ϊ115200 Ϊ<><CEAA><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>޸<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
fifo_init(&bluetooth_ch9141_fifo, bluetooth_ch9141_buffer, BLUETOOTH_CH9141_BUFFER_SIZE);
gpio_init(BLUETOOTH_CH9141_RTS_PIN, GPI, 1, PULLUP); // <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
uart_init(BLUETOOTH_CH9141_INDEX, BLUETOOTH_CH9141_BUAD_RATE, BLUETOOTH_CH9141_RX_PIN, BLUETOOTH_CH9141_TX_PIN);
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><><EFBFBD>ͺ<EFBFBD><CDBA><EFBFBD>
// @param buff <20><>Ҫ<EFBFBD><D2AA><EFBFBD>͵<EFBFBD><CDB5><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD>ͳ<EFBFBD><CDB3><EFBFBD>
// @return uint32 ʣ<><CAA3>δ<EFBFBD><CEB4><EFBFBD>͵<EFBFBD><CDB5>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len)
{
uint16 time_count = 0;
while(len > 30)
{
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, 30);
buff += 30; // <20><>ַƫ<D6B7><C6AB>
len -= 30; // <20><><EFBFBD><EFBFBD>
}
time_count = 0;
while(gpio_get(BLUETOOTH_CH9141_RTS_PIN) && time_count++ < BLUETOOTH_CH9141_TIMEOUT_COUNT) // <20><><EFBFBD><EFBFBD>RTSΪ<53>͵<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
systick_delay_ms(STM0, 1);
if(time_count >= BLUETOOTH_CH9141_TIMEOUT_COUNT)
return len; // ģ<><C4A3>æ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>while<6C>ȴ<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ú<EFBFBD><C3BA><EFBFBD>ע<EFBFBD>͵<EFBFBD>while<6C>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6BBBB>if<69><66><EFBFBD><EFBFBD>
uart_putbuff(BLUETOOTH_CH9141_INDEX, buff, len); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
return 0;
}
//-------------------------------------------------------------------------------------------------------------------
// @brief <20><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
// @param buff <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
// @param len <20><><EFBFBD><EFBFBD>
// @return uint32 ʵ<>ʶ<EFBFBD>ȡ<EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD>
// Sample usage:
//-------------------------------------------------------------------------------------------------------------------
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len)
{
uint32 data_len = len;
fifo_read_buffer(&bluetooth_ch9141_fifo, buff, &data_len, FIFO_READ_AND_CLEAN);
return data_len;
}

View File

@@ -31,63 +31,58 @@
#include "common.h"
#define BLUETOOTH_CH9141_UART UART_2 //<2F><><EFBFBD><EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> <20><>ʹ<EFBFBD>õ<EFBFBD><C3B5>Ĵ<EFBFBD><C4B4><EFBFBD>
#define BLUETOOTH_CH9141_UART_TX UART2_TX_P10_5 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D16<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_RX UART2_RX_P10_6 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>TX<EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Ƭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>D17<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_UART_BAUD 115200
#define BLUETOOTH_CH9141_RTS_PIN P10_2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD> ָʾ<D6B8><CABE>ǰģ<C7B0><C4A3><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 0<><30><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1<><31><EFBFBD><EFBFBD><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef struct
{
uint8 *buffer; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><EFBFBD>
uint32 head; // <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷָ<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>յĻ<EFBFBD><EFBFBD><EFBFBD>
uint32 end; // <20><><EFBFBD><EFBFBD>βָ<CEB2><D6B8> <20><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>ǿջ<C7BF><D5BB><EFBFBD><E6A3A8><EFBFBD><EFBFBD>ȫ<EFBFBD>ճ<EFBFBD><D5B3>
uint32 size; // <20><><EFBFBD><EFBFBD>ʣ<EFBFBD><CAA3><EFBFBD><EFBFBD>С
uint32 max; // <20><><EFBFBD><EFBFBD><EFBFBD>ܴ<EFBFBD>С
}fifo_struct;
typedef enum
{
TX_POWER_0DB = 0, //0DB
TX_POWER_1DB, //1DB
TX_POWER_2DB, //2DB
TX_POWER_3DB, //3DB
TX_POWER_4DB, //4DB
TX_POWER_MINUS_8DB, //-8DB
TX_POWER_MINUS_14DB,//-14DB
TX_POWER_MINUS_20DB,//-20DB
}CH9141_TX_POWEER_enum;
FIFO_SUCCESS,
FIFO_BUFFER_NULL,
FIFO_SPACE_NO_ENOUGH,
FIFO_DATA_NO_ENOUGH,
}fifo_state_enum;
typedef enum
{
MASTER_NO_INIT = 0, //<2F><><EFBFBD><EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
MASTER_SCANNING, //<2F><><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8><EFBFBD><EFBFBD>
MASTER_CONNECTING, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_CONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MASTER_DISCONNECTED, //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӶϿ<D3B6>
SLAVE_NO_INIT, //<2F>ӻ<EFBFBD>δ<EFBFBD><CEB4>ʼ<EFBFBD><CABC>
SLAVE_OK_INIT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ɳ<EFBFBD>ʼ<EFBFBD><CABC>
SLAVE_BROADCAST, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><E3B2A5>
SLAVE_BROADCAST_READY, //<2F>ӻ<EFBFBD>׼<EFBFBD><D7BC><EFBFBD>
SLAVE_CONNECT_TIMEOUT, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ
SLAVE_CONNECTED, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
SLAVE_ERROR, //<2F>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4><EFBFBD>
}CH9141_STATUS_enum;
FIFO_READ_AND_CLEAN,
FIFO_READ_ONLY,
}fifo_operation_enum;
typedef enum
{
BROADCAST_MODE = 0, //<2F>㲥ģʽ
MASTER_MODE, //<2F><><EFBFBD><EFBFBD>ģʽ
SLAVE_MODE, //<2F>ӻ<EFBFBD>ģʽ
}CH9141_MODE_enum;
fifo_state_enum fifo_init (fifo_struct *fifo, uint8 *buffer_addr, uint32 size);
void fifo_head_offset (fifo_struct *fifo, uint32 offset);
void fifo_end_offset (fifo_struct *fifo, uint32 offset);
void fifo_clear (fifo_struct *fifo);
uint32 fifo_used (fifo_struct *fifo);
extern uint8 uart_flag;
extern uint8 uart_data;
extern uint8 mac_address[17]; //<2F><><EFBFBD><EFBFBD>mac<61><63>ַ
fifo_state_enum fifo_read_buffer (fifo_struct *fifo, uint8 *dat, uint32 *length, fifo_operation_enum flag);
fifo_state_enum fifo_write_buffer (fifo_struct *fifo, uint8 *dat, uint32 length);
void bluetooth_ch9141_uart_callback(void);
void bluetooth_ch9141_enter_at_mode(void);
void bluetooth_ch9141_exit_at_mode(void);
void bluetooth_ch9141_reset(void);
void bluetooth_ch9141_get_mac_address(void);
int16 bluetooth_ch9141_get_rssi(void);
uint32 bluetooth_ch9141_send_buff(uint8 *buff, uint32 len);
void bluetooth_ch9141_init(CH9141_MODE_enum mode, int8 *salve_mac_password);
#define BLUETOOTH_CH9141_INDEX UART_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ں<EFBFBD>
#define BLUETOOTH_CH9141_BUAD_RATE 115200 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧʹ<D3A6>õĴ<C3B5><C4B4>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_TX_PIN UART2_RX_P10_6 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> TX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> RX
#define BLUETOOTH_CH9141_RX_PIN UART2_TX_P10_5 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RX Ҫ<>ӵ<EFBFBD><D3B5><EFBFBD>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD> TX
#define BLUETOOTH_CH9141_RTS_PIN P10_2 // <20><><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3> 1 <20><>Ӧģ<D3A6><C4A3><EFBFBD><EFBFBD> RTS <20><><EFBFBD><EFBFBD>
#define BLUETOOTH_CH9141_BUFFER_SIZE 64
#define BLUETOOTH_CH9141_TIMEOUT_COUNT 500
void bluetooth_ch9141_uart_callback (void);
uint8 bluetooth_ch9141_init (void);
uint32 bluetooth_ch9141_send_buff (uint8 *buff, uint32 len);
uint32 bluetooth_ch9141_read_buff (uint8 *buff, uint32 len);

Some files were not shown because too many files have changed in this diff Show More