Files
TXH1.0/User/GPS/GPS.c
T
2026-04-27 16:55:02 +08:00

404 lines
15 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "config.h"
volatile u8 GPSConnectRXTask_Flag = 0;//GPSConnect接受任务标志位,1允许运行
volatile u8 GPSConnectTXTask_Flag = 0;//
volatile u8 GPSConnect_RX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 GPSConnect_TX_Buff[1000] = {0x01,0x03,0x00,0x02,0x00,0x09,0x00,0x00};;
volatile u8 GPSConnect_DMA_RX_Len = 23;
/*_____ D E F I N I T I O N __________________________________________________*/
u16 BigToLittle( u16 BigData)
{
return (BigData << 8 | BigData >> 8);
}
//u32 BigToLittle( u32 BigData)
//{
// union
// {
// u32 Temp;
// u8 Buff[4];
// }Dat;
//
// if(sizeof(BigData) == 2)
// return (BigData << 8 | BigData >> 8);
// else if(sizeof(BigData) == 4)
// {
// Dat.Buff[0] = (BigData >> 24) & 0xff;
// Dat.Buff[1] = (BigData >> 16) & 0xff;
// Dat.Buff[2] = (BigData >> 8) & 0xff;
// Dat.Buff[3] = (BigData >> 0) & 0xff;
// return (Dat.Temp);
// }
//}
/****************************************************
函数名:GPSConnect_IO_Configuration
功能 :GPSConnect卡通讯部分用到的IO初始化
参数 :无
返回值:无
****************************************************/
void GPSConnect_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GOIP配置结构体
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_USART6);
GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_USART6);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化
}
/****************************************************
函数名:GPSConnect_NVGPSConnect_Configuration
功能 :GPSConnect卡通讯部分用到的中断向量配置
参数 :无
返回值:无
****************************************************/
void GPSConnect_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream6_IRQn; //USART6_TX_DMA
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART6_IRQn; //USART??
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ????
NVIC_Init(&NVIC_InitStructure); //??NVIC_InitStruct???????????NVIC???USART1
}
/****************************************************
函数名:GPSConnect_NVGPSConnect_Configuration
功能 :GPSConnect卡通讯部分用到的串口配置
参数 :无
返回值:无
****************************************************/
void GPSConnect_USART_Configuration(u32 BaudRate)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART6, ENABLE);
USART_InitStructure.USART_BaudRate =BaudRate;// Baud;//?????
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
USART_Init(USART6, &USART_InitStructure);
USART_Cmd(USART6, ENABLE);
USART_ITConfig(USART6, USART_IT_IDLE, ENABLE);
USART_ClearFlag(USART6, USART_FLAG_IDLE);
USART_DMACmd(USART6, USART_DMAReq_Tx | USART_DMAReq_Rx,ENABLE);
}
/*************************************************
函数名 DMA_Configuration()
功能 DMA初始化
传入参数:无
返回值 :无
**************************************************/
void GPSConnect_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
/*******************发送TX1*********************/
DMA_DeInit(DMA2_Stream6);
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
//DMA_InitStructure.DMA_BufferSize = UART_DMA_SEND_LEN;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
//DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)MD_Connect_TX_Buff[0];
DMA_Init(DMA2_Stream6, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream6, DMA_IT_TC, ENABLE);
/*******************RX*********************/
DMA_DeInit(DMA2_Stream1);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 1000;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART6->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_5;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)GPSConnect_RX_Buff;
DMA_Init(DMA2_Stream1, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream1, ENABLE);
}
//F*****************************************************************************
//* NAME: GPSConnect_TXDataCheck
//* PURPOSE: GPSConnect卡键盘通信校验函数
//* PARAMS: pData需要检验的数组地址,len数据长度
//* return: 无
//******************************************************************************
u8 GPSConnect_TXDataCheck(volatile u8* pData, u8 len)
{
u8 result;
if(len == 0) len = 16;
result = *pData++;
do
{
result ^= *pData++;
}while(--len);
return result & 0x7f;
}
void GPSConnect_DMATX_IRQHandler(void)
{
u16 i = 0;
DMA_ClearFlag(DMA2_Stream6, DMA_IT_TCIF6);
GPSCount_TX_DMAStop(); //关闭DMA传输
while(! USART_GetFlagStatus(USART6, USART_FLAG_TC))NULL;
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
GPSCount_RX_DMAStart(); //打开DMA传输(Gas就收)长度在选择发送队列时设置
GPSConnectTXTask_Flag = 1;
}
//F*****************************************************************************
//* NAME: GPSConnect_DMARX_IRQHandler
//* PURPOSE: DMA传输完成中断,Gas ModBus
//* PARAMS: 无
//* return: 无
//******************************************************************************
void GPSConnect_DMARX_IRQHandler(void)
{
u8 i = 0;
u16 CRC_Temp = 0;
if(USART_GetITStatus(USART6, USART_IT_IDLE) != RESET)//?????????
{
USART_ClearFlag(USART6, USART_IT_IDLE);
GPSCount_RX_DMAStop(); //DMA接收
USART_ClearFlag(USART6, USART_IT_IDLE);
DMA_ClearFlag(DMA2_Stream1, DMA_IT_TCIF1);
i = USART6->SR;
i = USART6->DR;
GPSCount_RX_DMALenSet(1000);//重置接受长度
GPSCount_RX_DMAStart();
GPSConnectRXTask_Flag = 1;
}
}
void StringToHex(u8 *Str,u8 *H,u8 Len)
{
u8 i = 0;
for(i = 0;i < Len;i += 2)
{
if(*(Str + i) > 0x39)
*(H + (i / 2)) = (*(Str + i) - 0x37) << 4;
else
*(H + (i / 2)) = (*(Str + i) - 0x30) << 4;
if(*(Str + i + 1) > 0x39)
*(H + (i / 2)) |= (*(Str + i + 1) - 0x37) & 0x0f;
else
*(H + (i / 2)) |= (*(Str + i + 1) - 0x30) & 0x0f;
}
}
u16 mystrstr(u8 *s1,u8 *s2)
{
int len2;
u16 i= 0;
if(!(len2=strlen(s2)))//此种情况下s2不能指向空,否则strlen无法测出长度,这条语句错误
return 1;
for(;*s1;++s1)
{
i ++;
if(*s1==*s2 && strncmp(s1,s2,len2)==0)
return i;
}
return NULL;
}
//F*****************************************************************************
//* NAME: GPSConnect_Init
//* PURPOSE: GPSConnect通讯初始化
//* PARAMS: 无
//* return: 无
//******************************************************************************
char Bluetooth_AT_UART[]="AT+UART=9600\r\n ";
char Bluetooth_AT_NAME[]="AT+NAME=TXH_V1.1.2_0000\r\n ";
char Print_Language[]={0x1b,0x74,0x23};
void GPSConnect_Init(void)
{
u8 i = 0;
GPSConnect_IO_Configuration(); //流量计相关IO初始化
GPSConnect_USART_Configuration(115200); //相关串口初始化
GPSConnect_DMA_Configuration(); //流量计相关DMA初始化
GPSConnect_NVIC_Configuration(); //流量计相关中断初始化
TXHData.GPSDataTimer.Init = 0; //清除初始化标志
TXHData.GPSDataTimer.Flag = 0; //清除到时标志
TXHData.GPSDataTimer.ON_OFF = 1; //打开
TXHData.GPSDataTimer.Cycle = 1; //设置为循环模式,发送时启动
TXHData.GPSDataTimer.TimerCountMax = 10*1000;//10S
GPSCount_TX_DMAAddrSet((u32)Print_Language);
GPSCount_TX_DMALenSet(3);
GPSCount_TX_DMAStart();
// while(!GPSConnectTXTask_Flag);
// delay_ms(500);
// GPSConnect_USART_Configuration(9600);
// for(i = 0;i < 10;i ++)
// Bluetooth_AT_NAME[8+i] = BoxVersion[i];
// for(i = 0;i < 4;i ++)
// Bluetooth_AT_NAME[19+i] = TXHData.POSData.WirelessData.IMEI[16+i];
// GPSCount_TX_DMAAddrSet((u32)Bluetooth_AT_NAME);
// GPSCount_TX_DMALenSet(25);
// GPSCount_TX_DMAStart();
}
void GPSConnectTast(void)
{
u16 i = 0,j = 0,k = 0;
u32 Temp = 0;
u8 Buff[20];
u16 POS_ConnectRX_Len=0;
u16 POS_ConnectRX_CMD = 0;
if(GPSConnectRXTask_Flag == 1)
{
GPSConnectRXTask_Flag = 0;
if(GPSConnect_RX_Buff[0] == 0xF5) // 判断接收缓冲区中的第一个字节是否为 0xF5
{
POS_ConnectRX_Len = (GPSConnect_RX_Buff[1] << 8) | GPSConnect_RX_Buff[2]; // 提取长度码
Temp = CRC_Check(&GPSConnect_RX_Buff[0] , POS_ConnectRX_Len); // 计算数据包 CRC 校验码
if(Temp == ((GPSConnect_RX_Buff[POS_ConnectRX_Len] << 8) | GPSConnect_RX_Buff[POS_ConnectRX_Len + 1])) // 判断 CRC 校验码是否正确
{
POS_ConnectRX_CMD = GPSConnect_RX_Buff[3]; // 提取命令字节
switch (POS_ConnectRX_CMD) // 根据命令字节进行不同的操作
{
case 0xF1: // 配置APN
{
for(i = 0;i < sizeof(TXHData.POSData.WirelessData.APN);i ++) // 将 APN 缓冲区清零
TXHData.POSData.WirelessData.APN[i] = 0;
for(i = 0;i < POS_ConnectRX_Len - 4;i ++) // 从接收缓冲区中提取 APN 数据
TXHData.POSData.WirelessData.APN[i] = GPSConnect_RX_Buff[4+i];
if(FMItemWrite(CF_POSData,0)) // 写入 APN 数据到 Flash 存储器中
{
POS_Network_APN_Set(); // 设置网络 APN 参数
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF1;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
case 0xF2: // 配置LORA子模块
{
TXHData.MD_LORA_Slave_Flag = 1;
TXHData.MD_LORA_SlaveTimer.ON_OFF = 1;
// delay_ms(200);
// MD_Port_LORASet(0);
// MD_Port_LORASet(1);
// MD_Port_LORASet(2);
// MD_Port_LORASet(3);
{
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF2;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
case 0xF3: // 配置LORA子模块
{
TXHData.MD_LORA_Slave_Flag = 0;
TXHData.MD_LORA_SlaveTimer.Init = 1;
{
GPSConnect_TX_Buff[0] = 0xF5; // 将发送缓冲区初始化
GPSConnect_TX_Buff[1] = 0x00;
GPSConnect_TX_Buff[2] = 0x05;
GPSConnect_TX_Buff[3] = 0xF3;
GPSConnect_TX_Buff[4] = 0x59;
Temp = CRC_Check(&GPSConnect_TX_Buff[0] , 5); // 计算发送数据包的 CRC 校验码
GPSConnect_TX_Buff[5] = (Temp >> 8) & 0xff; // 将 CRC 校验码写入发送缓冲区
GPSConnect_TX_Buff[6] = Temp & 0xff;
GPSCount_TX_DMAAddrSet((u32)GPSConnect_TX_Buff); // 设置发送 DMA 的地址和长度
GPSCount_TX_DMALenSet(7);
GPSCount_TX_DMAStart(); // 启动 DMA 发送数据
}
}break;
}
}
}
else if(GPSConnect_RX_Buff[25] == 'O' && GPSConnect_RX_Buff[26] == 'K') // 判断接收缓冲区中“OK\r\n”判断是不是蓝牙设置回复
{
TXHData.USART6_Drive = Bluetooth;
}
else
{
Temp = mystrstr(GPSConnect_RX_Buff,"RMC");
if(Temp)
TXHData.USART6_Drive = GPS;
if(GPSConnect_RX_Buff[Temp + 14] == 'A')//则提取经度和纬度信息
{
for(k = 0;k < 9;k ++)// 提取经度类型信息,保存到TXHData结构体中
Buff[k] = GPSConnect_RX_Buff[Temp + 16 + k];
TXHData.GPSData.GPS.Longitude = (float)atof(Buff) / 100;
TXHData.GPSData.GPS.LongitudeType = GPSConnect_RX_Buff[Temp + 26];
for(k = 0;k < 9;k ++)// 提取维度类型信息,保存到TXHData结构体中
Buff[k] = GPSConnect_RX_Buff[Temp + 28 + k];
TXHData.GPSData.GPS.Latitude = (float)atof(Buff) / 100;
TXHData.GPSData.GPS.LatitudeType = GPSConnect_RX_Buff[Temp + 39];
}
else if(GPSConnect_RX_Buff[Temp + 14] == 'V')// 如果第15个字符是'V',则经纬度信息无效,置为0
{
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
TXHData.GPSData.GPS.Latitude = 0;
TXHData.GPSData.GPS.LatitudeType = 0;
}
}
}
}